SetupWizard: Part 1: Initial wizard manager conversion

Part 1 implements SetupWizard support if GMS is present.

Change-Id: I0d465a9d84f0c477acc8309511894e9b194762f7
This commit is contained in:
cretin45
2016-04-20 16:21:05 -07:00
parent 167ac2cad8
commit 3593f035fc
26 changed files with 1742 additions and 1295 deletions

View File

@@ -24,6 +24,7 @@ LOCAL_JAVA_LIBRARIES := \
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_AAPT_FLAGS := --auto-add-overlay
include frameworks/opt/setupwizard/navigationbar/common.mk
include frameworks/opt/setupwizard/library/common.mk include frameworks/opt/setupwizard/library/common.mk
include $(BUILD_PACKAGE) include $(BUILD_PACKAGE)

View File

@@ -43,8 +43,6 @@
<uses-permission android:name="android.permission.BACKUP" /> <uses-permission android:name="android.permission.BACKUP" />
<uses-permission android:name="cyanogenmod.permission.FINISH_SETUP" /> <uses-permission android:name="cyanogenmod.permission.FINISH_SETUP" />
<uses-permission android:name="cyanogenmod.permission.LEGALESE" /> <uses-permission android:name="cyanogenmod.permission.LEGALESE" />
<uses-permission android:name="com.cyngn.stats.SEND_ANALYTICS" />
<uses-permission android:name="com.cyanogen.permission.REQUEST_KILL_SWITCH_OP" />
<uses-permission android:name="cyanogenmod.permission.WRITE_SETTINGS"/> <uses-permission android:name="cyanogenmod.permission.WRITE_SETTINGS"/>
<uses-permission android:name="cyanogenmod.permission.WRITE_SECURE_SETTINGS"/> <uses-permission android:name="cyanogenmod.permission.WRITE_SECURE_SETTINGS"/>
@@ -60,8 +58,6 @@
<protected-broadcast android:name="com.cyanogenmod.setupwizard.SETUP_FINISHED" <protected-broadcast android:name="com.cyanogenmod.setupwizard.SETUP_FINISHED"
android:permission="cyanogenmod.permission.FINISH_SETUP"/> android:permission="cyanogenmod.permission.FINISH_SETUP"/>
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
<application android:label="@string/app_name" <application android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:theme="@style/Theme.Setup" android:theme="@style/Theme.Setup"
@@ -77,20 +73,67 @@
android:immersive="true" android:immersive="true"
android:windowSoftInputMode="stateAlwaysHidden"> android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter android:priority="9"> <!-- <intent-filter android:priority="9">
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD" /> <action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD" />
<category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter> -->
</activity>
<activity android:name=".ui.WelcomeActivity"
android:label="@string/product_name"
android:excludeFromRecents="true"
android:configChanges="mcc|mnc"
android:immersive="true"
android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action android:name="com.cyanogenmod.setupwizard.LINEAGE_WELCOME" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<receiver android:name=".setup.FinishSetupReceiver" <activity android:name=".ui.LocaleActivity"
android:exported="true"> android:label="@string/product_name"
android:excludeFromRecents="true"
android:configChanges="mcc|mnc"
android:immersive="true"
android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter> <intent-filter>
<action android:name="com.cyanogenmod.setupwizard.ACTION_FINISH_SETUPWIZARD" /> <action android:name="com.cyanogenmod.setupwizard.LINEAGE_LOCALE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ui.LineageSettingsActivity"
android:label="@string/product_name"
android:excludeFromRecents="true"
android:configChanges="mcc|mnc"
android:immersive="true"
android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action android:name="com.cyanogenmod.setupwizard.LINEAGE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ui.FinishActivity"
android:label="@string/product_name"
android:excludeFromRecents="true"
android:configChanges="mcc|mnc"
android:immersive="true"
android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action android:name="com.cyanogenmod.setupwizard.LINEAGE_SETUP_COMPLETE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<receiver android:name=".PartnerReceiver">
<intent-filter>
<action android:name="com.android.setupwizard.action.PARTNER_CUSTOMIZATION" />
</intent-filter> </intent-filter>
</receiver> </receiver>
</application> </application>

View File

@@ -17,6 +17,6 @@
<translate xmlns:android="http://schemas.android.com/apk/res/android" <translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300" android:duration="300"
android:fromXDelta="0%" android:fromXDelta="100%"
android:toXDelta="-100%" android:toXDelta="0%"
android:interpolator="@android:anim/decelerate_interpolator" /> android:interpolator="@android:anim/decelerate_interpolator" />

View File

@@ -17,6 +17,6 @@
<translate xmlns:android="http://schemas.android.com/apk/res/android" <translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300" android:duration="300"
android:fromXDelta="-100%" android:fromXDelta="0%"
android:toXDelta="0%" android:toXDelta="100%"
android:interpolator="@android:anim/decelerate_interpolator" /> android:interpolator="@android:anim/decelerate_interpolator" />

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 The CyanogenMod Project
Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.ui.widget.ScrimInsetsFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
app:insetForeground="@android:color/transparent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/primary">
<Space android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"/>
<ImageView
android:id="@+id/brand_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:padding="@dimen/content_margin_left"/>
<Space android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"/>
<fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar"
android:id="@+id/navigation_bar"
style="@style/setup_wizard_navbar_style" />
</LinearLayout>
<ImageView android:id="@+id/reveal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/reveal"
android:visibility="invisible"/>
<ProgressBar
android:id="@+id/finishing_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="8dp"
android:layout_gravity="bottom"
android:visibility="gone"/>
</com.cyanogenmod.setupwizard.ui.widget.ScrimInsetsFrameLayout>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 The CyanogenMod 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.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/primary">
<ImageView
android:id="@+id/brand_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/logo"
android:paddingLeft="@dimen/header_logo_margin_left"
android:paddingBottom="@dimen/header_logo_margin_bottom"/>
</RelativeLayout>

View File

@@ -0,0 +1,204 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 The CyanogenMod Project
Copyright (C) 2017 The LineageOS 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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/primary">
<include layout="@layout/header_condensed" />
<FrameLayout android:id="@+id/page"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ScrollView 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="match_parent">
<!-- The caption about privacy policy -->
<TextView
android:id="@+id/privacy_policy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_marginBottom="@dimen/summary_margin_bottom"
android:paddingLeft="@dimen/content_margin_left"
android:paddingRight="@dimen/content_margin_right"
style="@style/PageSummaryText"
android:text="@string/services_explanation"
android:clickable="true"/>
<!-- Whether or not to enable metrics -->
<LinearLayout
android:id="@+id/metrics"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/location_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/enable_metrics_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="5dp"
android:duplicateParentState="true"
android:clickable="false"/>
<TextView
android:id="@+id/enable_metrics_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
android:lineSpacingExtra="@dimen/setup_line_spacing"
android:gravity="top"
android:layout_marginLeft="@dimen/location_text_margin_left"
android:layout_marginRight="@dimen/location_text_margin_right"
android:paddingBottom="@dimen/content_margin_bottom"
android:text="@string/services_metrics_label"/>
</LinearLayout>
<!-- Whether or not to enable default theme -->
<LinearLayout
android:id="@+id/theme"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/location_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/enable_theme_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="5dp"
android:duplicateParentState="true"
android:clickable="false"/>
<TextView
android:id="@+id/enable_theme_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
android:lineSpacingExtra="@dimen/setup_line_spacing"
android:gravity="top"
android:layout_marginLeft="@dimen/location_text_margin_left"
android:layout_marginRight="@dimen/location_text_margin_right"
android:paddingBottom="@dimen/content_margin_bottom"
android:text="@string/services_metrics_label"/>
</LinearLayout>
<!-- Checkbox for using on-screen nav keys -->
<LinearLayout
android:id="@+id/nav_keys"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/location_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/nav_keys_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="5dp"
android:duplicateParentState="true"
android:clickable="false" />
<TextView
android:id="@+id/nav_keys_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
android:lineSpacingExtra="@dimen/setup_line_spacing"
android:gravity="top"
android:layout_marginLeft="@dimen/location_text_margin_left"
android:layout_marginRight="@dimen/location_text_margin_right"
android:paddingBottom="@dimen/content_margin_bottom"
android:text="@string/services_os_nav_keys_label"/>
</LinearLayout>
<LinearLayout
android:id="@+id/privacy_guard"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/location_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/privacy_guard_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="5dp"
android:duplicateParentState="true"
android:clickable="false" />
<TextView
android:id="@+id/privacy_guard_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
android:lineSpacingExtra="@dimen/setup_line_spacing"
android:gravity="top"
android:layout_marginLeft="@dimen/location_text_margin_left"
android:layout_marginRight="@dimen/location_text_margin_right"
android:paddingBottom="@dimen/content_margin_bottom"
android:text="@string/services_os_privacy_guard"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
</FrameLayout>
<fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar"
android:id="@+id/navigation_bar"
style="@style/setup_wizard_navbar_style" />
</LinearLayout>

View File

@@ -15,21 +15,21 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/primary">
<include layout="@layout/header_condensed" /> <include layout="@layout/header_condensed" />
<RelativeLayout android:id="@+id/page" <RelativeLayout android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="0dp"
android:layout_height="0dp" android:layout_weight="1"
android:layout_weight="1" android:gravity="center"
android:gravity="center" android:paddingLeft="@dimen/content_margin_left"
android:paddingLeft="@dimen/content_margin_left" android:paddingRight="@dimen/content_margin_left">
android:paddingRight="@dimen/content_margin_left"
style="@style/PageContent">
<com.cyanogenmod.setupwizard.ui.LocalePicker <com.cyanogenmod.setupwizard.ui.LocalePicker
android:id="@+id/locale_list" android:id="@+id/locale_list"
@@ -41,4 +41,10 @@
android:layout_centerHorizontal="true"/> android:layout_centerHorizontal="true"/>
</RelativeLayout> </RelativeLayout>
<fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar"
android:id="@+id/navigation_bar"
style="@style/setup_wizard_navbar_style" />
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 The CyanogenMod Project
Copyright (C) 2017 The LineageOS 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:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/primary">
<Space android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"/>
<ImageView
android:id="@+id/brand_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:padding="@dimen/content_margin_left"/>
<Space android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"/>
<fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar"
android:id="@+id/navigation_bar"
style="@style/setup_wizard_navbar_style" />
</LinearLayout>

84
res/raw/wizard_script.xml Executable file
View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) 2014 Google Inc.
Copyright (C) 2017 The LineageOS 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.
-->
<!--
The wizard:uris recorded here have the inconvenience of being generated by hand, but they allow
for the full spread of launch flags (we need FLAG_ACTIVITY_NEW_TASK [0x10000000]), where the
<intent> tag processed by Intent.parseIntent() does not.
adb shell am to-intent-uri -a com.android.setupwizard.WELCOME -f 0x10000000 \-\-ez firstRun true
-->
<WizardScript wizard:firstAction="oem_pre_setup"
xmlns:wizard="http://schemas.android.com/apk/res/com.google.android.setupwizard">
<!-- Preliminary setup for OEMs -->
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.OEM_PRE_SETUP;end" id="oem_pre_setup">
<result wizard:action="welcome" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.cyanogenmod.setupwizard.LINEAGE_WELCOME;end" id="welcome">
<result wizard:action="locale" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.cyanogenmod.setupwizard.LINEAGE_LOCALE;end" id="locale">
<result wizard:action="sim_missing" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_qr_provision_flow" id="qr_provision_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.SIM_MISSING;end" id="sim_missing">
<result wizard:action="carrier_setup" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.CARRIER_SETUP;end" id="carrier_setup">
<result wizard:action="background_activation" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.BACKGROUND_ACTIVATION;end" id="background_activation">
<result wizard:action="sim_setup" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.SIM_SETUP;end" id="sim_setup">
<result wizard:action="flow_choice" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.FLOW_CHOICE;end" id="flow_choice">
<result wizard:resultCode="-1" wizard:action="restore_choice" wizard:name="ok" />
<result wizard:resultCode="1" wizard:action="setup_as_new_flow" wizard:name="skip" />
<result wizard:action="restore_with_account_flow" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.RESTORE_CHOICE;end" id="restore_choice">
<result wizard:resultCode="101" wizard:action="restore_with_device_flow" wizard:name="d2d" />
<result wizard:resultCode="102" wizard:action="restore_with_ios_flow" wizard:name="ios_restore" />
<result wizard:action="restore_with_account_flow" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_restore_with_account_flow" id="restore_with_account_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_restore_with_device_flow" id="restore_with_device_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_restore_with_ios_flow" id="restore_with_ios_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_setup_as_new_flow" id="setup_as_new_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.cyanogenmod.setupwizard.LINEAGE_SETTINGS;end" id="oem_post_setup">
<result wizard:action="finish" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.cyanogenmod.setupwizard.LINEAGE_SETUP_COMPLETE;end" id="finish">
<result wizard:action="exit" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.EXIT;end" id="exit" />
</WizardScript>

