SetupWizard: Initial commit

This commit is contained in:
cretin45 2015-01-15 16:04:44 -08:00
commit 0328b87bf6
113 changed files with 7259 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
values-v1

30
Android.mk Normal file
View File

@ -0,0 +1,30 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_MODULE_TAGS := optional
LOCAL_PACKAGE_NAME := CMSetupWizard
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v4 \
android-support-v13 \
play \
libphonenumber
LOCAL_JAVA_LIBRARIES += org.cyanogenmod.hardware
# Include res dir from chips
google_play_dir := ../../../external/google/google_play_services/libproject/google-play-services_lib/res
res_dir := $(google_play_dir) res
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dir))
LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS += --extra-packages com.google.android.gms
include $(BUILD_PACKAGE)

69
AndroidManifest.xml Normal file
View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cyanogenmod.setupwizard"
android:versionCode="3">
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.STATUS_BAR" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.SET_TIME_ZONE" />
<uses-permission android:name="android.permission.SET_TIME" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_THEME_MANAGER"/>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="android.permission.HARDWARE_ABSTRACTION_ACCESS" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
<application android:label="@string/app_name"
android:icon="@drawable/icon"
android:theme="@style/Theme.Setup"
android:name=".SetupWizardApp">
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity android:name=".ui.SetupWizardActivity"
android:label="@string/product_name"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
android:immersive="true">
<intent-filter android:priority="9">
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>

3
proguard.flags Normal file
View File

@ -0,0 +1,3 @@
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}

6
res/anim/fadein.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="1000"/>
</set>

6
res/anim/fadeout.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="1000"/>
</set>

8
res/anim/slide_left.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%"
android:toXDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="500"/>
</set>

8
res/anim/slide_right.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="500"/>
</set>

BIN
res/drawable-hdpi/brand.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
res/drawable-hdpi/finish_logo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
res/drawable-hdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
res/drawable-hdpi/powered_by.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
res/drawable-hdpi/sim_back.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
res/drawable-hdpi/sim_side.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/drawable-mdpi/brand.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
res/drawable-mdpi/finish_logo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
res/drawable-mdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
res/drawable-mdpi/powered_by.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
res/drawable-mdpi/sim_back.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
res/drawable-mdpi/sim_side.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
res/drawable-xhdpi/brand.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
res/drawable-xhdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
res/drawable-xhdpi/powered_by.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/drawable-xhdpi/sim_back.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
res/drawable-xhdpi/sim_side.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
res/drawable-xxhdpi/brand.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
res/drawable-xxhdpi/sim_back.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
res/drawable-xxhdpi/sim_side.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
res/drawable-xxxhdpi/brand.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
res/drawable-xxxhdpi/sim_back.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
res/drawable-xxxhdpi/sim_side.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

20
res/drawable/divider.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/divider" />
<size android:width="316dp" android:height="1dp"/>
</shape>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/primary_text"
android:pathData="M15.41,7.41L14,6l-6,6l6,6l1.41-1.41L10.83,12L15.41,7.41Z" />
</vector>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/white"
android:pathData="M15.41,7.41L14,6l-6,6l6,6l1.41-1.41L10.83,12L15.41,7.41Z" />
</vector>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/primary_text"
android:pathData="M10,6L8.59,7.41L13.17,12l-4.58,4.59L10,18l6-6L10,6Z" />
</vector>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/white"
android:pathData="M10,6L8.59,7.41L13.17,12l-4.58,4.59L10,18l6-6L10,6Z" />
</vector>

View File

@ -0,0 +1,25 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
</vector>

View File

@ -0,0 +1,28 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
<path
android:fillColor="@color/accent"
android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
</vector>

View File

@ -0,0 +1,28 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
<path
android:fillColor="@color/accent"
android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/>
</vector>

View File

@ -0,0 +1,28 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
<path
android:fillColor="@color/accent"
android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/>
</vector>

View File

@ -0,0 +1,25 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/accent"
android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
</vector>

View File

@ -0,0 +1,25 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/>
</vector>

37
res/layout/button_bar.xml Normal file
View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
style="@style/ButtonBar.Left"
android:id="@+id/prev_button"
android:layout_width="0dp"
android:layout_weight="1"
android:text="@string/prev" />
<Button
style="@style/ButtonBar.Right"
android:id="@+id/next_button"
android:layout_width="0dp"
android:layout_weight="1"
android:text="@string/next" />
</LinearLayout>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/page_view"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/PageSummaryText"
android:textSize="15sp"
android:paddingTop="@dimen/content_margin_top"
android:paddingLeft="@dimen/content_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:paddingBottom="@dimen/summary_margin_bottom"
android:text="@string/choose_data_sim_summary" />
<include layout="@layout/divider" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sim_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingLeft="@dimen/content_margin_left"
android:paddingRight="@dimen/data_switch_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<ImageView
android:id="@+id/signal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_signal_0" />
<TextView
android:id="@+id/sim_title"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="14sp"
android:layout_marginLeft="@dimen/carrier_text_margin_left"
android:maxLines="4" />
<CheckBox
android:id="@+id/enable_check"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:duplicateParentState="true"
android:clickable="false"/>
</LinearLayout>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<!-- Based on simple_list_item_2.xml in framework -->
<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="twoLine"
android:gravity="center_vertical">
<TextView
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="16dip"
style="@style/SpinnerItem" />
<TextView
android:id="@android:id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="10dip"
android:layout_below="@android:id/text1"
android:layout_alignStart="@android:id/text1"
android:fontFamily="sans-serif-medium"
style="@style/SpinnerItem" />
</TwoLineListItem>

21
res/layout/divider.xml Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:src="@drawable/divider" />

26
res/layout/header.xml Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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:layout_width="match_parent"
android:layout_height="@dimen/header_height">
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height"
style="@style/PageTitle" />
</RelativeLayout>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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:layout_width="match_parent"
android:layout_height="@dimen/page_title_height">
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height"
style="@style/PageTitle" />
</RelativeLayout>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageButton android:id="@+id/increment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="22dip"
android:paddingBottom="22dip"/>
<EditText
android:id="@+id/numberpicker_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMediumInverse"
android:gravity="center"
android:singleLine="true" />
<ImageButton android:id="@+id/decrement"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="22dip"
android:paddingBottom="22dip"/>
</merge>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:gravity="left"
android:paddingStart="16dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:paddingEnd="16dp">
<TextView
android:id="@+id/locale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>

View File

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/PageContent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_marginBottom="@dimen/summary_margin_bottom"
style="@style/PageSummaryText"
android:text="@string/location_services_summary" />
<LinearLayout
android:id="@+id/location"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/location_margin_left"
android:layout_marginRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/location_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/location_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
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/location_access_summary"
android:maxLines="5" />
</LinearLayout>
<LinearLayout
android:id="@+id/gps"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/location_margin_left"
android:layout_marginRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/gps_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/gps_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
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/location_gps"
android:maxLines="5" />
</LinearLayout>
<LinearLayout
android:id="@+id/network"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/location_margin_left"
android:layout_marginRight="@dimen/content_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<CheckBox
android:id="@+id/network_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/network_summary"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="15sp"
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/location_network"
android:maxLines="5" />
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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:layout_width="match_parent"
android:layout_height="@dimen/logo_header_height">
<ImageView
android:id="@+id/brand_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/brand"
android:paddingLeft="@dimen/header_logo_margin_left"
android:paddingBottom="@dimen/header_logo_margin_bottom"
android:layout_above="@+id/powered_by_logo"/>
<ImageView
android:id="@+id/powered_by_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/powered_by"
android:visibility="gone"
android:paddingLeft="@dimen/header_logo_margin_left"
android:paddingBottom="@dimen/header_logo_margin_bottom"
android:layout_above="@android:id/title"/>
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height"
style="@style/PageTitle" />
</RelativeLayout>

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/mobile_data_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/PageSummaryText"
android:textSize="15sp"
android:paddingTop="@dimen/content_margin_top"
android:paddingLeft="@dimen/content_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:paddingBottom="@dimen/summary_margin_bottom"
android:text="@string/enable_mobile_data_summary" />
<include layout="@layout/divider" />
<LinearLayout
android:id="@+id/data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingLeft="@dimen/content_margin_left"
android:paddingRight="@dimen/data_switch_margin_right"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<ImageView
android:id="@+id/signal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_signal_0" />
<TextView
android:id="@+id/enable_data_title"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="14sp"
android:layout_marginLeft="@dimen/carrier_text_margin_left"
android:text="@string/setup_mobile_data_no_service"
android:maxLines="4" />
<Switch
android:id="@+id/data_switch"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:duplicateParentState="true"
android:clickable="false"
android:textOff="@string/enable_mobile_off"
android:textOn="@string/enable_mobile_on"/>
</LinearLayout>
<include layout="@layout/divider" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/PageContent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/PageSummaryText"
android:textSize="16sp"
android:layout_marginBottom="@dimen/summary_margin_bottom"
android:paddingRight="@dimen/location_text_margin_right"
android:text="@string/date_time_summary" />
<Spinner
android:id="@+id/timezone_list"
android:layout_width="290dp"
android:layout_height="wrap_content"
android:saveEnabled="false"/>
<TwoLineListItem
android:id="@+id/date_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="twoLine"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical">
<TextView
android:id="@+id/date_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/setup_current_date"
style="@style/SpinnerItem" />
<TextView
android:id="@+id/date_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/date_title"
android:layout_alignStart="@id/date_title"
android:fontFamily="sans-serif-medium"
style="@style/SpinnerItem" />
</TwoLineListItem>
<TwoLineListItem
android:id="@+id/time_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="twoLine"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical">
<TextView
android:id="@+id/time_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/setup_current_time"
style="@style/SpinnerItem" />
<TextView
android:id="@+id/time_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/time_title"
android:layout_alignStart="@id/time_title"
android:fontFamily="sans-serif-medium"
style="@style/SpinnerItem" />
</TwoLineListItem>
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
style="@android:style/Widget.Material.ProgressBar.Horizontal" />
</LinearLayout>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<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">
<ImageView
android:id="@+id/brand_logo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/finish_logo"
android:scaleType="centerInside"/>
</LinearLayout>

47
res/layout/setup_main.xml Normal file
View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/RootView">
<LinearLayout android:id="@+id/page"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
style="@style/PageContainer" >
<FrameLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Header"/>
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
<include layout="@layout/button_bar" />
</LinearLayout>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/PageContent">
<com.cyanogenmod.account.ui.LocalePicker
android:id="@+id/locale_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:gravity="left"
android:focusable="true"
android:focusableInTouchMode="true"/>
</FrameLayout>

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/sim_missing"
style="@style/PageSummaryText"
android:textSize="15sp"
android:layout_marginBottom="@dimen/summary_margin_bottom"
android:paddingTop="@dimen/content_margin_top"
android:paddingLeft="@dimen/content_margin_left"
android:paddingRight="@dimen/content_margin_right"
android:text="@string/sim_missing_summary" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:src="@drawable/sim_back"/>
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<explode/>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="sequential">
<changeBounds/>
<slide android:slideEdge="left" >
<targets>
<target android:targetId="@id/page" />
</targets>
</slide>
</transitionSet>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 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.
-->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="sequential">
<changeBounds/>
<slide android:slideEdge="right" >
<targets>
<target android:targetId="@id/page" />
</targets>
</slide>
</transitionSet>

27
res/values-af/strings.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--
Copyright (C) 2013-2014 The Cyanogen Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="next">Volgende</string>
<string name="continue_label">Gaan voort</string>
<string name="prev">Vorige</string>
<string name="skip">Slaan oor</string>
<string name="cancel">Kanselleer</string>
<string name="ok">OK</string>
<string name="setup_welcome">Welkom by Cyanogen</string>
</resources>

27
res/values-ar/strings.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--
Copyright (C) 2013-2014 The Cyanogen Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="next">القادم</string>
<string name="continue_label">متابعة</string>
<string name="prev">سابق</string>
<string name="skip">تخطي</string>
<string name="cancel">إلغاء</string>
<string name="ok">موافق</string>
<string name="setup_complete">اكتمال الإعداد</string>
<string name="setup_welcome">مرحبا بك في Cyanogen</string>
</resources>

27
res/values-ca/strings.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--
Copyright (C) 2013-2014 The Cyanogen Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="next">Següent</string>
<string name="continue_label">Continua</string>
<string name="prev">Anterior</string>
<string name="skip">Omet</string>
<string name="cancel">Cancel·la</string>
<string name="ok">D\'acord</string>
<string name="setup_complete">Configuració completa</string>
<string name="setup_welcome">Benvingut a Cyanogen</string>
</resources>

27
res/values-cs/strings.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--
Copyright (C) 2013-2014 The Cyanogen Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="next">Další</string>
<string name="continue_label">Pokračovat</string>
<string name="prev">Předchozí</string>
<string name="skip">Přeskočit</string>
<string name="cancel">Zrušit</string>
<string name="ok">OK</string>
<string name="setup_complete">Nastavení dokončeno</string>
<string name="setup_welcome">Vítá Vás Cyanogen</string>
</resources>

27
res/values-es/strings.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--
Copyright (C) 2013-2014 The Cyanogen Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="next">Siguiente</string>
<string name="continue_label">Continuar</string>
<string name="prev">Anterior</string>
<string name="skip">Omitir</string>
<string name="cancel">Cancelar</string>
<string name="ok">Aceptar</string>
<string name="setup_complete">Configuración completada</string>
<string name="setup_welcome">Bienvenido a Cyanogen</string>
</resources>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<resources>
</resources>

29
res/values/colors.xml Normal file
View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<resources>
<color name="black">#000000</color>
<color name="white">#ffffff</color>
<color name="window_background">#e4e7e8</color>
<color name="page_background">#efefef</color>
<color name="primary">#2196f3</color>
<color name="primary_dark">#1481d8</color>
<color name="accent">#009789</color>
<color name="primary_text">#8a000000</color>
<color name="secondary_text">#727272</color>
<color name="divider">#40000000</color>
</resources>

19
res/values/config.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<resources>
<integer name="local_picker_items">3</integer>
</resources>

34
res/values/dimens.xml Normal file
View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<resources>
<dimen name="logo_header_height">290dp</dimen>
<dimen name="header_height">220dp</dimen>
<dimen name="page_title_height">56dp</dimen>
<dimen name="header_title_margin_left">26dp</dimen>
<dimen name="header_logo_margin_left">25dp</dimen>
<dimen name="header_logo_margin_bottom">11dp</dimen>
<dimen name="content_margin_top">26dp</dimen>
<dimen name="content_margin_left">26dp</dimen>
<dimen name="content_margin_right">14dp</dimen>
<dimen name="content_margin_bottom">20dp</dimen>
<dimen name="summary_margin_bottom">20dp</dimen>
<dimen name="location_margin_left">20dp</dimen>
<dimen name="location_text_margin_left">10dp</dimen>
<dimen name="location_text_margin_right">30dp</dimen>
<dimen name="data_switch_margin_right">30dp</dimen>
<dimen name="carrier_text_margin_left">15dp</dimen>
</resources>