81
res/raw/wizard_script_user.xml Executable file
View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) 2014 Google Inc.
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.
-->
<!--
The wizard:uris recorded here have the inconvenience of being generated by hand, but they allow
for the full spread of launch flags (we need FLAG_ACTIVITY_NEW_TASK [0x10000000]), where the
<intent> tag processed by Intent.parseIntent() does not.
adb shell am to-intent-uri -a com.android.setupwizard.WELCOME -f 0x10000000 \-\-ez firstRun true
-->
<WizardScript wizard:firstAction="oem_pre_setup"
xmlns:wizard="http://schemas.android.com/apk/res/com.google.android.setupwizard">
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.OEM_PRE_SETUP;end" id="oem_pre_setup">
<result wizard:action="welcome" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.cyanogenmod.setupwizard.LINEAGE_WELCOME;end" id="welcome">
<result wizard:action="secondary_user_warning" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.USER_WARNING;end" id="secondary_user_warning">
<result wizard:resultCode="111" wizard:action="oem_post_setup" wizard:name="dpm_user_complete" />
<result wizard:action="network_settings" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.NETWORK_SETTINGS;end" id="network_settings">
<result wizard:resultCode="101" wizard:action="wifi_settings" wizard:name="see_all_wifi" />
<result wizard:resultCode="1" wizard:action="no_account_flow" wizard:name="skip" />
<result wizard:action="captive_portal" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.WIFI_SETTINGS;end" id="wifi_settings">
<result wizard:action="captive_portal" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.CAPTIVE_PORTAL;end" id="captive_portal">
<result wizard:action="gms_checkin" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.google.android.setupwizard.GMS_CHECKIN;end" id="gms_checkin">
<result wizard:action="load_account_intent" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.google.android.setupwizard.LOAD_ADD_ACCOUNT_INTENT;end" id="load_account_intent">
<result wizard:action="account_setup" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.google.android.setupwizard.ACCOUNT_SETUP;end" id="account_setup">
<result wizard:resultCode="1" wizard:action="no_account_flow" wizard:name="skip" />
<result wizard:resultCode="111" wizard:action="oem_post_setup" wizard:name="dpm_user_complete" />
<result wizard:action="gms_account_checkin" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.google.android.setupwizard.GMS_ACCOUNT_CHECKIN;end" id="gms_account_checkin">
<result wizard:resultCode="1" wizard:action="mfm_check" wizard:name="skip" />
<result wizard:action="start_vpa" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.google.android.setupwizard.START_VPA;end" id="start_vpa">
<result wizard:action="mfm_check" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.google.android.setupwizard.ACCOUNT_CHECK;end" id="mfm_check">
<result wizard:resultCode="1" wizard:action="no_account_flow" wizard:name="skip" />
<result wizard:action="account_flow" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_user_account_flow" id="account_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:script="android.resource://com.google.android.setupwizard/xml/wizard_script_user_no_account_flow" id="no_account_flow">
<result wizard:action="oem_post_setup" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.cyanogenmod.setupwizard.LINEAGE_SETUP_COMPLETE;end" id="oem_post_setup">
<result wizard:action="exit" />
</WizardAction>
<WizardAction wizard:uri="intent:#Intent;action=com.android.setupwizard.EXIT;end" id="exit" />
</WizardScript>

View File

@@ -21,6 +21,11 @@
<string name="os_name" translatable="false">LineageOS</string> <string name="os_name" translatable="false">LineageOS</string>
<string name="default_theme_name" translatable="false">Material</string> <string name="default_theme_name" translatable="false">Material</string>
<!-- Partner SUW Strings -->
<string name="theme_type" translatable="false">material_light</string>
<string name="wizard_script_uri" translatable="false">android.resource://com.cyanogenmod.setupwizard/raw/wizard_script</string>
<string name="wizard_script_user_uri" translatable="false">android.resource://com.cyanogenmod.setupwizard/raw/wizard_script_user</string>
<string name="next">Next</string> <string name="next">Next</string>
<string name="skip">Skip</string> <string name="skip">Skip</string>
<string name="start">Start</string> <string name="start">Start</string>

View File

@@ -0,0 +1,29 @@
package com.cyanogenmod.setupwizard;
/*
* Copyright (C) 2016 The CyanogenMod 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.
*/
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class PartnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Do nothing
}
}

View File