72
res/values/strings.xml Normal file
View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013-2014 The Cyanogen Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Setup Wizard</string>
<string name="product_name" translatable="false">cyanogen</string>
<string name="account_name" translatable="false">Cyanogen</string>
<string name="next">Next</string>
<string name="continue_label">Continue</string>
<string name="skip">Skip</string>
<string name="finish">Finish</string>
<string name="start">Start</string>
<string name="cancel">Cancel</string>
<string name="create">Create</string>
<string name="login">Login</string>
<string name="ok">OK</string>
<string name="existing">Existing</string>
<string name="new_account">New</string>
<string name="skip_anyway">Skip anyway</string>
<string name="dont_skip">Don\'t skip</string>
<string name="setup_complete">Setup is complete</string>
<string name="setup_welcome">Welcome</string>
<string name="setup_wifi">Connect to Wi-Fi</string>
<string name="setup_sim_missing">SIM Card Missing</string>
<string name="setup_gms_account">GMS account</string>
<string name="setup_choose_data_sim">Choose a SIM for Data</string>
<string name="setup_location">Location Services</string>
<string name="setup_datetime">Date &amp; time</string>
<string name="setup_current_date">Current date</string>
<string name="setup_current_time">Current time</string>
<string name="setup_msg_no_network">WARNING: You won\'t be able to set up your accounts</string>
<string name="setup_warning_skip_wifi" product="tablet">WARNING: You may incur extra carrier data charges.\n\nTablet setup can require significant network activity.</string>
<string name="setup_warning_skip_wifi" product="default">WARNING: You may incur extra carrier data charges.\n\nPhone setup can require significant network activity.</string>
<string name="setup_privacy">Privacy Settings</string>
<string name="setup_finalizing">Finalizing setup\u2026</string>
<string name="sim_missing_summary">A SIM card has not been detected in your device. Please insert a valid SIM card.</string>
<string name="choose_data_sim_summary">Which SIM do you want to use for data? The selected SIM may incur network charges as it will be used to set up your device.</string>
<string name="date_time_summary">Set your time zone and adjust current date and time if needed</string>
<string name="location_services_summary">Location services allows Maps and other apps to gather and use data such as your approximate location. For example, Maps may use your approximate location to locate nearby coffee shops.</string>
<string name="location_access_summary">Allow apps that have asked your permission to use your location information. This may include your current location and past locations.</string>
<string name="location_gps">Improve location accuracy by allowing apps to use the GPS on your phone.</string>
<string name="location_network">Use Googles location service to help apps determine your location. This means sending annonymous location data to Google, even when no apps are running.</string>
<string name="setup_mobile_data">Turn On Mobile Data</string>
<string name="setup_mobile_data_no_service">No service</string>
<string name="setup_mobile_data_emergency_only">Emergency calls only</string>
<string name="enable_mobile_data_summary">Do you want to use mobile data during setup? Turning on mobile data may be subject to data charges.</string>
<string name="enable_mobile_off">No</string>
<string name="enable_mobile_on">Yes</string>
<string name="data_sim_name">SIM <xliff:g id="sub">%d</xliff:g> - <xliff:g id="name">%s</xliff:g></string>
<string name="emergency_call">Emergency Call</string>
</resources>

89
res/values/styles.xml Normal file
View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<resources>
<style name="Theme.Setup" parent="@android:style/Theme.Material.Light">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:colorPrimary">@color/primary</item>
<item name="android:colorPrimaryDark">@color/primary</item>
<item name="android:colorAccent">@color/accent</item>
</style>
<style name="RootView">
<item name="android:background">@color/window_background</item>
</style>
<style name="Header">
<item name="android:elevation">4dp</item>
<item name="android:background">@color/primary</item>
</style>
<style name="PageContainer">
<item name="android:textColor">@color/primary_text</item>
<item name="android:background">@color/page_background</item>
</style>
<style name="PageContent">
<item name="android:paddingTop">@dimen/content_margin_top</item>
<item name="android:paddingLeft">@dimen/content_margin_left</item>
<item name="android:paddingRight">@dimen/content_margin_right</item>
</style>
<style name="PageTitle">
<item name="android:id">@android:id/title</item>
<item name="android:textSize">20sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:background">@color/primary_dark</item>
<item name="android:layout_alignParentBottom">true</item>
<item name="android:gravity">left|center_vertical</item>
<item name="android:paddingLeft">@dimen/header_title_margin_left</item>
</style>
<style name="PageSummaryText">
<item name="android:id">@android:id/summary</item>
</style>
<style name="SpinnerItem">
<item name="android:textSize">15sp</item>
</style>
<style name="ButtonBar" parent="@android:style/Widget.Material.ActionButton">
<item name="android:layout_height">48dp</item>
<item name="android:textSize">15sp</item>
<item name="android:textAllCaps">true</item>
<item name="android:maxLines">1</item>
<item name="android:minWidth">15dp</item>
<item name="android:minHeight">15dp</item>
<item name="android:textColor">@color/primary_text</item>
<item name="android:fontFamily">sans-serif-medium</item>
<item name="android:drawablePadding">5dp</item>
</style>
<style name="ButtonBar.Left">
<item name="android:paddingStart">15dp</item>
<item name="android:gravity">center_vertical|start</item>
<item name="android:drawableLeft">@drawable/ic_chevron_left_dark</item>
</style>
<style name="ButtonBar.Right">
<item name="android:paddingEnd">15dp</item>
<item name="android:gravity">center_vertical|end</item>
<item name="android:drawableRight">@drawable/ic_chevron_right_dark</item>
</style>
</resources>

4
res/values/version.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="google_play_services_version">4323000</integer>
</resources>

103
res/xml/timezones.xml Normal file
View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 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.
-->
<timezones>
<timezone id="Pacific/Majuro">Marshall Islands</timezone>
<timezone id="Pacific/Midway">Midway Island</timezone>
<timezone id="Pacific/Honolulu">Hawaii</timezone>
<timezone id="America/Anchorage">Alaska</timezone>
<timezone id="America/Los_Angeles">Pacific Time</timezone>
<timezone id="America/Tijuana">Tijuana</timezone>
<timezone id="America/Phoenix">Arizona</timezone>
<timezone id="America/Chihuahua">Chihuahua</timezone>
<timezone id="America/Denver">Mountain Time</timezone>
<timezone id="America/Costa_Rica">Central America</timezone>
<timezone id="America/Chicago">Central Time</timezone>
<timezone id="America/Mexico_City">Mexico City</timezone>
<timezone id="America/Regina">Saskatchewan</timezone>
<timezone id="America/Bogota">Bogota</timezone>
<timezone id="America/New_York">Eastern Time</timezone>
<timezone id="America/Caracas">Venezuela</timezone>
<timezone id="America/Barbados">Atlantic Time (Barbados)</timezone>
<timezone id="America/Halifax">Atlantic Time (Canada)</timezone>
<timezone id="America/Manaus">Manaus</timezone>
<timezone id="America/Santiago">Santiago</timezone>
<timezone id="America/St_Johns">Newfoundland</timezone>
<timezone id="America/Sao_Paulo">Brasilia</timezone>
<timezone id="America/Argentina/Buenos_Aires">Buenos Aires</timezone>
<timezone id="America/Godthab">Greenland</timezone>
<timezone id="America/Montevideo">Montevideo</timezone>
<timezone id="Atlantic/South_Georgia">Mid-Atlantic</timezone>
<timezone id="Atlantic/Azores">Azores</timezone>
<timezone id="Atlantic/Cape_Verde">Cape Verde Islands</timezone>
<timezone id="Africa/Casablanca">Casablanca</timezone>
<timezone id="Europe/London">London, Dublin</timezone>
<timezone id="Europe/Amsterdam">Amsterdam, Berlin</timezone>
<timezone id="Europe/Belgrade">Belgrade</timezone>
<timezone id="Europe/Brussels">Brussels</timezone>
<timezone id="Europe/Sarajevo">Sarajevo</timezone>
<timezone id="Africa/Windhoek">Windhoek</timezone>
<timezone id="Africa/Brazzaville">W. Africa Time</timezone>
<timezone id="Asia/Amman">Amman, Jordan</timezone>
<timezone id="Europe/Athens">Athens, Istanbul</timezone>
<timezone id="Asia/Beirut">Beirut, Lebanon</timezone>
<timezone id="Africa/Cairo">Cairo</timezone>
<timezone id="Europe/Helsinki">Helsinki</timezone>
<timezone id="Asia/Jerusalem">Jerusalem</timezone>
<timezone id="Europe/Minsk">Minsk</timezone>
<timezone id="Africa/Harare">Harare</timezone>
<timezone id="Asia/Baghdad">Baghdad</timezone>
<timezone id="Europe/Moscow">Moscow</timezone>
<timezone id="Asia/Kuwait">Kuwait</timezone>
<timezone id="Africa/Nairobi">Nairobi</timezone>
<timezone id="Asia/Tehran">Tehran</timezone>
<timezone id="Asia/Baku">Baku</timezone>
<timezone id="Asia/Tbilisi">Tbilisi</timezone>
<timezone id="Asia/Yerevan">Yerevan</timezone>
<timezone id="Asia/Dubai">Dubai</timezone>
<timezone id="Asia/Kabul">Kabul</timezone>
<timezone id="Asia/Karachi">Islamabad, Karachi</timezone>
<timezone id="Asia/Oral">Ural'sk</timezone>
<timezone id="Asia/Yekaterinburg">Yekaterinburg</timezone>
<timezone id="Asia/Calcutta">Kolkata</timezone>
<timezone id="Asia/Colombo">Sri Lanka</timezone>
<timezone id="Asia/Katmandu">Kathmandu</timezone>
<timezone id="Asia/Almaty">Astana</timezone>
<timezone id="Asia/Rangoon">Yangon</timezone>
<timezone id="Asia/Krasnoyarsk">Krasnoyarsk</timezone>
<timezone id="Asia/Bangkok">Bangkok</timezone>
<timezone id="Asia/Jakarta">Jakarta</timezone>
<timezone id="Asia/Shanghai">Beijing</timezone>
<timezone id="Asia/Hong_Kong">Hong Kong</timezone>
<timezone id="Asia/Irkutsk">Irkutsk</timezone>
<timezone id="Asia/Kuala_Lumpur">Kuala Lumpur</timezone>
<timezone id="Australia/Perth">Perth</timezone>
<timezone id="Asia/Taipei">Taipei</timezone>
<timezone id="Asia/Seoul">Seoul</timezone>
<timezone id="Asia/Tokyo">Tokyo, Osaka</timezone>
<timezone id="Asia/Yakutsk">Yakutsk</timezone>
<timezone id="Australia/Adelaide">Adelaide</timezone>
<timezone id="Australia/Darwin">Darwin</timezone>
<timezone id="Australia/Brisbane">Brisbane</timezone>
<timezone id="Australia/Hobart">Hobart</timezone>
<timezone id="Australia/Sydney">Sydney, Canberra</timezone>
<timezone id="Asia/Vladivostok">Vladivostok</timezone>
<timezone id="Pacific/Guam">Guam</timezone>
<timezone id="Asia/Magadan">Magadan</timezone>
<timezone id="Pacific/Auckland">Auckland</timezone>
<timezone id="Pacific/Fiji">Fiji</timezone>
<timezone id="Pacific/Tongatapu">Tonga</timezone>
</timezones>