@@ -18,16 +18,13 @@ package com.cyanogenmod.setupwizard;
import android.app.Application; import android.app.Application;
import android.app.StatusBarManager;
import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.provider.Settings; import android.provider.Settings;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils; import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import cyanogenmod.providers.CMSettings;
public class SetupWizardApp extends Application { public class SetupWizardApp extends Application {
public static final String TAG = SetupWizardApp.class.getSimpleName(); public static final String TAG = SetupWizardApp.class.getSimpleName();
@@ -36,11 +33,7 @@ public class SetupWizardApp extends Application {
public static final String ACTION_FINISHED = "com.cyanogenmod.setupwizard.SETUP_FINISHED"; public static final String ACTION_FINISHED = "com.cyanogenmod.setupwizard.SETUP_FINISHED";
public static final String ACCOUNT_TYPE_CYANOGEN = "com.cyanogen";
public static final String ACCOUNT_TYPE_GMS = "com.google";
public static final String ACTION_SETUP_WIFI = "com.android.net.wifi.SETUP_WIFI_NETWORK"; public static final String ACTION_SETUP_WIFI = "com.android.net.wifi.SETUP_WIFI_NETWORK";
public static final String ACTION_VIEW_LEGAL = "cyanogenmod.intent.action.LEGALESE";
public static final String ACTION_SETUP_FINGERPRINT = "android.settings.FINGERPRINT_SETUP"; public static final String ACTION_SETUP_FINGERPRINT = "android.settings.FINGERPRINT_SETUP";
public static final String ACTION_SETUP_LOCKSCREEN = "com.android.settings.SETUP_LOCK_SCREEN"; public static final String ACTION_SETUP_LOCKSCREEN = "com.android.settings.SETUP_LOCK_SCREEN";
@@ -48,19 +41,18 @@ public class SetupWizardApp extends Application {
public static final String EXTRA_FIRST_RUN = "firstRun"; public static final String EXTRA_FIRST_RUN = "firstRun";
public static final String EXTRA_ALLOW_SKIP = "allowSkip"; public static final String EXTRA_ALLOW_SKIP = "allowSkip";
public static final String EXTRA_AUTO_FINISH = "wifi_auto_finish_on_connect"; public static final String EXTRA_AUTO_FINISH = "wifi_auto_finish_on_connect";
public static final String EXTRA_SHOW_BUTTON_BAR = "extra_prefs_show_button_bar";
public static final String EXTRA_USE_IMMERSIVE = "useImmersiveMode"; public static final String EXTRA_USE_IMMERSIVE = "useImmersiveMode";
public static final String EXTRA_THEME = "theme"; public static final String EXTRA_THEME = "theme";
public static final String EXTRA_MATERIAL_LIGHT = "material_light"; public static final String EXTRA_MATERIAL_LIGHT = "material_light";
public static final String EXTRA_CKSOP = "cksOp";
public static final String EXTRA_LOGIN_FOR_KILL_SWITCH = "authCks";
public static final String EXTRA_TITLE = "title"; public static final String EXTRA_TITLE = "title";
public static final String EXTRA_DETAILS = "details"; public static final String EXTRA_DETAILS = "details";
public static final String EXTRA_FRAGMENT = "fragment";
public static final String EXTRA_ACTION_ID = "actionId";
public static final String EXTRA_SUPRESS_D2D_SETUP = "suppress_device_to_device_setup";
public static final String KEY_DETECT_CAPTIVE_PORTAL = "captive_portal_detection_enabled"; public static final String KEY_DETECT_CAPTIVE_PORTAL = "captive_portal_detection_enabled";
public static final String KEY_SEND_METRICS = "send_metrics";
public static final String DISABLE_NAV_KEYS = "disable_nav_keys";
public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme";
public static final String KEY_BUTTON_BACKLIGHT = "pre_navbar_button_backlight";
public static final String KEY_PRIVACY_GUARD = "privacy_guard_default";
private static final String[] THEME_PACKAGES = { private static final String[] THEME_PACKAGES = {
"org.cyanogenmod.theme.chooser", "org.cyanogenmod.theme.chooser",
@@ -70,24 +62,19 @@ public class SetupWizardApp extends Application {
}; };
public static final int REQUEST_CODE_SETUP_WIFI = 0; public static final int REQUEST_CODE_SETUP_WIFI = 0;
public static final int REQUEST_CODE_SETUP_GMS= 1;
public static final int REQUEST_CODE_RESTORE_GMS= 2;
public static final int REQUEST_CODE_SETUP_CYANOGEN= 3;
public static final int REQUEST_CODE_SETUP_CAPTIVE_PORTAL= 4; public static final int REQUEST_CODE_SETUP_CAPTIVE_PORTAL= 4;
public static final int REQUEST_CODE_SETUP_BLUETOOTH= 5; public static final int REQUEST_CODE_SETUP_BLUETOOTH= 5;
public static final int REQUEST_CODE_UNLOCK = 6; public static final int REQUEST_CODE_UNLOCK = 6;
public static final int REQUEST_CODE_SETUP_FINGERPRINT = 7; public static final int REQUEST_CODE_SETUP_FINGERPRINT = 7;
public static final int REQUEST_CODE_VENDOR_SETUP_GMS = 8;
public static final int REQUEST_CODE_SETUP_LOCKSCREEN = 9; public static final int REQUEST_CODE_SETUP_LOCKSCREEN = 9;
public static final int RADIO_READY_TIMEOUT = 10 * 1000; public static final int RADIO_READY_TIMEOUT = 10 * 1000;
private boolean mIsRadioReady = false; private boolean mIsRadioReady = false;
private boolean mIsAuthorized = false; private boolean mIsAuthorized = false;
private boolean mIgnoreSimLocale = false;
private StatusBarManager mStatusBarManager; private final Bundle mSettingsBundle = new Bundle();
private final Handler mHandler = new Handler(); private final Handler mHandler = new Handler();
private final Runnable mRadioTimeoutRunnable = new Runnable() { private final Runnable mRadioTimeoutRunnable = new Runnable() {
@@ -100,35 +87,16 @@ public class SetupWizardApp extends Application {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE); final boolean isOwner = SetupWizardUtils.isOwner();
try { if (!isOwner) {
// Since this is a new component, we need to disable here if the user Thread t = new Thread(){
// has already been through setup on a previous version. @Override
final boolean isOwner = SetupWizardUtils.isOwner(); public void run() {
if (!isOwner disableThemeComponentsForSecondaryUser();
|| Settings.Secure.getInt(getContentResolver(), }
Settings.Secure.USER_SETUP_COMPLETE) == 1) { };
Thread t = new Thread(){ t.run();
@Override } else {
public void run() {
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 1);
CMSettings.Secure.putInt(getContentResolver(),
CMSettings.Secure.CM_SETUP_WIZARD_COMPLETED, 1);
SetupWizardUtils.disableGMSSetupWizard(SetupWizardApp.this);
SetupWizardUtils.disableSetupWizard(SetupWizardApp.this);
if (!isOwner) {
disableThemeComponentsForSecondaryUser();
}
}
};
t.run();
} else {
disableCaptivePortalDetection();
}
} catch (Settings.SettingNotFoundException e) {
// Continue with setup
disableCaptivePortalDetection(); disableCaptivePortalDetection();
} }
mHandler.postDelayed(mRadioTimeoutRunnable, SetupWizardApp.RADIO_READY_TIMEOUT); mHandler.postDelayed(mRadioTimeoutRunnable, SetupWizardApp.RADIO_READY_TIMEOUT);
@@ -153,18 +121,16 @@ public class SetupWizardApp extends Application {
mIsAuthorized = isAuthorized; mIsAuthorized = isAuthorized;
} }
public void disableStatusBar() { public boolean ignoreSimLocale() {
mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND | return mIgnoreSimLocale;
StatusBarManager.DISABLE_NOTIFICATION_ALERTS |
StatusBarManager.DISABLE_NOTIFICATION_ICONS |
StatusBarManager.DISABLE_NOTIFICATION_TICKER |
StatusBarManager.DISABLE_RECENT |
StatusBarManager.DISABLE_HOME |
StatusBarManager.DISABLE_SEARCH);
} }
public void enableStatusBar() { public void setIgnoreSimLocale(boolean ignoreSimLocale) {
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE); mIgnoreSimLocale = ignoreSimLocale;
}
public Bundle getSettingsBundle() {
return mSettingsBundle;
} }
public void disableCaptivePortalDetection() { public void disableCaptivePortalDetection() {

View File

@@ -20,13 +20,12 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.os.SystemProperties;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log; import android.util.Log;
import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyIntents;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils; import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import org.cyanogenmod.internal.util.PackageManagerUtils; import org.cyanogenmod.internal.util.PackageManagerUtils;
@@ -53,7 +52,6 @@ public class CMSetupWizardData extends AbstractSetupData {
pages.add(new BluetoothSetupPage(mContext, this)); pages.add(new BluetoothSetupPage(mContext, this));
} }
pages.add(new WelcomePage(mContext, this)); pages.add(new WelcomePage(mContext, this));
pages.add(new LocalePage(mContext, this));
pages.add(new DateTimePage(mContext, this)); pages.add(new DateTimePage(mContext, this));
if (SetupWizardUtils.hasWifi(mContext)) { if (SetupWizardUtils.hasWifi(mContext)) {
pages.add(new WifiSetupPage(mContext, this)); pages.add(new WifiSetupPage(mContext, this));
@@ -80,7 +78,6 @@ public class CMSetupWizardData extends AbstractSetupData {
pages.add(new FingerprintSetupPage(mContext, this)); pages.add(new FingerprintSetupPage(mContext, this));
} }
pages.add(new ScreenLockSetupPage(mContext, this)); pages.add(new ScreenLockSetupPage(mContext, this));
pages.add(new CyanogenSettingsPage(mContext, this));
pages.add(new FinishPage(mContext, this)); pages.add(new FinishPage(mContext, this));
return new PageList(pages.toArray(new SetupPage[pages.size()])); return new PageList(pages.toArray(new SetupPage[pages.size()]));
} }
@@ -92,7 +89,6 @@ public class CMSetupWizardData extends AbstractSetupData {
showHideDataSimPage(); showHideDataSimPage();
showHideSimMissingPage(); showHideSimMissingPage();
showHideMobileDataPage(); showHideMobileDataPage();
updateLocalePage();
} else if (intent.getAction() } else if (intent.getAction()
.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { .equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
showHideMobileDataPage(); showHideMobileDataPage();
@@ -149,13 +145,6 @@ public class CMSetupWizardData extends AbstractSetupData {
} }
} }
private void updateLocalePage() {
LocalePage localePage = (LocalePage) getPage(LocalePage.TAG);
if (localePage != null) {
localePage.simChanged();
}
}
public IntentFilter getIntentFilter() { public IntentFilter getIntentFilter() {
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
if (SetupWizardUtils.hasTelephony(mContext)) { if (SetupWizardUtils.hasTelephony(mContext)) {

View File

@@ -1,399 +0,0 @@
/*
* Copyright (C) 2013 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.setup;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.ThemeConfig;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.IWindowManager;
import android.view.View;
import android.view.WindowManagerGlobal;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.cmstats.SetupStats;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import cyanogenmod.hardware.CMHardwareManager;
import cyanogenmod.providers.CMSettings;
import cyanogenmod.themes.ThemeManager;
public class CyanogenSettingsPage extends SetupPage {
public static final String TAG = "CyanogenSettingsPage";
public static final String KEY_SEND_METRICS = "send_metrics";
public static final String DISABLE_NAV_KEYS = "disable_nav_keys";
public static final String KEY_APPLY_DEFAULT_THEME = "apply_default_theme";
public static final String KEY_BUTTON_BACKLIGHT = "pre_navbar_button_backlight";
public static final String KEY_PRIVACY_GUARD = "privacy_guard_default";
public static final String PRIVACY_POLICY_URI = "http://lineageos.org/legal";
public CyanogenSettingsPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment(FragmentManager fragmentManager, int action) {
Fragment fragment = fragmentManager.findFragmentByTag(getKey());
if (fragment == null) {
Bundle args = new Bundle();
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
args.putInt(Page.KEY_PAGE_ACTION, action);
fragment = new CyanogenSettingsFragment();
fragment.setArguments(args);
}
return fragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_services;
}
@Override
public int getIconResId() {
return R.drawable.ic_features;
}
private static void writeDisableNavkeysOption(Context context, boolean enabled) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
CMSettings.Global.putInt(context.getContentResolver(),
CMSettings.Global.DEV_FORCE_SHOW_NAVBAR, enabled ? 1 : 0);
CMHardwareManager hardware = CMHardwareManager.getInstance(context);
hardware.set(CMHardwareManager.FEATURE_KEY_DISABLE, enabled);
/* Save/restore button timeouts to disable them in softkey mode */
if (enabled) {
CMSettings.Secure.putInt(context.getContentResolver(),
CMSettings.Secure.BUTTON_BRIGHTNESS, 0);
} else {
int currentBrightness = CMSettings.Secure.getInt(context.getContentResolver(),
CMSettings.Secure.BUTTON_BRIGHTNESS, 100);
int oldBright = prefs.getInt(KEY_BUTTON_BACKLIGHT,
currentBrightness);
CMSettings.Secure.putInt(context.getContentResolver(),
CMSettings.Secure.BUTTON_BRIGHTNESS, oldBright);
}
}
@Override
public void onFinishSetup() {
getCallbacks().addFinishRunnable(new Runnable() {
@Override
public void run() {
if (getData().containsKey(DISABLE_NAV_KEYS)) {
SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED,
SetupStats.Action.ENABLE_NAV_KEYS,
SetupStats.Label.CHECKED,
String.valueOf(getData().getBoolean(DISABLE_NAV_KEYS)));
writeDisableNavkeysOption(mContext, getData().getBoolean(DISABLE_NAV_KEYS));
}
}
});
handleEnableMetrics();
handleDefaultThemeSetup();
handlePrivacyGuard();
}
private void handleEnableMetrics() {
Bundle privacyData = getData();
if (privacyData != null
&& privacyData.containsKey(KEY_SEND_METRICS)) {
CMSettings.Secure.putInt(mContext.getContentResolver(),
CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS)
? 1 : 0);
}
}
private void handleDefaultThemeSetup() {
Bundle privacyData = getData();
if (!SetupWizardUtils.getDefaultThemePackageName(mContext).equals(
ThemeConfig.SYSTEM_DEFAULT) && privacyData != null &&
privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) {
SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED,
SetupStats.Action.APPLY_CUSTOM_THEME,
SetupStats.Label.CHECKED,
String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)));
Log.i(TAG, "Applying default theme");
final ThemeManager tm = ThemeManager.getInstance(mContext);
tm.applyDefaultTheme();
} else {
getCallbacks().finishSetup();
}
}
private void handlePrivacyGuard() {
Bundle mPrivacyData = getData();
if (mPrivacyData != null && mPrivacyData.containsKey(KEY_PRIVACY_GUARD)) {
CMSettings.Secure.putInt(mContext.getContentResolver(),
CMSettings.Secure.PRIVACY_GUARD_DEFAULT,
mPrivacyData.getBoolean(KEY_PRIVACY_GUARD) ? 1 : 0);
}
}
private static boolean hideKeyDisabler(Context ctx) {
final CMHardwareManager hardware = CMHardwareManager.getInstance(ctx);
return !hardware.isSupported(CMHardwareManager.FEATURE_KEY_DISABLE);
}
private static boolean isKeyDisablerActive(Context ctx) {
final CMHardwareManager hardware = CMHardwareManager.getInstance(ctx);
return hardware.get(CMHardwareManager.FEATURE_KEY_DISABLE);
}
private static boolean hideThemeSwitch(Context context) {
return SetupWizardUtils.getDefaultThemePackageName(context)
.equals(ThemeConfig.SYSTEM_DEFAULT);
}
public static class CyanogenSettingsFragment extends SetupPageFragment {
private View mKillSwitchView;
private TextView mKillSwitchTitle;
private ImageView mKillSwitchStatus;
private View mMetricsRow;
private View mDefaultThemeRow;
private View mNavKeysRow;
private View mPrivacyGuardRow;
private CheckBox mMetrics;
private CheckBox mDefaultTheme;
private CheckBox mNavKeys;
private CheckBox mPrivacyGuard;
private boolean mHideNavKeysRow = false;
private boolean mHideThemeRow = false;
private View.OnClickListener mMetricsClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mMetrics.isChecked();
mMetrics.setChecked(checked);
mPage.getData().putBoolean(KEY_SEND_METRICS, checked);
}
};
private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mDefaultTheme.isChecked();
mDefaultTheme.setChecked(checked);
mPage.getData().putBoolean(KEY_APPLY_DEFAULT_THEME, checked);
}
};
private View.OnClickListener mNavKeysClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mNavKeys.isChecked();
mNavKeys.setChecked(checked);
mPage.getData().putBoolean(DISABLE_NAV_KEYS, checked);
}
};
private View.OnClickListener mPrivacyGuardClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mPrivacyGuard.isChecked();
mPrivacyGuard.setChecked(checked);
mPage.getData().putBoolean(KEY_PRIVACY_GUARD, checked);
}
};
@Override
protected void initializePage() {
String privacy_policy = getString(R.string.services_privacy_policy);
String policySummary = getString(R.string.services_explanation, privacy_policy);
SpannableString ss = new SpannableString(policySummary);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
// At this point of the setup, the device has already been unlocked (if frp
// had been enabled), so there should be no issues regarding security
final Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(PRIVACY_POLICY_URI));
try {
getActivity().startActivity(intent);
} catch (Exception e) {
Log.e(TAG, "Unable to start activity " + intent.toString(), e);
}
}
};
ss.setSpan(clickableSpan,
policySummary.length() - privacy_policy.length() - 1,
policySummary.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView privacyPolicy = (TextView) mRootView.findViewById(R.id.privacy_policy);
privacyPolicy.setMovementMethod(LinkMovementMethod.getInstance());
privacyPolicy.setText(ss);
mKillSwitchView = mRootView.findViewById(R.id.killswitch);
mKillSwitchTitle = (TextView)mRootView.findViewById(R.id.killswitch_title);
mKillSwitchStatus = (ImageView)mRootView.findViewById(R.id.killswitch_check);
if (hideKillSwitch()) {
mKillSwitchView.setVisibility(View.GONE);
} else {
if (SetupWizardUtils.isDeviceLocked()) {
mKillSwitchTitle.setEnabled(true);
mKillSwitchStatus.setImageResource(R.drawable.tick);
} else {
mKillSwitchTitle.setEnabled(false);
mKillSwitchStatus.setImageResource(R.drawable.cross);
}
}
mMetricsRow = mRootView.findViewById(R.id.metrics);
mMetricsRow.setOnClickListener(mMetricsClickListener);
String metricsHelpImproveCM =
getString(R.string.services_help_improve_cm, getString(R.string.os_name));
String metricsSummary = getString(R.string.services_metrics_label,
metricsHelpImproveCM, getString(R.string.os_name));
final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary);
metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView metrics = (TextView) mRootView.findViewById(R.id.enable_metrics_summary);
metrics.setText(metricsSpan);
mMetrics = (CheckBox) mRootView.findViewById(R.id.enable_metrics_checkbox);
mDefaultThemeRow = mRootView.findViewById(R.id.theme);
mHideThemeRow = hideThemeSwitch(getActivity());
if (mHideThemeRow) {
mDefaultThemeRow.setVisibility(View.GONE);
} else {
mDefaultThemeRow.setOnClickListener(mDefaultThemeClickListener);
String defaultTheme =
getString(R.string.services_apply_theme,
getString(R.string.default_theme_name));
String defaultThemeSummary = getString(R.string.services_apply_theme_label,
defaultTheme);
final SpannableStringBuilder themeSpan =
new SpannableStringBuilder(defaultThemeSummary);
themeSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
0, defaultTheme.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView theme = (TextView) mRootView.findViewById(R.id.enable_theme_summary);
theme.setText(themeSpan);
mDefaultTheme = (CheckBox) mRootView.findViewById(R.id.enable_theme_checkbox);
}
mNavKeysRow = mRootView.findViewById(R.id.nav_keys);
mNavKeysRow.setOnClickListener(mNavKeysClickListener);
mNavKeys = (CheckBox) mRootView.findViewById(R.id.nav_keys_checkbox);
boolean needsNavBar = true;
try {
IWindowManager windowManager = WindowManagerGlobal.getWindowManagerService();
needsNavBar = windowManager.needsNavigationBar();
} catch (RemoteException e) {
}
mHideNavKeysRow = hideKeyDisabler(getActivity());
if (mHideNavKeysRow || needsNavBar) {
mNavKeysRow.setVisibility(View.GONE);
} else {
boolean navKeysDisabled =
isKeyDisablerActive(getActivity());
mNavKeys.setChecked(navKeysDisabled);
}
mPrivacyGuardRow = mRootView.findViewById(R.id.privacy_guard);
mPrivacyGuardRow.setOnClickListener(mPrivacyGuardClickListener);
mPrivacyGuard = (CheckBox) mRootView.findViewById(R.id.privacy_guard_checkbox);
mPrivacyGuard.setChecked(CMSettings.Secure.getInt(getActivity().getContentResolver(),
CMSettings.Secure.PRIVACY_GUARD_DEFAULT, 0) == 1);
}
@Override
protected int getLayoutResource() {
return R.layout.setup_cyanogen_services;
}
@Override
public void onResume() {
super.onResume();
updateDisableNavkeysOption();
updateMetricsOption();
updateThemeOption();
}
private void updateMetricsOption() {
final Bundle myPageBundle = mPage.getData();
boolean metricsChecked =
!myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle
.getBoolean(KEY_SEND_METRICS);
mMetrics.setChecked(metricsChecked);
myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked);
}
private void updateThemeOption() {
if (!mHideThemeRow) {
final Bundle myPageBundle = mPage.getData();
boolean themesChecked;
if (myPageBundle.containsKey(KEY_APPLY_DEFAULT_THEME)) {
themesChecked = myPageBundle.getBoolean(KEY_APPLY_DEFAULT_THEME);
} else {
themesChecked = getActivity().getResources().getBoolean(
R.bool.check_custom_theme_by_default);
}
mDefaultTheme.setChecked(themesChecked);
myPageBundle.putBoolean(KEY_APPLY_DEFAULT_THEME, themesChecked);
}
}
private void updateDisableNavkeysOption() {
if (!mHideNavKeysRow) {
final Bundle myPageBundle = mPage.getData();
boolean enabled = CMSettings.Secure.getInt(getActivity().getContentResolver(),
CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, 0) != 0;
boolean checked = myPageBundle.containsKey(DISABLE_NAV_KEYS) ?
myPageBundle.getBoolean(DISABLE_NAV_KEYS) :
enabled;
mNavKeys.setChecked(checked);
myPageBundle.putBoolean(DISABLE_NAV_KEYS, checked);
}
}
private static boolean hideKillSwitch() {
return !SetupWizardUtils.hasKillSwitch();
}
}
}