View File

@ -0,0 +1,58 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard;
import android.app.Application;
import android.app.StatusBarManager;
import android.content.Context;
public class SetupWizardApp extends Application {
public static final String TAG = SetupWizardApp.class.getSimpleName();
// Leave this off for release
public static final boolean DEBUG = false;
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 EXTRA_FIRST_RUN = "firstRun";
public static final String EXTRA_ALLOW_SKIP = "allowSkip";
public static final String EXTRA_AUTO_FINISH = "wifi_auto_finish_on_connect";
public static final int REQUEST_CODE_SETUP_WIFI = 0;
private StatusBarManager mStatusBarManager;
@Override
public void onCreate() {
super.onCreate();
mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);
}
public void disableStatusBar() {
mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
| StatusBarManager.DISABLE_NOTIFICATION_TICKER | StatusBarManager.DISABLE_RECENT | StatusBarManager.DISABLE_HOME
| StatusBarManager.DISABLE_SEARCH);
}
public void enableStatusBar() {
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
}
}

View File

@ -0,0 +1,155 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import java.util.ArrayList;
public abstract class AbstractSetupData implements SetupDataCallbacks {
private static final String TAG = AbstractSetupData.class.getSimpleName();
protected Context mContext;
private ArrayList<SetupDataCallbacks> mListeners = new ArrayList<SetupDataCallbacks>();
private PageList mPageList;
private int mCurrentPageIndex = 0;
public AbstractSetupData(Context context) {
mContext = context;
mPageList = onNewPageList();
}
protected abstract PageList onNewPageList();
@Override
public void onPageLoaded(Page page) {
for (int i = 0; i < mListeners.size(); i++) {
mListeners.get(i).onPageLoaded(page);
}
}
@Override
public void onPageTreeChanged() {
for (int i = 0; i < mListeners.size(); i++) {
mListeners.get(i).onPageTreeChanged();
}
}
@Override
public void onFinish() {
for (int i = 0; i < mListeners.size(); i++) {
mListeners.get(i).onFinish();
}
}
@Override
public Page getPage(String key) {
return mPageList.getPage(key);
}
@Override
public Page getPage(int index) {
return mPageList.getPage(index);
}
public Page getCurrentPage() {
return mPageList.getPage(mCurrentPageIndex);
}
public boolean isFirstPage() {
return mCurrentPageIndex == 0;
}
public boolean isLastPage() {
return mCurrentPageIndex == mPageList.size() - 1;
}
@Override
public void onNextPage() {
if (getCurrentPage().doNextAction() == false) {
if (advanceToNextUncompleted()) {
for (int i = 0; i < mListeners.size(); i++) {
mListeners.get(i).onNextPage();
}
}
}
}
@Override
public void onPreviousPage() {
if (getCurrentPage().doPreviousAction() == false) {
if (advanceToPreviousUncompleted()) {
for (int i = 0; i < mListeners.size(); i++) {
mListeners.get(i).onPreviousPage();
}
}
}
}
@Override
public void onPageViewCreated(LayoutInflater inflater, Bundle savedInstanceState,
int layoutResource) {}
private boolean advanceToNextUncompleted() {
while (mCurrentPageIndex < mPageList.size()) {
mCurrentPageIndex++;
if (!getCurrentPage().isCompleted()) {
return true;
}
}
return false;
}
private boolean advanceToPreviousUncompleted() {
while (mCurrentPageIndex > 0) {
mCurrentPageIndex--;
if (!getCurrentPage().isCompleted()) {
return true;
}
}
return false;
}
public void load(Bundle savedValues) {
for (String key : savedValues.keySet()) {
Page page = mPageList.getPage(key);
if (page != null) {
page.resetData(savedValues.getBundle(key));
}
}
}
public Bundle save() {
Bundle bundle = new Bundle();
for (Page page : mPageList.values()) {
bundle.putBundle(page.getKey(), page.getData());
}
return bundle;
}
public void registerListener(SetupDataCallbacks listener) {
mListeners.add(listener);
}
public void unregisterListener(SetupDataCallbacks listener) {
mListeners.remove(listener);
}
}

View File

@ -0,0 +1,59 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
import android.content.Context;
import android.telephony.SubscriptionManager;
import java.util.ArrayList;
public class CMSetupWizardData extends AbstractSetupData {
public CMSetupWizardData(Context context) {
super(context);
}
@Override
protected PageList onNewPageList() {
ArrayList<SetupPage> pages = new ArrayList<SetupPage>();
pages.add(new WelcomePage(mContext, this));
pages.add(new WifiSetupPage(mContext, this));
if (SetupWizardUtils.isGSMPhone(mContext) && SetupWizardUtils.isSimMissing(mContext)) {
pages.add(new SimCardMissingPage(mContext, this));
}
if (SetupWizardUtils.isMultiSimDevice(mContext)
&& SubscriptionManager.getActiveSubInfoCount() > 1) {
pages.add(new ChooseDataSimPage(mContext, this));
}
if (SetupWizardUtils.hasTelephony(mContext) &&
!SetupWizardUtils.isMobileDataEnabled(mContext)) {
pages.add(new MobileDataPage(mContext, this));
}
if (SetupWizardUtils.hasGMS(mContext)) {
pages.add(new GmsAccountPage(mContext, this));
}
pages.add(new CyanogenAccountPage(mContext, this));
pages.add(new LocationSettingsPage(mContext, this));
pages.add(new DateTimePage(mContext, this));
pages.add(new FinishPage(mContext, this));
return new PageList(pages.toArray(new SetupPage[pages.size()]));
}
}