View File

@@ -1,31 +0,0 @@
package com.cyanogenmod.setupwizard.setup;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
public class FinishSetupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (SetupWizardUtils.isDeviceLocked() || SetupWizardUtils.frpEnabled(context)) {
return;
}
Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(context.getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 1);
((StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE)).disable(
StatusBarManager.DISABLE_NONE);
Settings.Global.putInt(context.getContentResolver(),
SetupWizardApp.KEY_DETECT_CAPTIVE_PORTAL, 1);
cyanogenmod.providers.CMSettings.Secure.putInt(context.getContentResolver(),
cyanogenmod.providers.CMSettings.Secure.CM_SETUP_WIZARD_COMPLETED, 1);
SetupWizardUtils.disableGMSSetupWizard(context);
SetupWizardUtils.disableSetupWizard(context);
}
}

View File

@@ -1,343 +0,0 @@
/*
* Copyright (C) 2013 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.setup;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.app.Activity;
import android.app.ActivityOptions;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.service.persistentdata.PersistentDataBlockManager;
import android.util.Log;
import com.android.setupwizardlib.util.ResultCodes;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.cmstats.SetupStats;
import com.cyanogenmod.setupwizard.ui.LoadingFragment;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import java.io.IOException;
public class GmsAccountPage extends SetupPage {
public static final String TAG = "GmsAccountPage";
public static final String ACTION_RESTORE = "com.google.android.setupwizard.RESTORE";
public static final String ACTION_PROGRESS = "com.google.android.setupwizard.PROGRESS";
public static final String ACTION_VENDOR_SETUP = "com.google.android.setupwizard.VENDOR_SETUP";
public static final String RESTORE_ACTION_ID = "mfm_restore_start";
public static final String RESTORE_CHECK_ID = "restore_check";
public static final String FRAGMENT_START_RESTORE =
"com.google.android.setupwizard.account.StartRestoreFragment";
public static final String FRAGMENT_CHECK_RESTORE =
"com.google.android.setupwizard.account.CheckRestoreTokenFragment";
public static final String EXTRA_AUTH_ACCOUNT = "authAccount";
public static final String EXTRA_RESTORE_ACCOUNT = "restoreAccount";
public static final String EXTRA_RESTORE_TOKEN = "restoreToken";
private static final String RESTORE_WIZARD_SCRIPT =
"android.resource://com.google.android.setupwizard/xml/wizard_script";
private Fragment mFragment;
public GmsAccountPage(final Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment(FragmentManager fragmentManager, int action) {
mFragment = fragmentManager.findFragmentByTag(getKey());
if (mFragment == null) {
Bundle args = new Bundle();
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
args.putInt(Page.KEY_PAGE_ACTION, action);
mFragment = new LoadingFragment();
mFragment.setArguments(args);
}
return mFragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.loading;
}
@Override
public int getIconResId() {
return -1;
}
@Override
public int getNextButtonTitleResId() {
return R.string.skip;
}
@Override
public void doLoadAction(FragmentManager fragmentManager, int action) {
if (action == Page.ACTION_PREVIOUS) {
getCallbacks().onPreviousPage();
} else {
super.doLoadAction(fragmentManager, action);
if (!SetupWizardUtils.isNetworkConnected(mContext) && !SetupWizardUtils.frpEnabled(mContext)) {
if (SetupWizardApp.DEBUG) {
Log.d(TAG, "No network, no FRP enforcement, skip GMS account");
}
getCallbacks().onNextPage();
} else if (!SetupWizardUtils.accountExists(mContext, SetupWizardApp.ACCOUNT_TYPE_GMS)) {
launchGmsAccountSetup();
} else {
// This can happen if the user goes from setup -> restore, but chooses to set
// their device up as "new". Thus we need to not re-prompt this entire flow,
// skip ahead. CYNGNOS-2459
if (SetupWizardApp.DEBUG) {
Log.d(TAG, "Google account already setup, skip gms setup");
}
setHidden(true);
getCallbacks().onNextPage();
}
}
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (SetupWizardApp.DEBUG) {
Log.d(TAG, "Received activity result from requestCode " + requestCode
+ " with a resultCode of " + resultCode);
if (data != null) {
Bundle extras = data.getExtras();
Log.d(TAG, "Within the activity result there were extras:");
for (String extra : extras.keySet()) {
Log.d(TAG, "The key " + extra + " has a value of " + extras.get(extra));
}
}
}
if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS &&
resultCode == ResultCodes.RESULT_SKIP) {
launchGmsVendorSetup();
} else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS && data != null) {
if (SetupWizardUtils.isOwner() && resultCode == Activity.RESULT_OK) {
// If we don't have a restore token and a restore account, then we need to
// prompt with the restore picker from googles setup wizard so the user
// can select what device they would like to restore from. Otherwise,
// we're coming from a Tap&Go scenario and we should just restore.
boolean restorePicker = !data.hasExtra(EXTRA_RESTORE_TOKEN)
&& !data.hasExtra(EXTRA_RESTORE_ACCOUNT) &&
data.hasExtra(EXTRA_AUTH_ACCOUNT);
SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD,
SetupStats.Action.EXTERNAL_PAGE_RESULT,
SetupStats.Label.GMS_ACCOUNT, "success");
launchGmsRestorePage(restorePicker);
} else {
handleResult(requestCode, resultCode);
}
} else {
if (requestCode == SetupWizardApp.REQUEST_CODE_RESTORE_GMS) {
setHidden(true);
}
handleResult(requestCode, resultCode);
}
return true;
}
@Override
public boolean doNextAction() {
final boolean canSkip = canSkip();
// return true to force this page to handle the next action.
return !canSkip;
}
@Override
public void onFinishSetup() {
}
private void handleResult(int requestCode, int resultCode) {
if (resultCode == Activity.RESULT_CANCELED) {
SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD,
SetupStats.Action.EXTERNAL_PAGE_RESULT,
requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ?
SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled");
getCallbacks().onPreviousPage();
} else {
if (resultCode == Activity.RESULT_OK) {
SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD,
SetupStats.Action.EXTERNAL_PAGE_RESULT,
requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ?
SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success");
getCallbacks().onNextPage();
} else {
if (canSkip()) {
SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD,
SetupStats.Action.EXTERNAL_PAGE_RESULT,
requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ?
SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped");
getCallbacks().onNextPage();
} else {
getCallbacks().onPreviousPage();
}
}
if (SetupWizardUtils.accountExists(mContext, SetupWizardApp.ACCOUNT_TYPE_GMS)) {
setHidden(true);
}
}
}
private void launchGmsRestorePage(boolean restorePicker) {
if (SetupWizardApp.DEBUG) {
Log.d(TAG, "Launching gms restore page with restorePicker " + restorePicker);
}
try {
// GMS can disable this after logging in sometimes
if (SetupWizardUtils.enableGMSSetupWizard(mContext)) {
Intent intent = new Intent(ACTION_PROGRESS);
if (!restorePicker) {
intent.setAction(ACTION_PROGRESS);
intent.putExtra(SetupWizardApp.EXTRA_FRAGMENT, FRAGMENT_START_RESTORE);
intent.putExtra(SetupWizardApp.EXTRA_ACTION_ID, RESTORE_ACTION_ID);
} else {
intent.setAction(ACTION_PROGRESS);
intent.putExtra(SetupWizardApp.EXTRA_ACTION_ID, RESTORE_CHECK_ID);
intent.putExtra(SetupWizardApp.EXTRA_FRAGMENT, FRAGMENT_CHECK_RESTORE);
}
intent.putExtra(SetupWizardApp.EXTRA_ALLOW_SKIP, true);
intent.putExtra(SetupWizardApp.EXTRA_USE_IMMERSIVE, true);
intent.putExtra(SetupWizardApp.EXTRA_FIRST_RUN, true);
intent.putExtra(SetupWizardApp.EXTRA_THEME, SetupWizardApp.EXTRA_MATERIAL_LIGHT);
// XXX: Fool G's setup wizard into thinking it is their setup wizard.
// This is necessary to get the material theme on the restore page.
intent.putExtra("scriptUri", RESTORE_WIZARD_SCRIPT);
ActivityOptions options =
ActivityOptions.makeCustomAnimation(mContext,
android.R.anim.fade_in,
android.R.anim.fade_out);
SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD,
SetupStats.Action.EXTERNAL_PAGE_LAUNCH,
SetupStats.Label.PAGE, SetupStats.Label.RESTORE);
mFragment.startActivityForResult(
intent,
SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle());
return;
}
} catch (Exception e) {
e.printStackTrace();
// XXX: In open source, we don't know what gms version a user has.
// Bail if the restore activity is not found.
getCallbacks().onNextPage();
}
}
private void launchGmsVendorSetup() {
if (SetupWizardApp.DEBUG) {
Log.d(TAG, "Launching gms vendor setup page");
}
try {
Intent intent = new Intent(ACTION_VENDOR_SETUP);
intent.setPackage(SetupWizardUtils.GOOGLE_SETUPWIZARD_PACKAGE);
intent.putExtra(SetupWizardApp.EXTRA_ALLOW_SKIP, true);
intent.putExtra(SetupWizardApp.EXTRA_USE_IMMERSIVE, true);
intent.putExtra(SetupWizardApp.EXTRA_FIRST_RUN, true);
intent.putExtra(SetupWizardApp.EXTRA_THEME, SetupWizardApp.EXTRA_MATERIAL_LIGHT);
ActivityOptions options =
ActivityOptions.makeCustomAnimation(mContext,
android.R.anim.fade_in,
android.R.anim.fade_out);
mFragment.startActivityForResult(
intent,
SetupWizardApp.REQUEST_CODE_VENDOR_SETUP_GMS, options.toBundle());
return;
} catch (Exception e) {
// Move on if the vendor setup activity is not found.
getCallbacks().onNextPage();
}
}
public boolean canSkip() {
final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
return pdbManager == null
|| pdbManager.getDataBlockSize() == 0
|| pdbManager.getOemUnlockEnabled();
}
private void launchGmsAccountSetup() {
if (SetupWizardApp.DEBUG) {
Log.d(TAG, "Launching gms account page");
}
Bundle bundle = new Bundle();
bundle.putBoolean(SetupWizardApp.EXTRA_FIRST_RUN, true);
bundle.putBoolean(SetupWizardApp.EXTRA_ALLOW_SKIP, true);
bundle.putBoolean(SetupWizardApp.EXTRA_USE_IMMERSIVE, true);
bundle.putBoolean(SetupWizardApp.EXTRA_SUPRESS_D2D_SETUP, true);
AccountManager
.get(mContext).addAccount(SetupWizardApp.ACCOUNT_TYPE_GMS, null, null,
bundle, null, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
boolean error = false;
try {
Bundle result = future.getResult();
Intent intent = result
.getParcelable(AccountManager.KEY_INTENT);
ActivityOptions options =
ActivityOptions.makeCustomAnimation(mContext,
android.R.anim.fade_in,
android.R.anim.fade_out);
SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD,
SetupStats.Action.EXTERNAL_PAGE_LAUNCH,
SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT);
mFragment.startActivityForResult(intent,
SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle());
} catch (OperationCanceledException e) {
error = true;
} catch (IOException e) {
error = true;
} catch (AuthenticatorException e) {
Log.e(TAG, "Error launching gms account", e);
error = true;
} finally {
if (error && getCallbacks().
isCurrentPage(GmsAccountPage.this)) {
if (canSkip()) {
getCallbacks().onNextPage();
} else {
getCallbacks().onPreviousPage();
}
}
}
}
}, null);
}
}

View File

@@ -1,348 +0,0 @@
/*
* Copyright (C) 2013 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.setup;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.app.ActivityOptions;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.NumberPicker;
import android.widget.Toast;
import com.android.internal.telephony.MccTable;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.cmstats.SetupStats;
import com.cyanogenmod.setupwizard.ui.LocalePicker;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import java.util.List;
import java.util.Locale;
public class LocalePage extends SetupPage {
public static final String TAG = "LocalePage";
private LocaleFragment mLocaleFragment;
public LocalePage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment(FragmentManager fragmentManager, int action) {
mLocaleFragment = (LocaleFragment)fragmentManager.findFragmentByTag(getKey());
if (mLocaleFragment == null) {
Bundle args = new Bundle();
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
args.putInt(Page.KEY_PAGE_ACTION, action);
mLocaleFragment = new LocaleFragment();
mLocaleFragment.setArguments(args);
}
return mLocaleFragment;
}
@Override
public int getTitleResId() {
return R.string.setup_locale;
}
@Override
public int getIconResId() {
return R.drawable.ic_locale;
}
@Override
public boolean doNextAction() {
if (isLocked()) {
confirmCyanogenCredentials(mLocaleFragment);
return true;
} else {
if (mLocaleFragment != null) {
mLocaleFragment.sendLocaleStats();
}
return super.doNextAction();
}
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SetupWizardApp.REQUEST_CODE_UNLOCK) {
if (resultCode == Activity.RESULT_OK) {
((SetupWizardApp) mContext.getApplicationContext()).setIsAuthorized(true);
getCallbacks().onNextPage();
return true;
}
}
return false;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getNextButtonTitleResId() {
if (isLocked()) {
return R.string.setup_unlock;
} else {
return R.string.next;
}
}
private void confirmCyanogenCredentials(final Fragment fragment) {
AccountManager accountManager = AccountManager.get(mContext);
accountManager.editProperties(SetupWizardApp.ACCOUNT_TYPE_CYANOGEN, null,
new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> f) {
try {
Bundle b = f.getResult();
Intent i = b.getParcelable(AccountManager.KEY_INTENT);
i.putExtra(SetupWizardApp.EXTRA_FIRST_RUN, true);
i.putExtra(SetupWizardApp.EXTRA_SHOW_BUTTON_BAR, true);
i.putExtra(SetupWizardApp.EXTRA_USE_IMMERSIVE, true);
i.putExtra(SetupWizardApp.EXTRA_LOGIN_FOR_KILL_SWITCH, true);
fragment.startActivityForResult(i,
SetupWizardApp.REQUEST_CODE_UNLOCK);
} catch (Throwable t) {
Log.e(getKey(), "confirmCredentials failed", t);
}
}
}, null);
}
private boolean isLocked() {
boolean isAuthorized = ((SetupWizardApp) mContext.getApplicationContext()).isAuthorized();
if (SetupWizardUtils.isDeviceLocked()) {
return !isAuthorized;
}
return false;
}
public void simChanged() {
if (mLocaleFragment != null) {
mLocaleFragment.fetchAndUpdateSimLocale();
}
}
public static class LocaleFragment extends SetupPageFragment {
private ArrayAdapter<com.android.internal.app.LocalePicker.LocaleInfo> mLocaleAdapter;
private Locale mInitialLocale;
private Locale mCurrentLocale;
private int[] mAdapterIndices;
private boolean mIgnoreSimLocale;
private LocalePicker mLanguagePicker;
private FetchUpdateSimLocaleTask mFetchUpdateSimLocaleTask;
private final Handler mHandler = new Handler();
private boolean mPendingLocaleUpdate;
private boolean mPaused = true;
private final Runnable mUpdateLocale = new Runnable() {
public void run() {
if (mCurrentLocale != null) {
mLanguagePicker.setEnabled(false);
com.android.internal.app.LocalePicker.updateLocale(mCurrentLocale);
}
}
};
@Override
protected void initializePage() {
mLanguagePicker = (LocalePicker) mRootView.findViewById(R.id.locale_list);
loadLanguages();
}
private void loadLanguages() {
mLocaleAdapter = com.android.internal.app.LocalePicker.constructAdapter(getActivity(),
R.layout.locale_picker_item, R.id.locale);
mCurrentLocale = mInitialLocale = Locale.getDefault();
fetchAndUpdateSimLocale();
mAdapterIndices = new int[mLocaleAdapter.getCount()];
int currentLocaleIndex = 0;
String [] labels = new String[mLocaleAdapter.getCount()];
for (int i=0; i<mAdapterIndices.length; i++) {
com.android.internal.app.LocalePicker.LocaleInfo localLocaleInfo =
mLocaleAdapter.getItem(i);
Locale localLocale = localLocaleInfo.getLocale();
if (localLocale.equals(mCurrentLocale)) {
currentLocaleIndex = i;
}
mAdapterIndices[i] = i;
labels[i] = localLocaleInfo.getLabel();
}
mLanguagePicker.setDisplayedValues(labels);
mLanguagePicker.setMaxValue(labels.length - 1);
mLanguagePicker.setValue(currentLocaleIndex);
mLanguagePicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
mLanguagePicker.setOnValueChangedListener(new LocalePicker.OnValueChangeListener() {
public void onValueChange(LocalePicker picker, int oldVal, int newVal) {
setLocaleFromPicker();
}
});
mLanguagePicker.setOnScrollListener(new LocalePicker.OnScrollListener() {
@Override
public void onScrollStateChange(LocalePicker view, int scrollState) {
if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
mIgnoreSimLocale = true;
}
}
});
}
private void setLocaleFromPicker() {
mIgnoreSimLocale = true;
int i = mAdapterIndices[mLanguagePicker.getValue()];
final com.android.internal.app.LocalePicker.LocaleInfo localLocaleInfo = mLocaleAdapter.getItem(i);
onLocaleChanged(localLocaleInfo.getLocale());
}
private void onLocaleChanged(Locale paramLocale) {
mLanguagePicker.setEnabled(true);
Resources localResources = getActivity().getResources();
Configuration localConfiguration1 = localResources.getConfiguration();
Configuration localConfiguration2 = new Configuration();
localConfiguration2.locale = paramLocale;
localResources.updateConfiguration(localConfiguration2, null);
localResources.updateConfiguration(localConfiguration1, null);
mHandler.removeCallbacks(mUpdateLocale);
mCurrentLocale = paramLocale;
mHandler.postDelayed(mUpdateLocale, 1000);
}
@Override
protected int getLayoutResource() {
return R.layout.setup_locale;
}
public void sendLocaleStats() {
if (!mCurrentLocale.equals(mInitialLocale)) {
SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED,
SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE,
mCurrentLocale.getDisplayName());
}
}
public void fetchAndUpdateSimLocale() {
if (mIgnoreSimLocale || isDetached()) {
return;
}
if (mPaused) {
mPendingLocaleUpdate = true;
return;
}
if (mFetchUpdateSimLocaleTask != null) {
mFetchUpdateSimLocaleTask.cancel(true);
}
mFetchUpdateSimLocaleTask = new FetchUpdateSimLocaleTask();
mFetchUpdateSimLocaleTask.execute();
}
private class FetchUpdateSimLocaleTask extends AsyncTask<Void, Void, Locale> {
@Override
protected Locale doInBackground(Void... params) {
Locale locale = null;
Activity activity = getActivity();
if (activity != null) {
// If the sim is currently pin locked, return
TelephonyManager telephonyManager = (TelephonyManager)
activity.getSystemService(Context.TELEPHONY_SERVICE);
int state = telephonyManager.getSimState();
if(state == TelephonyManager.SIM_STATE_PIN_REQUIRED ||
state == TelephonyManager.SIM_STATE_PUK_REQUIRED) {
return null;
}
final SubscriptionManager subscriptionManager =
SubscriptionManager.from(activity);
List<SubscriptionInfo> activeSubs =
subscriptionManager.getActiveSubscriptionInfoList();
if (activeSubs == null || activeSubs.isEmpty()) {
return null;
}
// Fetch locale for active sim's MCC
int mcc = activeSubs.get(0).getMcc();
locale = MccTable.getLocaleFromMcc(activity, mcc, null);
// If that fails, fall back to preferred languages reported
// by the sim
if (locale == null) {
String localeString = telephonyManager.getLocaleFromDefaultSim();
if (localeString != null) {
locale = Locale.forLanguageTag(localeString);
}
}
}
return locale;
}
@Override
protected void onPostExecute(Locale simLocale) {
if (simLocale != null && !simLocale.equals(mCurrentLocale)) {
if (!mIgnoreSimLocale && !isDetached()) {
String label = getString(R.string.sim_locale_changed,
simLocale.getDisplayName());
Toast.makeText(getActivity(), label, Toast.LENGTH_SHORT).show();
onLocaleChanged(simLocale);
mIgnoreSimLocale = true;
}
}
}
}
@Override
public void onPause() {
super.onPause();
mPaused = true;
}
@Override
public void onResume() {
super.onResume();
mPaused = false;
if (mLanguagePicker != null) {
mLanguagePicker.setEnabled(true);
}
if (mPendingLocaleUpdate) {
mPendingLocaleUpdate = false;
fetchAndUpdateSimLocale();
}
}
}
}

View File

@@ -0,0 +1,117 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.ui;
import android.annotation.Nullable;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import com.android.setupwizard.navigationbar.SetupWizardNavBar;
import com.android.setupwizard.navigationbar.SetupWizardNavBar.NavigationBarListener;
import com.android.setupwizardlib.util.SystemBarHelper;
public abstract class BaseSetupWizardActivity extends Activity implements NavigationBarListener {
/* Logging */
public static final boolean LOGV = true;
public static final String TAG = BaseSetupWizardActivity.class.getSimpleName();
private SetupWizardNavBar mNavigationBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SystemBarHelper.hideSystemBars(getWindow());
}
@Override
public void onNavigationBarCreated(SetupWizardNavBar bar) {
mNavigationBar = bar;
bar.setUseImmersiveMode(true);
bar.getView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View view, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
view.requestApplyInsets();
}
});
}
protected void setBackDrawable(Drawable drawable) {
if (mNavigationBar != null) {
mNavigationBar.getBackButton().setCompoundDrawables(drawable, null, null, null);
}
}
protected void setNextDrawable(Drawable drawable) {
if (mNavigationBar != null) {
mNavigationBar.getBackButton().setCompoundDrawables(null, null, drawable, null);
}
}
protected void setBackAllowed(boolean allowed) {
// Enable / disable navigation bar back button
if (mNavigationBar != null) {
mNavigationBar.getBackButton().setEnabled(allowed);
}
}
protected void setNextAllowed(boolean allowed) {
if (mNavigationBar != null) {
mNavigationBar.getNextButton().setEnabled(allowed);
}
}
protected void setNextText(int resId) {
if (mNavigationBar != null) {
mNavigationBar.getNextButton().setText(resId);
}
}
protected void setBackText(int resId) {
if (mNavigationBar != null) {
mNavigationBar.getBackButton().setText(resId);
}
}
protected void hideNextButton() {
if (mNavigationBar != null) {
Animation fadeOut = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
final Button next = mNavigationBar.getNextButton();
next.startAnimation(fadeOut);
next.setVisibility(View.INVISIBLE);
}
}
protected void hideBackButton() {
if (mNavigationBar != null) {
Animation fadeOut = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
final Button back = mNavigationBar.getBackButton();
back.startAnimation(fadeOut);
back.setVisibility(View.INVISIBLE);
}
}
}