View File

@ -0,0 +1,267 @@
/*
* Copyright (C) 2014 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.
*/
package com.cyanogenmod.setupwizard.setup;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubInfoRecord;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import java.util.List;
public class ChooseDataSimPage extends SetupPage {
public static final String TAG = "ChooseDataSimPage";
public ChooseDataSimPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment() {
Bundle args = new Bundle();
args.putString(SetupPage.KEY_PAGE_ARGUMENT, getKey());
ChooseDataSimFragment fragment = new ChooseDataSimFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_choose_data_sim;
}
@Override
public int getNextButtonTitleResId() {
return R.string.skip;
}
public static class ChooseDataSimFragment extends SetupPageFragment {
private ViewGroup mPageView;
private SparseArray<TextView> mNameViews;
private SparseArray<ImageView> mSignalViews;
private SparseArray<CheckBox> mCheckBoxes;
private TelephonyManager mPhone;
private List<SubInfoRecord> mSubInfoRecords;
private SparseArray<SignalStrength> mSignalStrengths;
private SparseArray<ServiceState> mServiceStates;
private SparseArray<PhoneStateListener> mPhoneStateListeners;
private View.OnClickListener mSetDataSimClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
SubInfoRecord subInfoRecord = (SubInfoRecord)view.getTag();
if (subInfoRecord != null) {
SubscriptionManager.setDefaultDataSubId(subInfoRecord.subId);
setDataSubChecked(subInfoRecord);
}
}
};
@Override
protected void initializePage() {
mPageView = (ViewGroup)mRootView.findViewById(R.id.page_view);
mSubInfoRecords = SubscriptionManager.getActiveSubInfoList();
int simCount = mSubInfoRecords.size();
mNameViews = new SparseArray<TextView>(simCount);
mSignalViews = new SparseArray<ImageView>(simCount);
mCheckBoxes = new SparseArray<CheckBox>(simCount);
mServiceStates = new SparseArray<ServiceState>(simCount);
mSignalStrengths = new SparseArray<SignalStrength>(simCount);
mPhoneStateListeners = new SparseArray<PhoneStateListener>(simCount);
LayoutInflater inflater = LayoutInflater.from(getActivity());
for (int i = 0; i < simCount; i++) {
View simRow = inflater.inflate(R.layout.data_sim_row, null);
mPageView.addView(simRow);
SubInfoRecord subInfoRecord = mSubInfoRecords.get(i);
simRow.setTag(subInfoRecord);
simRow.setOnClickListener(mSetDataSimClickListener);
mNameViews.put(i, (TextView) simRow.findViewById(R.id.sim_title));
mSignalViews.put(i, (ImageView) simRow.findViewById(R.id.signal));
mCheckBoxes.put(i, (CheckBox) simRow.findViewById(R.id.enable_check));
mPhoneStateListeners.put(i, createPhoneStateListener(subInfoRecord));
mPageView.addView(inflater.inflate(R.layout.divider, null));
}
mPhone = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
for (int i = 0; i < mPhoneStateListeners.size(); i++) {
mPhone.listen(mPhoneStateListeners.get(i),
PhoneStateListener.LISTEN_SERVICE_STATE
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
updateSignalStrengths();
updateCurrentDataSub();
}
@Override
protected int getLayoutResource() {
return R.layout.choose_data_sim_page;
}
@Override
public void onResume() {
super.onResume();
updateSignalStrengths();
updateCurrentDataSub();
}
@Override
public void onDetach() {
super.onDetach();
for (int i = 0; i < mPhoneStateListeners.size(); i++) {
mPhone.listen(mPhoneStateListeners.get(i), PhoneStateListener.LISTEN_NONE);
}
}
private PhoneStateListener createPhoneStateListener(final SubInfoRecord subInfoRecord) {
return new PhoneStateListener(subInfoRecord.subId) {
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
mSignalStrengths.put(subInfoRecord.slotId, signalStrength);
updateSignalStrength(subInfoRecord);
}
@Override
public void onServiceStateChanged(ServiceState state) {
mServiceStates.put(subInfoRecord.slotId, state);
updateSignalStrength(subInfoRecord);
}
};
}
private void updateSignalStrengths() {
for (int i = 0; i < mSubInfoRecords.size(); i++) {
updateSignalStrength(mSubInfoRecords.get(i));
}
}
private void setDataSubChecked(SubInfoRecord subInfoRecord) {
for (int i = 0; i < mCheckBoxes.size(); i++) {
mCheckBoxes.get(i).setChecked(subInfoRecord.slotId == i);
}
}
private void updateCurrentDataSub() {
for (int i = 0; i < mSubInfoRecords.size(); i++) {
SubInfoRecord subInfoRecord = mSubInfoRecords.get(i);
mCheckBoxes.get(i).setChecked(SubscriptionManager.getDefaultDataSubId()
== subInfoRecord.subId);
}
}
private void updateCarrierText(SubInfoRecord subInfoRecord) {
String name = mPhone.getNetworkOperatorName(subInfoRecord.subId);
ServiceState serviceState = mServiceStates.get(subInfoRecord.slotId);
if (TextUtils.isEmpty(name)) {
if (serviceState != null && serviceState.isEmergencyOnly()) {
name = getString(R.string.setup_mobile_data_emergency_only);
} else {
name = getString(R.string.setup_mobile_data_no_service);
}
}
String formattedName =
getString(R.string.data_sim_name, subInfoRecord.slotId + 1, name);
mNameViews.get(subInfoRecord.slotId).setText(formattedName);
}
private void updateSignalStrength(SubInfoRecord subInfoRecord) {
ImageView signalView = mSignalViews.get(subInfoRecord.slotId);
SignalStrength signalStrength = mSignalStrengths.get(subInfoRecord.slotId);
if (!hasService(subInfoRecord)) {
signalView.setImageResource(R.drawable.ic_signal_no_signal);
} else {
if (signalStrength != null) {
int resId;
switch (signalStrength.getLevel()) {
case 4:
resId = R.drawable.ic_signal_4;
break;
case 3:
resId = R.drawable.ic_signal_3;
break;
case 2:
resId = R.drawable.ic_signal_2;
break;
case 1:
resId = R.drawable.ic_signal_1;
break;
default:
resId = R.drawable.ic_signal_0;
break;
}
signalView.setImageResource(resId);
}
}
updateCarrierText(subInfoRecord);
}
private boolean hasService(SubInfoRecord subInfoRecord) {
boolean retVal;
ServiceState serviceState = mServiceStates.get(subInfoRecord.slotId);
if (serviceState != null) {
// Consider the device to be in service if either voice or data service is available.
// Some SIM cards are marketed as data-only and do not support voice service, and on
// these SIM cards, we want to show signal bars for data service as well as the "no
// service" or "emergency calls only" text that indicates that voice is not available.
switch(serviceState.getVoiceRegState()) {
case ServiceState.STATE_POWER_OFF:
retVal = false;
break;
case ServiceState.STATE_OUT_OF_SERVICE:
case ServiceState.STATE_EMERGENCY_ONLY:
retVal = serviceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
break;
default:
retVal = true;
}
} else {
retVal = false;
}
Log.d(TAG, "hasService: mServiceState=" + serviceState + " retVal=" + retVal);
return retVal;
}
}
}

View File

@ -0,0 +1,83 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.cyanogenmod.setupwizard.R;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
public class CyanogenAccountPage extends SetupPage {
public static final String TAG = "CyanogenAccountPage";
public CyanogenAccountPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public int getNextButtonTitleResId() {
return R.string.skip;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return -1;
}
@Override
public void doLoadAction(Activity context, int action) {
launchCyanogenAccountSetup(context, action);
}
public void launchCyanogenAccountSetup(final Activity activity, final int action) {
Bundle bundle = new Bundle();
bundle.putBoolean(SetupWizardApp.EXTRA_FIRST_RUN, true);
AccountManager
.get(activity).addAccount(SetupWizardApp.ACCOUNT_TYPE_CYANOGEN, null, null, bundle,
activity, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> bundleAccountManagerFuture) {
if (activity == null) return; //There is a chance this activity has been torn down.
if (accountExists(activity, SetupWizardApp.ACCOUNT_TYPE_CYANOGEN)) {
setCompleted(true);
getCallbacks().onNextPage();
} else {
if (action == Page.ACTION_NEXT) {
getCallbacks().onNextPage();
} else {
getCallbacks().onPreviousPage();
}
}
}
}, null);
}
private boolean accountExists(Activity activity, String accountType) {
return AccountManager.get(activity).getAccountsByType(accountType).length > 0;
}
}