View File

@@ -0,0 +1,325 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.ui;
import static com.cyanogenmod.setupwizard.SetupWizardApp.DISABLE_NAV_KEYS;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_APPLY_DEFAULT_THEME;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_BUTTON_BACKLIGHT;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_PRIVACY_GUARD;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_SEND_METRICS;
import android.animation.Animator;
import android.app.Activity;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.ThemeConfig;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.android.setupwizardlib.util.WizardManagerHelper;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.cmstats.SetupStats;
import com.cyanogenmod.setupwizard.util.EnableAccessibilityController;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import cyanogenmod.hardware.CMHardwareManager;
import cyanogenmod.providers.CMSettings;
import cyanogenmod.themes.ThemeManager;
public class FinishActivity extends BaseSetupWizardActivity
implements ThemeManager.ThemeChangeListener {
public static final String TAG = FinishActivity.class.getSimpleName();
private ImageView mReveal;
private ProgressBar mFinishingProgressBar;
private EnableAccessibilityController mEnableAccessibilityController;
private SetupWizardApp mSetupWizardApp;
private final Handler mHandler = new Handler();
private volatile boolean mIsFinishing = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSetupWizardApp = (SetupWizardApp) getApplication();
setContentView(R.layout.finish_activity);
mReveal = (ImageView) findViewById(R.id.reveal);
mFinishingProgressBar = (ProgressBar)findViewById(R.id.finishing_bar);
mEnableAccessibilityController =
EnableAccessibilityController.getInstance(getApplicationContext());
setNextText(R.string.start);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.translucent_enter, R.anim.translucent_exit);
}
@Override
public void onNavigateBack() {
onBackPressed();
}
@Override
public void onNavigateNext() {
startFinishSequence();
}
private void finishSetup() {
if (!mIsFinishing) {
mSetupWizardApp.sendStickyBroadcastAsUser(
new Intent(SetupWizardApp.ACTION_FINISHED),
Binder.getCallingUserHandle());
mIsFinishing = true;
setupRevealImage();
}
}
private void startFinishSequence() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
hideBackButton();
hideNextButton();
mSetupWizardApp.enableCaptivePortalDetection();
Animation fadeIn = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
mFinishingProgressBar.setVisibility(View.VISIBLE);
mFinishingProgressBar.setIndeterminate(true);
mFinishingProgressBar.startAnimation(fadeIn);
final ThemeManager tm = ThemeManager.getInstance(this);
try {
tm.registerThemeChangeListener(this);
} catch (Exception e) {
Log.w(TAG, "ThemeChangeListener already registered");
}
handleDefaultThemeSetup(this);
}
@Override
public void onFinish(boolean isSuccess) {
if (isResumed()) {
mHandler.post(new Runnable() {
@Override
public void run() {
startFinishSequence();
}
});
}
}
@Override
public void onProgress(int progress) {
if (progress > 0) {
mFinishingProgressBar.setIndeterminate(false);
mFinishingProgressBar.setProgress(progress);
}
}
private void setupRevealImage() {
mFinishingProgressBar.setProgress(100);
Animation fadeOut = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
mFinishingProgressBar.startAnimation(fadeOut);
mFinishingProgressBar.setVisibility(View.INVISIBLE);
final Point p = new Point();
getWindowManager().getDefaultDisplay().getRealSize(p);
final WallpaperManager wallpaperManager =
WallpaperManager.getInstance(this);
wallpaperManager.forgetLoadedWallpaper();
final Bitmap wallpaper = wallpaperManager.getBitmap();
Bitmap cropped = null;
if (wallpaper != null) {
cropped = Bitmap.createBitmap(wallpaper, 0,
0, Math.min(p.x, wallpaper.getWidth()),
Math.min(p.y, wallpaper.getHeight()));
}
if (cropped != null) {
mReveal.setScaleType(ImageView.ScaleType.CENTER_CROP);
mReveal.setImageBitmap(cropped);
} else {
mReveal.setBackground(wallpaperManager
.getBuiltInDrawable(p.x, p.y, false, 0, 0));
}
animateOut();
}
private void animateOut() {
int cx = (mReveal.getLeft() + mReveal.getRight()) / 2;
int cy = (mReveal.getTop() + mReveal.getBottom()) / 2;
int finalRadius = Math.max(mReveal.getWidth(), mReveal.getHeight());
Animator anim =
ViewAnimationUtils.createCircularReveal(mReveal, cx, cy, 0, finalRadius);
anim.setDuration(900);
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
mReveal.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
mHandler.post(new Runnable() {
@Override
public void run() {
completeSetup();
}
});
}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
});
anim.start();
}
private void completeSetup() {
if (mEnableAccessibilityController != null) {
mEnableAccessibilityController.onDestroy();
}
new FinishTask(this).execute();
}
private static void handleEnableMetrics(SetupWizardApp setupWizardApp) {
Bundle privacyData = setupWizardApp.getSettingsBundle();
if (privacyData != null
&& privacyData.containsKey(KEY_SEND_METRICS)) {
CMSettings.Secure.putInt(setupWizardApp.getContentResolver(),
CMSettings.Secure.STATS_COLLECTION, privacyData.getBoolean(KEY_SEND_METRICS)
? 1 : 0);
}
}
private static void handleDefaultThemeSetup(FinishActivity finishActivity) {
Bundle privacyData = finishActivity.mSetupWizardApp.getSettingsBundle();
if (!SetupWizardUtils.getDefaultThemePackageName(finishActivity.mSetupWizardApp)
.equals(ThemeConfig.SYSTEM_DEFAULT) && privacyData != null &&
privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) {
Log.i(TAG, "Applying default theme");
final ThemeManager tm = ThemeManager.getInstance(finishActivity.mSetupWizardApp);
tm.applyDefaultTheme();
} else {
finishActivity.finishSetup();
}
}
private static void handlePrivacyGuard(SetupWizardApp setupWizardApp) {
Bundle mPrivacyData = setupWizardApp.getSettingsBundle();
if (mPrivacyData != null && mPrivacyData.containsKey(KEY_PRIVACY_GUARD)) {
CMSettings.Secure.putInt(setupWizardApp.getContentResolver(),
CMSettings.Secure.PRIVACY_GUARD_DEFAULT,
mPrivacyData.getBoolean(KEY_PRIVACY_GUARD) ? 1 : 0);
}
}
private static void handleNavKeys(SetupWizardApp setupWizardApp) {
if (setupWizardApp.getSettingsBundle().containsKey(DISABLE_NAV_KEYS)) {
SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED,
SetupStats.Action.ENABLE_NAV_KEYS,
SetupStats.Label.CHECKED,
String.valueOf(setupWizardApp.getSettingsBundle()
.getBoolean(DISABLE_NAV_KEYS)));
writeDisableNavkeysOption(setupWizardApp,
setupWizardApp.getSettingsBundle().getBoolean(DISABLE_NAV_KEYS));
}
}
private static void writeDisableNavkeysOption(Context context, boolean enabled) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
CMSettings.Global.putInt(context.getContentResolver(),
CMSettings.Global.DEV_FORCE_SHOW_NAVBAR, enabled ? 1 : 0);
CMHardwareManager hardware = CMHardwareManager.getInstance(context);
hardware.set(CMHardwareManager.FEATURE_KEY_DISABLE, enabled);
/* Save/restore button timeouts to disable them in softkey mode */
if (enabled) {
CMSettings.Secure.putInt(context.getContentResolver(),
CMSettings.Secure.BUTTON_BRIGHTNESS, 0);
} else {
int currentBrightness = CMSettings.Secure.getInt(context.getContentResolver(),
CMSettings.Secure.BUTTON_BRIGHTNESS, 100);
int oldBright = prefs.getInt(KEY_BUTTON_BACKLIGHT,
currentBrightness);
CMSettings.Secure.putInt(context.getContentResolver(),
CMSettings.Secure.BUTTON_BRIGHTNESS, oldBright);
}
}
private static class FinishTask extends AsyncTask<Void, Void, Boolean> {
private final FinishActivity mActivity;
public FinishTask(FinishActivity activity) {
mActivity = activity;
}
@Override
protected Boolean doInBackground(Void... params) {
SetupWizardApp app = (SetupWizardApp)mActivity.getApplication();
handlePrivacyGuard(app);
handleEnableMetrics(app);
handleNavKeys(app);
Settings.Global.putInt(mActivity.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(mActivity.getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 1);
CMSettings.Secure.putInt(mActivity.getContentResolver(),
CMSettings.Secure.CM_SETUP_WIZARD_COMPLETED, 1);
final ThemeManager tm = ThemeManager.getInstance(app);
tm.unregisterThemeChangeListener(mActivity);
final WallpaperManager wallpaperManager =
WallpaperManager.getInstance(app);
wallpaperManager.forgetLoadedWallpaper();
SetupWizardUtils.disableSetupWizard(app);
return Boolean.TRUE;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
Intent intent = WizardManagerHelper.getNextIntent(mActivity.getIntent(),
Activity.RESULT_OK);
mActivity.startActivityForResult(intent, 1);
}
}
}

View File

@@ -0,0 +1,285 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.ui;
import static com.cyanogenmod.setupwizard.SetupWizardApp.DISABLE_NAV_KEYS;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_APPLY_DEFAULT_THEME;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_PRIVACY_GUARD;
import static com.cyanogenmod.setupwizard.SetupWizardApp.KEY_SEND_METRICS;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.ThemeConfig;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.IWindowManager;
import android.view.View;
import android.view.WindowManagerGlobal;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.setupwizardlib.util.WizardManagerHelper;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import cyanogenmod.hardware.CMHardwareManager;
import cyanogenmod.providers.CMSettings;
public class LineageSettingsActivity extends BaseSetupWizardActivity {
public static final String TAG = LineageSettingsActivity.class.getSimpleName();
public static final String PRIVACY_POLICY_URI = "http://lineageos.org/legal";
private SetupWizardApp mSetupWizardApp;
private View mMetricsRow;
private View mDefaultThemeRow;
private View mNavKeysRow;
private View mPrivacyGuardRow;
private CheckBox mMetrics;
private CheckBox mDefaultTheme;
private CheckBox mNavKeys;
private CheckBox mPrivacyGuard;
private boolean mHideNavKeysRow = false;
private boolean mHideThemeRow = false;
private View.OnClickListener mMetricsClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mMetrics.isChecked();
mMetrics.setChecked(checked);
mSetupWizardApp.getSettingsBundle().putBoolean(KEY_SEND_METRICS, checked);
}
};
private View.OnClickListener mDefaultThemeClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mDefaultTheme.isChecked();
mDefaultTheme.setChecked(checked);
mSetupWizardApp.getSettingsBundle().putBoolean(KEY_APPLY_DEFAULT_THEME, checked);
}
};
private View.OnClickListener mNavKeysClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mNavKeys.isChecked();
mNavKeys.setChecked(checked);
mSetupWizardApp.getSettingsBundle().putBoolean(DISABLE_NAV_KEYS, checked);
}
};
private View.OnClickListener mPrivacyGuardClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mPrivacyGuard.isChecked();
mPrivacyGuard.setChecked(checked);
mSetupWizardApp.getSettingsBundle().putBoolean(KEY_PRIVACY_GUARD, checked);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSetupWizardApp = (SetupWizardApp) getApplication();
setContentView(R.layout.setup_lineage_settings);
TextView title = (TextView) findViewById(android.R.id.title);
title.setText(R.string.setup_services);
ImageView icon = (ImageView) findViewById(R.id.header_icon);
icon.setImageResource(R.drawable.ic_features);
icon.setVisibility(View.VISIBLE);
setNextText(R.string.next);
String privacy_policy = getString(R.string.services_privacy_policy);
String policySummary = getString(R.string.services_explanation, privacy_policy);
SpannableString ss = new SpannableString(policySummary);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
// At this point of the setup, the device has already been unlocked (if frp
// had been enabled), so there should be no issues regarding security
final Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(PRIVACY_POLICY_URI));
try {
startActivity(intent);
} catch (Exception e) {
Log.e(TAG, "Unable to start activity " + intent.toString(), e);
}
}
};
ss.setSpan(clickableSpan,
policySummary.length() - privacy_policy.length() - 1,
policySummary.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView privacyPolicy = (TextView) findViewById(R.id.privacy_policy);
privacyPolicy.setMovementMethod(LinkMovementMethod.getInstance());
privacyPolicy.setText(ss);
mMetricsRow = findViewById(R.id.metrics);
mMetricsRow.setOnClickListener(mMetricsClickListener);
String metricsHelpImproveCM =
getString(R.string.services_help_improve_cm, getString(R.string.os_name));
String metricsSummary = getString(R.string.services_metrics_label,
metricsHelpImproveCM, getString(R.string.os_name));
final SpannableStringBuilder metricsSpan = new SpannableStringBuilder(metricsSummary);
metricsSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
0, metricsHelpImproveCM.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView metrics = (TextView) findViewById(R.id.enable_metrics_summary);
metrics.setText(metricsSpan);
mMetrics = (CheckBox) findViewById(R.id.enable_metrics_checkbox);
mDefaultThemeRow = findViewById(R.id.theme);
mHideThemeRow = hideThemeSwitch(this);
if (mHideThemeRow) {
mDefaultThemeRow.setVisibility(View.GONE);
} else {
mDefaultThemeRow.setOnClickListener(mDefaultThemeClickListener);
String defaultTheme =
getString(R.string.services_apply_theme,
getString(R.string.default_theme_name));
String defaultThemeSummary = getString(R.string.services_apply_theme_label,
defaultTheme);
final SpannableStringBuilder themeSpan =
new SpannableStringBuilder(defaultThemeSummary);
themeSpan.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD),
0, defaultTheme.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView theme = (TextView) findViewById(R.id.enable_theme_summary);
theme.setText(themeSpan);
mDefaultTheme = (CheckBox) findViewById(R.id.enable_theme_checkbox);
}
mNavKeysRow = findViewById(R.id.nav_keys);
mNavKeysRow.setOnClickListener(mNavKeysClickListener);
mNavKeys = (CheckBox) findViewById(R.id.nav_keys_checkbox);
boolean needsNavBar = true;
try {
IWindowManager windowManager = WindowManagerGlobal.getWindowManagerService();
needsNavBar = windowManager.needsNavigationBar();
} catch (RemoteException e) {
}
mHideNavKeysRow = hideKeyDisabler(this);
if (mHideNavKeysRow || needsNavBar) {
mNavKeysRow.setVisibility(View.GONE);
} else {
boolean navKeysDisabled = isKeyDisablerActive(this);
mNavKeys.setChecked(navKeysDisabled);
}
mPrivacyGuardRow = findViewById(R.id.privacy_guard);
mPrivacyGuardRow.setOnClickListener(mPrivacyGuardClickListener);
mPrivacyGuard = (CheckBox) findViewById(R.id.privacy_guard_checkbox);
mPrivacyGuard.setChecked(CMSettings.Secure.getInt(getContentResolver(),
CMSettings.Secure.PRIVACY_GUARD_DEFAULT, 0) == 1);
}
@Override
public void onResume() {
super.onResume();
updateDisableNavkeysOption();
updateMetricsOption();
updateThemeOption();
updatePrivacyGuardOption();
}
@Override
public void onNavigateBack() {
onBackPressed();
}
@Override
public void onNavigateNext() {
Intent intent = WizardManagerHelper.getNextIntent(getIntent(), Activity.RESULT_OK);
startActivityForResult(intent, 1);
}
private void updateMetricsOption() {
final Bundle myPageBundle = mSetupWizardApp.getSettingsBundle();
boolean metricsChecked =
!myPageBundle.containsKey(KEY_SEND_METRICS) || myPageBundle
.getBoolean(KEY_SEND_METRICS);
mMetrics.setChecked(metricsChecked);
myPageBundle.putBoolean(KEY_SEND_METRICS, metricsChecked);
}
private void updateThemeOption() {
if (!mHideThemeRow) {
final Bundle myPageBundle = mSetupWizardApp.getSettingsBundle();
boolean themesChecked;
if (myPageBundle.containsKey(KEY_APPLY_DEFAULT_THEME)) {
themesChecked = myPageBundle.getBoolean(KEY_APPLY_DEFAULT_THEME);
} else {
themesChecked = getResources().getBoolean(
R.bool.check_custom_theme_by_default);
}
mDefaultTheme.setChecked(themesChecked);
myPageBundle.putBoolean(KEY_APPLY_DEFAULT_THEME, themesChecked);
}
}
private void updateDisableNavkeysOption() {
if (!mHideNavKeysRow) {
final Bundle myPageBundle = mSetupWizardApp.getSettingsBundle();
boolean enabled = CMSettings.Secure.getInt(getContentResolver(),
CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, 0) != 0;
boolean checked = myPageBundle.containsKey(DISABLE_NAV_KEYS) ?
myPageBundle.getBoolean(DISABLE_NAV_KEYS) :
enabled;
mNavKeys.setChecked(checked);
myPageBundle.putBoolean(DISABLE_NAV_KEYS, checked);
}
}
private void updatePrivacyGuardOption() {
final Bundle bundle = mSetupWizardApp.getSettingsBundle();
boolean enabled = CMSettings.Secure.getInt(getContentResolver(),
CMSettings.Secure.PRIVACY_GUARD_DEFAULT, 0) != 0;
boolean checked = bundle.containsKey(KEY_PRIVACY_GUARD) ?
bundle.getBoolean(KEY_PRIVACY_GUARD) :
enabled;
mPrivacyGuard.setChecked(checked);
bundle.putBoolean(KEY_PRIVACY_GUARD, checked);
}
private static boolean hideKeyDisabler(Context context) {
final CMHardwareManager hardware = CMHardwareManager.getInstance(context);
return !hardware.isSupported(CMHardwareManager.FEATURE_KEY_DISABLE);
}
private static boolean isKeyDisablerActive(Context context) {
final CMHardwareManager hardware = CMHardwareManager.getInstance(context);
return hardware.get(CMHardwareManager.FEATURE_KEY_DISABLE);
}
private static boolean hideThemeSwitch(Context context) {
return SetupWizardUtils.getDefaultThemePackageName(context)
.equals(ThemeConfig.SYSTEM_DEFAULT);
}
}