View File

@ -0,0 +1,464 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.TimePickerDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.DatePicker;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
public class DateTimePage extends SetupPage {
public static final String TAG = "DateTimePage";
private static final String KEY_ID = "id"; // value: String
private static final String KEY_DISPLAYNAME = "name"; // value: String
private static final String KEY_GMT = "gmt"; // value: String
private static final String KEY_OFFSET = "offset"; // value: int (Integer)
private static final String XMLTAG_TIMEZONE = "timezone";
private static final int HOURS_1 = 60 * 60000;
public DateTimePage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment() {
Bundle args = new Bundle();
args.putString(SetupPage.KEY_PAGE_ARGUMENT, getKey());
DateTimeFragment fragment = new DateTimeFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_datetime;
}
public static class DateTimeFragment extends SetupPageFragment
implements TimePickerDialog.OnTimeSetListener, DatePickerDialog.OnDateSetListener {
private TimeZone mCurrentTimeZone;
private View mDateView;
private View mTimeView;
private TextView mDateTextView;
private TextView mTimeTextView;
private final Handler mHandler = new Handler();
@Override
public void onResume() {
super.onResume();
// Register for time ticks and other reasons for time change
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
getActivity().registerReceiver(mIntentReceiver, filter, null, null);
updateTimeAndDateDisplay(getActivity());
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(mIntentReceiver);
}
@Override
protected void initializePage() {
final Spinner spinner = (Spinner) mRootView.findViewById(R.id.timezone_list);
final SimpleAdapter adapter = constructTimezoneAdapter(getActivity(), false);
mCurrentTimeZone = TimeZone.getDefault();
mDateView = mRootView.findViewById(R.id.date_item);
mDateView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDatePicker();
}
});
mTimeView = mRootView.findViewById(R.id.time_item);
mTimeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showTimePicker();
}
});
mDateTextView = (TextView)mRootView.findViewById(R.id.date_text);
mTimeTextView = (TextView)mRootView.findViewById(R.id.time_text);
// Pre-select current/default timezone
mHandler.post(new Runnable() {
@Override
public void run() {
int tzIndex = getTimeZoneIndex(adapter, mCurrentTimeZone);
spinner.setAdapter(adapter);
if (tzIndex != -1) {
spinner.setSelection(tzIndex);
}
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
final Map<?, ?> map = (Map<?, ?>) adapterView.getItemAtPosition(position);
final String tzId = (String) map.get(KEY_ID);
if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) {
// Update the system timezone value
final Activity activity = getActivity();
final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
alarm.setTimeZone(tzId);
mCurrentTimeZone = TimeZone.getTimeZone(tzId);
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
});
}
private void showDatePicker() {
DatePickerFragment datePickerFragment = DatePickerFragment.newInstance();
datePickerFragment.setOnDateSetListener(this);
datePickerFragment.show(getFragmentManager(), DatePickerFragment.TAG);
}
private void showTimePicker() {
TimePickerFragment timePickerFragment = TimePickerFragment.newInstance();
timePickerFragment.setOnTimeSetListener(this);
timePickerFragment.show(getFragmentManager(), TimePickerFragment.TAG);
}
public void updateTimeAndDateDisplay(Context context) {
java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(context);
final Calendar now = Calendar.getInstance();
mTimeTextView.setText(DateFormat.getTimeFormat(getActivity()).format(now.getTime()));
mDateTextView.setText(shortDateFormat.format(now.getTime()));
}
@Override
protected int getLayoutResource() {
return R.layout.setup_datetime_page;
}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
final Activity activity = getActivity();
if (activity != null) {
setDate(activity, year, month, day);
updateTimeAndDateDisplay(activity);
}
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
final Activity activity = getActivity();
if (activity != null) {
setTime(activity, hourOfDay, minute);
updateTimeAndDateDisplay(activity);
}
}
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final Activity activity = getActivity();
if (activity != null) {
updateTimeAndDateDisplay(activity);
}
}
};
}
private static SimpleAdapter constructTimezoneAdapter(Context context,
boolean sortedByName) {
final String[] from = new String[] {KEY_DISPLAYNAME, KEY_GMT};
final int[] to = new int[] {android.R.id.text1, android.R.id.text2};
final String sortKey = (sortedByName ? KEY_DISPLAYNAME : KEY_OFFSET);
final TimeZoneComparator comparator = new TimeZoneComparator(sortKey);
final List<HashMap<String, Object>> sortedList = getZones(context);
Collections.sort(sortedList, comparator);
final SimpleAdapter adapter = new SimpleAdapter(context,
sortedList,
R.layout.date_time_setup_custom_list_item_2,
from,
to);
return adapter;
}
private static List<HashMap<String, Object>> getZones(Context context) {
final List<HashMap<String, Object>> myData = new ArrayList<HashMap<String, Object>>();
final long date = Calendar.getInstance().getTimeInMillis();
try {
XmlResourceParser xrp = context.getResources().getXml(R.xml.timezones);
while (xrp.next() != XmlResourceParser.START_TAG)
continue;
xrp.next();
while (xrp.getEventType() != XmlResourceParser.END_TAG) {
while (xrp.getEventType() != XmlResourceParser.START_TAG) {
if (xrp.getEventType() == XmlResourceParser.END_DOCUMENT) {
return myData;
}
xrp.next();
}
if (xrp.getName().equals(XMLTAG_TIMEZONE)) {
String id = xrp.getAttributeValue(0);
String displayName = xrp.nextText();
addItem(myData, id, displayName, date);
}
while (xrp.getEventType() != XmlResourceParser.END_TAG) {
xrp.next();
}
xrp.next();
}
xrp.close();
} catch (XmlPullParserException xppe) {
Log.e(TAG, "Ill-formatted timezones.xml file");
} catch (java.io.IOException ioe) {
Log.e(TAG, "Unable to read timezones.xml file");
}
return myData;
}
private static void addItem(
List<HashMap<String, Object>> myData, String id, String displayName, long date) {
final HashMap<String, Object> map = new HashMap<String, Object>();
map.put(KEY_ID, id);
map.put(KEY_DISPLAYNAME, displayName);
final TimeZone tz = TimeZone.getTimeZone(id);
final int offset = tz.getOffset(date);
final int p = Math.abs(offset);
final StringBuilder name = new StringBuilder();
name.append("GMT");
if (offset < 0) {
name.append('-');
} else {
name.append('+');
}
name.append(p / (HOURS_1));
name.append(':');
int min = p / 60000;
min %= 60;
if (min < 10) {
name.append('0');
}
name.append(min);
map.put(KEY_GMT, name.toString());
map.put(KEY_OFFSET, offset);
myData.add(map);
}
private static int getTimeZoneIndex(SimpleAdapter adapter, TimeZone tz) {
final String defaultId = tz.getID();
final int listSize = adapter.getCount();
for (int i = 0; i < listSize; i++) {
// Using HashMap<String, Object> induces unnecessary warning.
final HashMap<?,?> map = (HashMap<?,?>)adapter.getItem(i);
final String id = (String)map.get(KEY_ID);
if (defaultId.equals(id)) {
// If current timezone is in this list, move focus to it
return i;
}
}
return -1;
}
private static void setDate(Context context, int year, int month, int day) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
long when = c.getTimeInMillis();
if (when / 1000 < Integer.MAX_VALUE) {
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
}
}
private static void setTime(Context context, int hourOfDay, int minute) {
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, hourOfDay);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
long when = c.getTimeInMillis();
if (when / 1000 < Integer.MAX_VALUE) {
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
}
}
private static class TimeZoneComparator implements Comparator<HashMap<?, ?>> {
private String mSortingKey;
public TimeZoneComparator(String sortingKey) {
mSortingKey = sortingKey;
}
public void setSortingKey(String sortingKey) {
mSortingKey = sortingKey;
}
public int compare(HashMap<?, ?> map1, HashMap<?, ?> map2) {
Object value1 = map1.get(mSortingKey);
Object value2 = map2.get(mSortingKey);
/*
* This should never happen, but just in-case, put non-comparable
* items at the end.
*/
if (!isComparable(value1)) {
return isComparable(value2) ? 1 : 0;
} else if (!isComparable(value2)) {
return -1;
}
return ((Comparable) value1).compareTo(value2);
}
private boolean isComparable(Object value) {
return (value != null) && (value instanceof Comparable);
}
}
private static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
private static String TAG = TimePickerFragment.class.getSimpleName();
private TimePickerDialog.OnTimeSetListener mOnTimeSetListener;
public static TimePickerFragment newInstance() {
TimePickerFragment frag = new TimePickerFragment();
return frag;
}
private void setOnTimeSetListener(TimePickerDialog.OnTimeSetListener onTimeSetListener) {
mOnTimeSetListener = onTimeSetListener;
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
if (mOnTimeSetListener != null) {
mOnTimeSetListener.onTimeSet(view, hourOfDay, minute);
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar calendar = Calendar.getInstance();
return new TimePickerDialog(
getActivity(),
this,
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
DateFormat.is24HourFormat(getActivity()));
}
}
private static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private static String TAG = DatePickerFragment.class.getSimpleName();
private DatePickerDialog.OnDateSetListener mOnDateSetListener;
public static DatePickerFragment newInstance() {
DatePickerFragment frag = new DatePickerFragment();
return frag;
}
private void setOnDateSetListener(DatePickerDialog.OnDateSetListener onDateSetListener) {
mOnDateSetListener = onDateSetListener;
}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
if (mOnDateSetListener != null) {
mOnDateSetListener.onDateSet(view, year, month, day);
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar calendar = Calendar.getInstance();
return new DatePickerDialog(
getActivity(),
this,
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
}
}
}