View File

@@ -0,0 +1,255 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.ui;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.NumberPicker;
import android.widget.TextView;
import android.widget.Toast;
import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.TelephonyIntents;
import com.android.setupwizardlib.util.WizardManagerHelper;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import java.util.List;
import java.util.Locale;
public class LocaleActivity extends BaseSetupWizardActivity {
public static final String TAG = LocaleActivity.class.getSimpleName();
private ArrayAdapter<com.android.internal.app.LocalePicker.LocaleInfo> mLocaleAdapter;
private Locale mCurrentLocale;
private int[] mAdapterIndices;
private LocalePicker mLanguagePicker;
private FetchUpdateSimLocaleTask mFetchUpdateSimLocaleTask;
private final Handler mHandler = new Handler();
private boolean mPendingLocaleUpdate;
private boolean mPaused = true;
private final Runnable mUpdateLocale = new Runnable() {
public void run() {
if (mCurrentLocale != null) {
mLanguagePicker.setEnabled(false);
com.android.internal.app.LocalePicker.updateLocale(mCurrentLocale);
}
}
};
private final BroadcastReceiver mSimChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
fetchAndUpdateSimLocale();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.setup_locale);
TextView title = (TextView) findViewById(android.R.id.title);
title.setText(R.string.setup_locale);
ImageView icon = (ImageView) findViewById(R.id.header_icon);
icon.setImageResource(R.drawable.ic_locale);
icon.setVisibility(View.VISIBLE);
setNextText(R.string.next);
mLanguagePicker = (LocalePicker) findViewById(R.id.locale_list);
loadLanguages();
}
@Override
public void onPause() {
super.onPause();
mPaused = true;
unregisterReceiver(mSimChangedReceiver);
}
@Override
public void onResume() {
super.onResume();
mPaused = false;
registerReceiver(mSimChangedReceiver,
new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED));
if (mLanguagePicker != null) {
mLanguagePicker.setEnabled(true);
}
if (mPendingLocaleUpdate) {
mPendingLocaleUpdate = false;
fetchAndUpdateSimLocale();
}
}
@Override
public void onNavigateBack() {
onBackPressed();
}
@Override
public void onNavigateNext() {
Intent intent = WizardManagerHelper.getNextIntent(getIntent(), Activity.RESULT_OK);
startActivityForResult(intent, 1);
}
private void loadLanguages() {
mLocaleAdapter = com.android.internal.app.LocalePicker.constructAdapter(this,
R.layout.locale_picker_item, R.id.locale);
mCurrentLocale = Locale.getDefault();
fetchAndUpdateSimLocale();
mAdapterIndices = new int[mLocaleAdapter.getCount()];
int currentLocaleIndex = 0;
String [] labels = new String[mLocaleAdapter.getCount()];
for (int i=0; i<mAdapterIndices.length; i++) {
com.android.internal.app.LocalePicker.LocaleInfo localLocaleInfo =
mLocaleAdapter.getItem(i);
Locale localLocale = localLocaleInfo.getLocale();
if (localLocale.equals(mCurrentLocale)) {
currentLocaleIndex = i;
}
mAdapterIndices[i] = i;
labels[i] = localLocaleInfo.getLabel();
}
mLanguagePicker.setDisplayedValues(labels);
mLanguagePicker.setMaxValue(labels.length - 1);
mLanguagePicker.setValue(currentLocaleIndex);
mLanguagePicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
mLanguagePicker.setOnValueChangedListener(new LocalePicker.OnValueChangeListener() {
public void onValueChange(LocalePicker picker, int oldVal, int newVal) {
setLocaleFromPicker();
}
});
mLanguagePicker.setOnScrollListener(new LocalePicker.OnScrollListener() {
@Override
public void onScrollStateChange(LocalePicker view, int scrollState) {
if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
((SetupWizardApp)getApplication()).setIgnoreSimLocale(true);
}
}
});
}
private void setLocaleFromPicker() {
((SetupWizardApp)getApplication()).setIgnoreSimLocale(true);
int i = mAdapterIndices[mLanguagePicker.getValue()];
final com.android.internal.app.LocalePicker.LocaleInfo localLocaleInfo = mLocaleAdapter.getItem(i);
onLocaleChanged(localLocaleInfo.getLocale());
}
private void onLocaleChanged(Locale paramLocale) {
mLanguagePicker.setEnabled(true);
Resources localResources = getResources();
Configuration localConfiguration1 = localResources.getConfiguration();
Configuration localConfiguration2 = new Configuration();
localConfiguration2.locale = paramLocale;
localResources.updateConfiguration(localConfiguration2, null);
localResources.updateConfiguration(localConfiguration1, null);
mHandler.removeCallbacks(mUpdateLocale);
mCurrentLocale = paramLocale;
mHandler.postDelayed(mUpdateLocale, 1000);
}
private void fetchAndUpdateSimLocale() {
if (((SetupWizardApp)getApplication()).ignoreSimLocale() || isDestroyed()) {
return;
}
if (mPaused) {
mPendingLocaleUpdate = true;
return;
}
if (mFetchUpdateSimLocaleTask != null) {
mFetchUpdateSimLocaleTask.cancel(true);
}
mFetchUpdateSimLocaleTask = new FetchUpdateSimLocaleTask();
mFetchUpdateSimLocaleTask.execute();
}
private class FetchUpdateSimLocaleTask extends AsyncTask<Void, Void, Locale> {
@Override
protected Locale doInBackground(Void... params) {
Locale locale = null;
Activity activity = LocaleActivity.this;
if (!activity.isFinishing() || !activity.isDestroyed()) {
// If the sim is currently pin locked, return
TelephonyManager telephonyManager = (TelephonyManager)
activity.getSystemService(Context.TELEPHONY_SERVICE);
int state = telephonyManager.getSimState();
if(state == TelephonyManager.SIM_STATE_PIN_REQUIRED ||
state == TelephonyManager.SIM_STATE_PUK_REQUIRED) {
return null;
}
final SubscriptionManager subscriptionManager =
SubscriptionManager.from(activity);
List<SubscriptionInfo> activeSubs =
subscriptionManager.getActiveSubscriptionInfoList();
if (activeSubs == null || activeSubs.isEmpty()) {
return null;
}
// Fetch locale for active sim's MCC
int mcc = activeSubs.get(0).getMcc();
locale = MccTable.getLocaleFromMcc(activity, mcc, null);
// If that fails, fall back to preferred languages reported
// by the sim
if (locale == null) {
String localeString = telephonyManager.getLocaleFromDefaultSim();
if (localeString != null) {
locale = Locale.forLanguageTag(localeString);
}
}
}
return locale;
}
@Override
protected void onPostExecute(Locale simLocale) {
if (simLocale != null && !simLocale.equals(mCurrentLocale)) {
if (!((SetupWizardApp)getApplication()).ignoreSimLocale() && !isDestroyed()) {
String label = getString(R.string.sim_locale_changed,
simLocale.getDisplayName());
Toast.makeText(LocaleActivity.this, label, Toast.LENGTH_SHORT).show();
onLocaleChanged(simLocale);
((SetupWizardApp)getApplication()).setIgnoreSimLocale(true);
}
}
}
}
}