View File

@ -0,0 +1,86 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
public class FinishPage extends SetupPage {
public static final String TAG = "FinishPage";
public FinishPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment() {
Bundle args = new Bundle();
args.putString(SetupPage.KEY_PAGE_ARGUMENT, getKey());
FinishFragment fragment = new FinishFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_complete;
}
@Override
public boolean doNextAction() {
getCallbacks().onFinish();
return true;
}
@Override
public int getNextButtonTitleResId() {
return R.string.start;
}
@Override
public int getPrevButtonTitleResId() {
return -1;
}
public static class FinishFragment extends SetupPageFragment {
@Override
protected void initializePage() {}
@Override
protected int getLayoutResource() {
return R.layout.setup_finished_page;
}
@Override
protected int getHeaderLayoutResource() {
return -1;
}
}
}

View File

@ -0,0 +1,90 @@
/*
* Copyright (C) 2013 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.
*/
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.content.Context;
import android.os.Bundle;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.SetupWizardApp;
import java.io.IOException;
public class GmsAccountPage extends SetupPage {
public static final String TAG = "GmsAccountPage";
public GmsAccountPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_gms_account;
}
@Override
public int getNextButtonTitleResId() {
return R.string.skip;
}
@Override
public void doLoadAction(Activity context, int action) {
launchGmsAccountSetup(context, action);
}
public void launchGmsAccountSetup(final Activity activity, final int action) {
Bundle bundle = new Bundle();
bundle.putBoolean(SetupWizardApp.EXTRA_FIRST_RUN, true);
bundle.putBoolean(SetupWizardApp.EXTRA_ALLOW_SKIP, true);
AccountManager
.get(activity).addAccount(SetupWizardApp.ACCOUNT_TYPE_GMS, null, null,
bundle, activity, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> bundleAccountManagerFuture) {
//There is a chance this activity has been torn down.
if (activity == null) return;
String token = null;
try {
token = bundleAccountManagerFuture.getResult().getString(AccountManager.KEY_AUTHTOKEN);
} catch (OperationCanceledException e) {
} catch (IOException e) {
} catch (AuthenticatorException e) {
}
if (token != null) {
setCompleted(true);
}
if (action == Page.ACTION_NEXT) {
getCallbacks().onNextPage();
} else {
getCallbacks().onPreviousPage();
}
}
}, null);
}
}

View File

@ -0,0 +1,194 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import android.app.Fragment;
import android.content.ContentQueryMap;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.CheckBox;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import java.util.Observable;
import java.util.Observer;
public class LocationSettingsPage extends SetupPage {
private static final String TAG = "LocationSettingsPage";
public LocationSettingsPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment() {
Bundle args = new Bundle();
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
LocationSettingsFragment fragment = new LocationSettingsFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_location;
}
public static class LocationSettingsFragment extends SetupPageFragment {
private View mLocationRow;
private View mGpsRow;
private View mNetworkRow;
private CheckBox mNetwork;
private CheckBox mGps;
private CheckBox mLocationAccess;
private ContentResolver mContentResolver;
// These provide support for receiving notification when Location Manager settings change.
// This is necessary because the Network Location Provider can change settings
// if the user does not confirm enabling the provider.
private ContentQueryMap mContentQueryMap;
private Observer mSettingsObserver;
private View.OnClickListener mLocationClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
onToggleLocationAccess(!mLocationAccess.isChecked());
}
};
private View.OnClickListener mGpsClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Settings.Secure.setLocationProviderEnabled(mContentResolver,
LocationManager.GPS_PROVIDER, !mGps.isChecked());
}
};
private View.OnClickListener mNetworkClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Settings.Secure.setLocationProviderEnabled(mContentResolver,
LocationManager.NETWORK_PROVIDER, !mNetwork.isChecked());
}
};
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mContentResolver = getActivity().getContentResolver();
getActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.primary_dark));
}
@Override
protected void initializePage() {
mLocationRow = mRootView.findViewById(R.id.location);
mLocationRow.setOnClickListener(mLocationClickListener);
mLocationAccess = (CheckBox) mRootView.findViewById(R.id.location_checkbox);
mGpsRow = mRootView.findViewById(R.id.gps);
mGpsRow.setOnClickListener(mGpsClickListener);
mGps = (CheckBox) mRootView.findViewById(R.id.gps_checkbox);
mNetworkRow = mRootView.findViewById(R.id.network);
mNetworkRow.setOnClickListener(mNetworkClickListener);
mNetwork = (CheckBox) mRootView.findViewById(R.id.network_checkbox);
}
@Override
protected int getLayoutResource() {
return R.layout.location_settings;
}
@Override
protected int getHeaderLayoutResource() {
return R.layout.header_condensed;
}
@Override
public void onResume() {
super.onResume();
updateLocationToggles();
if (mSettingsObserver == null) {
mSettingsObserver = new Observer() {
public void update(Observable o, Object arg) {
updateLocationToggles();
}
};
}
mContentQueryMap.addObserver(mSettingsObserver);
}
@Override
public void onStart() {
super.onStart();
// listen for Location Manager settings changes
Cursor settingsCursor = getActivity().getContentResolver().query(Settings.Secure.CONTENT_URI, null,
"(" + Settings.System.NAME + "=?)",
new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
null);
mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
}
@Override
public void onStop() {
super.onStop();
if (mSettingsObserver != null) {
mContentQueryMap.deleteObserver(mSettingsObserver);
}
mContentQueryMap.close();
}
private void updateLocationToggles() {
boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(
mContentResolver, LocationManager.GPS_PROVIDER);
boolean networkEnabled = Settings.Secure.isLocationProviderEnabled(
mContentResolver, LocationManager.NETWORK_PROVIDER);
mGps.setChecked(gpsEnabled);
mNetwork.setChecked(networkEnabled);
mLocationAccess.setChecked(gpsEnabled || networkEnabled);
}
private void onToggleLocationAccess(boolean checked) {
Settings.Secure.setLocationProviderEnabled(mContentResolver,
LocationManager.GPS_PROVIDER, checked);
mGps.setEnabled(checked);
mGpsRow.setEnabled(checked);
Settings.Secure.setLocationProviderEnabled(mContentResolver,
LocationManager.NETWORK_PROVIDER, checked);
mNetwork.setEnabled(checked);
mNetworkRow.setEnabled(checked);
updateLocationToggles();
}
}
}

View File

@ -0,0 +1,211 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;
import com.cyanogenmod.setupwizard.R;
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
public class MobileDataPage extends SetupPage {
public static final String TAG = "MobileDataPage";
public MobileDataPage(Context context, SetupDataCallbacks callbacks) {
super(context, callbacks);
}
@Override
public Fragment getFragment() {
Bundle args = new Bundle();
args.putString(SetupPage.KEY_PAGE_ARGUMENT, getKey());
MobileDataFragment fragment = new MobileDataFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public String getKey() {
return TAG;
}
@Override
public int getTitleResId() {
return R.string.setup_mobile_data;
}
public static class MobileDataFragment extends SetupPageFragment {
private View mEnableDataRow;
private Switch mEnableMobileData;
private ImageView mSignalView;
private TextView mNameView;
private TelephonyManager mPhone;
private SignalStrength mSignalStrength;
private ServiceState mServiceState;
private PhoneStateListener mPhoneStateListener =
new PhoneStateListener(SubscriptionManager.getDefaultDataSubId()) {
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
mSignalStrength = signalStrength;
updateSignalStrength();
}
@Override
public void onServiceStateChanged(ServiceState state) {
mServiceState = state;
updateSignalStrength();
}
};
private View.OnClickListener mEnableDataClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean checked = !mEnableMobileData.isChecked();
SetupWizardUtils.setMobileDataEnabled(getActivity(), checked);
mEnableMobileData.setChecked(checked);
}
};
@Override
protected void initializePage() {
mEnableDataRow = mRootView.findViewById(R.id.data);
mEnableDataRow.setOnClickListener(mEnableDataClickListener);
mEnableMobileData = (Switch) mRootView.findViewById(R.id.data_switch);
mSignalView = (ImageView) mRootView.findViewById(R.id.signal);
mNameView = (TextView) mRootView.findViewById(R.id.enable_data_title);
updateDataConnectionStatus();
updateSignalStrength();
}
@Override
protected int getLayoutResource() {
return R.layout.mobile_data_settings;
}
@Override
public void onResume() {
super.onResume();
updateDataConnectionStatus();
updateSignalStrength();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mPhone = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
mPhone.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_SERVICE_STATE
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
@Override
public void onDetach() {
super.onDetach();
mPhone.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
private void updateCarrierText() {
String name = mPhone.getNetworkOperatorName(SubscriptionManager.getDefaultDataSubId());
if (TextUtils.isEmpty(name)) {
if (mServiceState != null && mServiceState.isEmergencyOnly()) {
name = getString(R.string.setup_mobile_data_emergency_only);
} else {
name = getString(R.string.setup_mobile_data_no_service);
}
}
mNameView.setText(name);
}
private void updateSignalStrength() {
if (!hasService()) {
mSignalView.setImageResource(R.drawable.ic_signal_no_signal);
} else {
if (mSignalStrength != null) {
int resId;
switch (mSignalStrength.getLevel()) {
case 4:
resId = R.drawable.ic_signal_4;
break;
case 3:
resId = R.drawable.ic_signal_3;
break;
case 2:
resId = R.drawable.ic_signal_2;
break;
case 1:
resId = R.drawable.ic_signal_1;
break;
default:
resId = R.drawable.ic_signal_0;
break;
}
mSignalView.setImageResource(resId);
}
}
updateCarrierText();
}
private void updateDataConnectionStatus() {
mEnableMobileData.setChecked(SetupWizardUtils.isMobileDataEnabled(getActivity()));
}
private boolean hasService() {
boolean retVal;
if (mServiceState != null) {
// Consider the device to be in service if either voice or data service is available.
// Some SIM cards are marketed as data-only and do not support voice service, and on
// these SIM cards, we want to show signal bars for data service as well as the "no
// service" or "emergency calls only" text that indicates that voice is not available.
switch(mServiceState.getVoiceRegState()) {
case ServiceState.STATE_POWER_OFF:
retVal = false;
break;
case ServiceState.STATE_OUT_OF_SERVICE:
case ServiceState.STATE_EMERGENCY_ONLY:
retVal = mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
break;
default:
retVal = true;
}
} else {
retVal = false;
}
return retVal;
}
}
}

View File

@ -0,0 +1,46 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
public interface Page {
public static final String KEY_PAGE_ARGUMENT = "key_arg";
public static final int ACTION_NEXT = 1;
public static final int ACTION_PREVIOUS = 2;
public String getKey();
public int getTitleResId();
public int getPrevButtonTitleResId();
public int getNextButtonTitleResId();
public Fragment getFragment();
public Bundle getData();
public void resetData(Bundle data);
public boolean isRequired();
public Page setRequired(boolean required);
public boolean isCompleted();
public void setCompleted(boolean completed);
public boolean doPreviousAction();
public boolean doNextAction();
public void doLoadAction(Activity context, int action);
public abstract boolean onActivityResult(int requestCode, int resultCode, Intent data);
}

View File

@ -0,0 +1,44 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import java.util.LinkedHashMap;
public class PageList extends LinkedHashMap<String, Page> {
public PageList(Page... pages) {
for (Page page : pages) {
put(page.getKey(), page);
}
}
public Page getPage(String key) {
return get(key);
}
public Page getPage(int index) {
int i=0;
for (Page page : values()) {
if (i == index) {
return page;
}
i++;
}
return null;
}
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import android.os.Bundle;
import android.view.LayoutInflater;
public interface SetupDataCallbacks {
void onNextPage();
void onPreviousPage();
void onPageLoaded(Page page);
void onPageTreeChanged();
void onFinish();
Page getPage(String key);
Page getPage(int key);
void onPageViewCreated(LayoutInflater inflater, Bundle savedInstanceState, int layoutResource);
}

View File

@ -0,0 +1,126 @@
/*
* Copyright (C) 2013 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.
*/
package com.cyanogenmod.setupwizard.setup;
import com.cyanogenmod.setupwizard.R;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public abstract class SetupPage implements Page {
private final SetupDataCallbacks mCallbacks;
private Bundle mData = new Bundle();
private boolean mRequired = false;
private boolean mCompleted = false;
protected final Context mContext;
protected SetupPage(Context context, SetupDataCallbacks callbacks) {
mContext = context;
mCallbacks = callbacks;
}
@Override
public Fragment getFragment() {
return null;
}
@Override
public int getPrevButtonTitleResId() {
return -1;
}
@Override
public int getNextButtonTitleResId() {
return R.string.next;
}
@Override
public boolean doNextAction() {
return false;
}
@Override
public boolean doPreviousAction() {
return false;
}
@Override
public void doLoadAction(Activity context, int action) {
if (context == null || context.isFinishing()) { return; }
final FragmentManager fragmentManager = context.getFragmentManager();
if (action == Page.ACTION_NEXT) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.content, getFragment(), getKey());
transaction.commit();
} else {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.content, getFragment(), getKey());
transaction.commit();
}
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
return false;
}
@Override
public boolean isRequired() {
return mRequired;
}
@Override
public Page setRequired(boolean required) {
mRequired = required;
return this;
}
@Override
public boolean isCompleted() {
return mCompleted;
}
@Override
public void setCompleted(boolean completed) {
mCompleted = completed;
mCallbacks.onNextPage();
}
@Override
public Bundle getData() {
return mData;
}
@Override
public void resetData(Bundle data) {
mData = data;
mCallbacks.onPageLoaded(this);
}
protected SetupDataCallbacks getCallbacks() {
return mCallbacks;
}
}

Some files were not shown because too many files have changed in this diff Show More