View File

@@ -31,7 +31,6 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@@ -43,21 +42,21 @@ import android.widget.ImageView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import com.android.setupwizardlib.util.SystemBarHelper; import com.android.setupwizardlib.util.SystemBarHelper;
import com.cyanogenmod.setupwizard.R; import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp; import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.cmstats.SetupStats;
import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; import com.cyanogenmod.setupwizard.setup.CMSetupWizardData;
import com.cyanogenmod.setupwizard.setup.GmsAccountPage;
import com.cyanogenmod.setupwizard.setup.Page; import com.cyanogenmod.setupwizard.setup.Page;
import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks;
import com.cyanogenmod.setupwizard.util.EnableAccessibilityController; import com.cyanogenmod.setupwizard.util.EnableAccessibilityController;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils; import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import java.util.ArrayList;
import cyanogenmod.providers.CMSettings; import cyanogenmod.providers.CMSettings;
import cyanogenmod.themes.ThemeManager; import cyanogenmod.themes.ThemeManager;
import java.util.ArrayList;
public class SetupWizardActivity extends Activity implements SetupDataCallbacks, public class SetupWizardActivity extends Activity implements SetupDataCallbacks,
ThemeManager.ThemeChangeListener { ThemeManager.ThemeChangeListener {
@@ -103,7 +102,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks,
mReveal = (ImageView)mRootView.findViewById(R.id.reveal); mReveal = (ImageView)mRootView.findViewById(R.id.reveal);
mButtonBar = findViewById(R.id.button_bar); mButtonBar = findViewById(R.id.button_bar);
mFinishingProgressBar = (ProgressBar)findViewById(R.id.finishing_bar); mFinishingProgressBar = (ProgressBar)findViewById(R.id.finishing_bar);
((SetupWizardApp)getApplicationContext()).disableStatusBar();
mSetupData = (CMSetupWizardData)getLastNonConfigurationInstance(); mSetupData = (CMSetupWizardData)getLastNonConfigurationInstance();
if (mSetupData == null) { if (mSetupData == null) {
mSetupData = new CMSetupWizardData(getApplicationContext()); mSetupData = new CMSetupWizardData(getApplicationContext());
@@ -145,14 +143,8 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks,
Settings.Secure.BACKUP_AUTO_RESTORE, 0) == 1) || Settings.Secure.BACKUP_AUTO_RESTORE, 0) == 1) ||
(Settings.Secure.getInt(getContentResolver(), (Settings.Secure.getInt(getContentResolver(),
Settings.Secure.BACKUP_ENABLED, 0) == 1); Settings.Secure.BACKUP_ENABLED, 0) == 1);
if (TextUtils.equals(lastPage, GmsAccountPage.TAG) && backupEnabled) { mSetupData.setCurrentPage(sharedPreferences.getString(KEY_LAST_PAGE_TAG,
// We probably already restored, skip ahead! mSetupData.getCurrentPage().getKey()));
mSetupData.setCurrentPage(mSetupData.getNextPage(lastPage).getKey());
} else {
// else just restore
mSetupData.setCurrentPage(sharedPreferences.getString(KEY_LAST_PAGE_TAG,
mSetupData.getCurrentPage().getKey()));
}
Page page = mSetupData.getCurrentPage(); Page page = mSetupData.getCurrentPage();
page.doLoadAction(getFragmentManager(), Page.ACTION_NEXT); page.doLoadAction(getFragmentManager(), Page.ACTION_NEXT);
} }
@@ -323,7 +315,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks,
mPrevButton.startAnimation(fadeOut); mPrevButton.startAnimation(fadeOut);
mPrevButton.setVisibility(View.INVISIBLE); mPrevButton.setVisibility(View.INVISIBLE);
final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); final SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication();
setupWizardApp.enableStatusBar();
setupWizardApp.enableCaptivePortalDetection(); setupWizardApp.enableCaptivePortalDetection();
Animation fadeIn = AnimationUtils.loadAnimation(this, android.R.anim.fade_in); Animation fadeIn = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
mFinishingProgressBar.setVisibility(View.VISIBLE); mFinishingProgressBar.setVisibility(View.VISIBLE);
@@ -454,7 +445,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks,
final ThemeManager tm = ThemeManager.getInstance(SetupWizardActivity.this); final ThemeManager tm = ThemeManager.getInstance(SetupWizardActivity.this);
tm.unregisterThemeChangeListener(SetupWizardActivity.this); tm.unregisterThemeChangeListener(SetupWizardActivity.this);
SetupStats.sendEvents(SetupWizardActivity.this); SetupStats.sendEvents(SetupWizardActivity.this);
SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this);
final WallpaperManager wallpaperManager = final WallpaperManager wallpaperManager =
WallpaperManager.getInstance(SetupWizardActivity.this); WallpaperManager.getInstance(SetupWizardActivity.this);
wallpaperManager.forgetLoadedWallpaper(); wallpaperManager.forgetLoadedWallpaper();

View File

@@ -0,0 +1,83 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* Copyright (C) 2017 The LineageOS 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.cyanogenmod.setupwizard.ui;
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import com.android.setupwizardlib.util.WizardManagerHelper;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.util.EnableAccessibilityController;
public class WelcomeActivity extends BaseSetupWizardActivity {
public static final String TAG = WelcomeActivity.class.getSimpleName();
private static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL";
private View mRootView;
private EnableAccessibilityController mEnableAccessibilityController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_activity);
mRootView = findViewById(R.id.root);
setNextText(R.string.next);
setBackText(R.string.emergency_call);
setBackDrawable(null);
mEnableAccessibilityController =
EnableAccessibilityController.getInstance(getApplicationContext());
mRootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean consumeIntercept = mEnableAccessibilityController.onInterceptTouchEvent(event);
boolean consumeTouch = mEnableAccessibilityController.onTouchEvent(event);
return consumeIntercept && consumeTouch;
}
});
}
@Override
public void onNavigateBack() {
Intent intent = new Intent(ACTION_EMERGENCY_DIAL);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
ActivityOptions options =
ActivityOptions.makeCustomAnimation(this,
android.R.anim.fade_in,
android.R.anim.fade_out);
startActivity(intent, options.toBundle());
}
@Override
public void onNavigateNext() {
ActivityOptions options =
ActivityOptions.makeCustomAnimation(this,
R.anim.slide_left,
0);
Intent intent = WizardManagerHelper.getNextIntent(getIntent(), Activity.RESULT_OK);
startActivityForResult(intent, 1, options.toBundle());
}
}

View File

@@ -195,6 +195,11 @@ public class SetupWizardUtils {
return Binder.getCallingUserHandle().isOwner(); return Binder.getCallingUserHandle().isOwner();
} }
public static boolean hasGMS(Context context) {
return GooglePlayServicesUtil.isGooglePlayServicesAvailable(context) !=
ConnectionResult.SERVICE_MISSING;
}
public static boolean accountExists(Context context, String accountType) { public static boolean accountExists(Context context, String accountType) {
return AccountManager.get(context).getAccountsByType(accountType).length > 0; return AccountManager.get(context).getAccountsByType(accountType).length > 0;
} }
@@ -211,48 +216,15 @@ public class SetupWizardUtils {
public static void disableSetupWizard(Context context) { public static void disableSetupWizard(Context context) {
disableComponent(context, context.getPackageName(), disableComponent(context, context.getPackageName(),
"com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); SetupWizardActivity.class.getName());
disableComponent(context, context.getPackageName(), disableComponent(context, context.getPackageName(),
"com.cyanogenmod.setupwizard.setup.FinishSetupReceiver"); "com.cyanogenmod.setupwizard.ui.WelcomeActivity");
} disableComponent(context, context.getPackageName(),
"com.cyanogenmod.setupwizard.ui.LocaleActivity");
public static void disableGMSSetupWizard(Context context) { disableComponent(context, context.getPackageName(),
try { "com.cyanogenmod.setupwizard.ui.LineageSettingsActivity");
PackageInfo packageInfo = context.getPackageManager() disableComponent(context, context.getPackageName(),
.getPackageInfo(GOOGLE_SETUPWIZARD_PACKAGE, "com.cyanogenmod.setupwizard.ui.FinishActivity");
PackageManager.GET_ACTIVITIES |
PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES);
disableComponentArray(context, packageInfo.activities);
disableComponentArray(context, packageInfo.services);
disableComponentArray(context, packageInfo.receivers);
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Unable to disable GMS");
}
}
public static boolean enableGMSSetupWizard(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(GOOGLE_SETUPWIZARD_PACKAGE,
PackageManager.GET_ACTIVITIES |
PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES);
enableComponentArray(context, packageInfo.activities);
enableComponentArray(context, packageInfo.services);
enableComponentArray(context, packageInfo.receivers);
return true;
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Unable to enable GMS");
return false;
}
}
private static void disableComponentArray(Context context, ComponentInfo[] components) {
if(components != null) {
ComponentInfo[] componentInfos = components;
for(int i = 0; i < componentInfos.length; i++) {
disableComponent(context, componentInfos[i].packageName, componentInfos[i].name);
}
}
} }
private static void disableComponent(Context context, String packageName, String name) { private static void disableComponent(Context context, String packageName, String name) {
@@ -264,24 +236,6 @@ public class SetupWizardUtils {
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
} }
private static void enableComponentArray(Context context, ComponentInfo[] components) {
if(components != null) {
ComponentInfo[] componentInfos = components;
for(int i = 0; i < componentInfos.length; i++) {
enableComponent(context, componentInfos[i].packageName, componentInfos[i].name);
}
}
}
private static void enableComponent(Context context, String packageName, String name) {
enableComponent(context, new ComponentName(packageName, name));
}
private static void enableComponent(Context context, ComponentName component) {
context.getPackageManager().setComponentEnabledSetting(component,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
public static boolean hasLeanback(Context context) { public static boolean hasLeanback(Context context) {
PackageManager packageManager = context.getPackageManager(); PackageManager packageManager = context.getPackageManager();
return packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK); return packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK);