Bug 720933 - Android Sync 0.3 code drop. a=mobile

Bug 718848 - Part 7: More link styling, pin display styling, alignment per UI feedback.
 Bug 718848 - Part 6: Fixed regression of progressbar layout.
 Bug 718848 - Part 5: Indentation alignment.
 Bug 718848 - Part 4: Fixes for links, icon blurriness, PIN display.
 Bug 718848 - Part 3: Whitespace changes.
 Bug 718848 - Part 2: Setting theme on start of Sync setup.
 Bug 718848 - Part 1: Theme and layout changes, per UI meeting.
 Bug 717075 - make classic setup hint text visible. Added basic SyncTheme.
 Bug 717691 - Part 1: fall back to supported cipher suites for older Android releases.
 Bug 717691 - Part 0: Specify HTTP 1.1 in HTTP requests.
 Bug 718848 - Part 2: fixed string revision: "computer" not "desktop".  r=rnewman
 Bug 719669 - Part 1: throw IncorrectZkpException when g^x^q % p = 1 in J-PAKE.
 Bug 719669 - Part 0: code reformatting and string tidying.
 Bug 718149 - go somewhere useful after Firefox Sync set up, on launch.
This commit is contained in:
Richard Newman 2012-01-25 17:20:00 -08:00
Родитель 810d4c676e
Коммит 69a6774d4f
20 изменённых файлов: 497 добавлений и 330 удалений

Просмотреть файл

@ -6,13 +6,18 @@
<!-- Main titles. -->
<!ENTITY sync.app.name.label '&syncBrand.fullName.label;'>
<!ENTITY sync.title.connect.label 'Connect to &syncBrand.shortName.label;'>
<!ENTITY sync.title.adddevice.label 'Add a &syncBrand.fullName.label; Account'>
<!ENTITY sync.title.pair.label 'Pair a Device'>
<!-- J-PAKE Key Screen -->
<!ENTITY sync.subtitle.connect.label 'To activate your new device, select “Set up &syncBrand.shortName.label;” on the device.'>
<!ENTITY sync.subtitle.header.label 'Enter this code on your computer'>
<!ENTITY sync.subtitle.connectlocation.label 'Select “&sync.title.pair.label;” in the &syncBrand.shortName.label; section of your desktop Firefox options.'>
<!ENTITY sync.subtitle.pair.label 'To activate, select “Pair a device” on your other device.'>
<!ENTITY sync.pin.default.label '...\n...\n...\n'>
<!ENTITY sync.pin.oneline.label '...'>
<!ENTITY sync.link.show.label 'Show me how.'>
<!ENTITY sync.link.advancedsetup.label 'Advanced setup...'>
<!ENTITY sync.link.nodevice.label 'I don\&apos;t have the device with me…'>
<!-- J-PAKE Waiting Screen -->

Просмотреть файл

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#000000" />
<stroke android:width="1dp" android:color="#FFFFFF" />
<padding
android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
</shape>

Просмотреть файл

@ -1,23 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/account_top"
style="@style/SyncTop">
<ImageView
style="@style/SyncTopIcon" />
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_connect" />
</LinearLayout>
<ScrollView
style="@style/SyncLayout" >
android:id="@+id/account_content"
style="@style/SyncLayout"
android:layout_below="@id/account_top"
android:layout_above="@+id/account_bottom">
<LinearLayout
style="@style/SyncLayout" >
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_connect" />
<View
style="@style/SyncViewLine" />
style="@style/SyncLayout.Vertical"
android:padding="20dp" >
<TextView
style="@style/SyncTextItem"
android:text="@string/sync_subtitle_account" />
android:text="@string/sync_subtitle_account"
android:layout_marginBottom="10dp" />
<EditText android:id="@+id/usernameInput"
style="@style/SyncEditItem"
@ -43,26 +51,26 @@
style="@style/SyncEditItem"
android:visibility="gone"
android:hint="@string/sync_input_server" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<Button
style="@style/SyncButtonCommon"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
<Button
android:id="@+id/accountConnectButton"
style="@style/SyncButtonCommon"
android:onClick="connectClickHandler"
android:clickable="false"
android:enabled="false"
android:text="@string/sync_button_connect" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</TableLayout>
<LinearLayout
android:id="@id/account_bottom"
style="@style/SyncBottom"
android:orientation="horizontal" >
<Button
style="@style/SyncButton"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
<Button
style="@style/SyncButton"
android:id="@+id/accountConnectButton"
android:onClick="connectClickHandler"
android:clickable="false"
android:enabled="false"
android:text="@string/sync_button_connect" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,65 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/setup_top"
style="@style/SyncTop" >
<ImageView
style="@style/SyncTopIcon" />
<TextView
android:id="@+id/setup_title"
style="@style/SyncTextTitle"
android:text="@string/sync_title_connect" />
</LinearLayout>
<ScrollView
style="@style/SyncLayout" >
style="@style/SyncLayout"
android:fillViewport="true"
android:layout_below="@id/setup_top"
android:layout_above="@+id/setup_bottom" >
<LinearLayout
style="@style/SyncLayout" >
<RelativeLayout
style="@style/SyncLayout.Vertical"
android:layout_height="fill_parent"
android:padding="15dp" >
<TextView
android:id="@+id/setup_title"
style="@style/SyncTextTitle"
android:text="@string/sync_title_connect" />
<View
android:layout_width="wrap_content"
android:layout_height="2dp"
android:background="#FFFFFF" />
android:id="@+id/setup_header"
style="@style/SyncTextItem"
android:gravity="left"
android:layout_marginTop="15dp"
android:text="@string/sync_subtitle_header"
android:textStyle="bold" />
<TextView
android:id="@+id/setup_subtitle"
style="@style/SyncTextItem"
android:layout_below="@id/setup_header"
android:gravity="left"
android:layout_marginTop="2dp"
android:text="@string/sync_subtitle_connect" />
<TextView
android:id="@+id/setup_subtitle"
style="@style/SyncTextItem"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/sync_subtitle_pair" />
<TextView
style="@style/SyncLinkItem"
android:onClick="showClickHandler"
android:text="@string/sync_link_show" />
android:id="@+id/setup_showme"
style="@style/SyncLinkItem"
android:layout_below="@id/setup_subtitle"
android:layout_marginTop="2dp"
android:onClick="showClickHandler"
android:text="@string/sync_link_show" />
<LinearLayout
style="@style/SyncTextItem"
android:orientation="vertical" >
<TextView
android:id="@+id/text_pin"
style="@style/SyncTextItem"
android:text="@string/sync_pin_default"
android:textSize="40dp" />
style="@style/SyncLayout"
android:layout_below="@id/setup_showme"
android:paddingTop="30dp"
android:paddingLeft="-15dp"
android:orientation="vertical" >
<TextView
android:id="@+id/text_pin1"
style="@style/SyncPinText" />
<TextView
android:id="@+id/text_pin2"
style="@style/SyncPinText" />
<TextView
android:id="@+id/text_pin3"
style="@style/SyncPinText" />
</LinearLayout>
<TextView
android:id="@+id/link_nodevice"
style="@style/SyncLinkItem"
android:onClick="manualClickHandler"
android:text="@string/sync_link_nodevice" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<Button
style="@style/SyncButtonCommon"
android:layout_marginTop="10dp"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
</LinearLayout>
</LinearLayout>
android:id="@+id/link_nodevice"
style="@style/SyncLinkItem"
android:layout_alignParentBottom="true"
android:gravity="center"
android:paddingBottom="5dp"
android:onClick="manualClickHandler"
android:text="@string/sync_link_advancedsetup" />
</RelativeLayout>
</ScrollView>
</TableLayout>
<LinearLayout
android:id="@id/setup_bottom"
style="@style/SyncBottom"
android:orientation="horizontal" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,41 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_fail" />
<View
style="@style/SyncViewLine" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/failure_top"
style="@style/SyncTop" >
<ImageView
style="@style/SyncTopIcon" />
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_fail" />
</LinearLayout>
<TextView
style="@style/SyncTextItem"
android:text="@string/sync_subtitle_fail" />
<TextView
style="@style/SyncTextItem"
android:layout_below="@id/failure_top"
android:layout_above="@+id/failure_bottom"
android:padding="20dp"
android:text="@string/sync_subtitle_fail" />
<LinearLayout
android:id="@id/failure_bottom"
style="@style/SyncBottom"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="tryAgainClickHandler"
android:text="@string/sync_button_tryagain" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
style="@style/SyncButtonCommon"
android:onClick="tryAgainClickHandler"
android:text="@string/sync_button_tryagain" />
<Button
style="@style/SyncButtonCommon"
android:onClick="manualClickHandler"
android:text="@string/sync_button_manual" />
</LinearLayout>
<Button
style="@style/SyncButtonCommon"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
</LinearLayout>
</TableLayout>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="manualClickHandler"
android:text="@string/sync_button_manual" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,23 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_connect" />
<View
style="@style/SyncViewLine" />
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateOnly="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" />
<TextView
style="@style/SyncTextItem"
android:text="@string/sync_jpake_subtitle_waiting" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/waiting_top"
style="@style/SyncTop" >
<ImageView
style="@style/SyncTopIcon" />
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_connect" />
</LinearLayout>
<ProgressBar
android:id="@+id/waiting_content1"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/waiting_top"
android:indeterminateOnly="true"
android:layout_marginTop="40dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="15dp"/>
<TextView
style="@style/SyncTextItem"
android:gravity="center"
android:layout_below="@id/waiting_content1"
android:text="@string/sync_jpake_subtitle_waiting" />
<LinearLayout
style="@style/SyncBottom">
<Button
style="@style/SyncButtonCommon"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
</TableLayout>
style="@style/SyncButton"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,18 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/internet_top"
style="@style/SyncTop">
<ImageView
style="@style/SyncTopIcon" />
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_fail" />
<View
style="@style/SyncViewLine"/>
<TextView
style="@style/SyncTextItem"
android:text="@string/sync_subtitle_nointernet" />
style="@style/SyncTextTitle"
android:text="@string/sync_title_fail" />
</LinearLayout>
<TextView
style="@style/SyncTextItem"
android:layout_below="@id/internet_top"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="@string/sync_subtitle_nointernet" />
<LinearLayout
style="@style/SyncBottom" >
<Button
style="@style/SyncButtonCommon"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_ok" />
</TableLayout>
style="@style/SyncButton"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_ok" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,28 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/pair_top"
style="@style/SyncTop" >
<ImageView
style="@style/SyncTopIcon" />
<TextView
android:id="@+id/setup_title"
style="@style/SyncTextTitle"
android:text="@string/sync_title_pair" />
</LinearLayout>
<ScrollView
style="@style/SyncLayout" >
style="@style/SyncLayout"
android:layout_below="@id/pair_top"
android:layout_above="@+id/pair_bottom" >
<LinearLayout
style="@style/SyncLayout" >
<TextView
android:id="@+id/setup_title"
style="@style/SyncTextTitle"
android:text="@string/sync_title_pair" />
<View
style="@style/SyncViewLine" />
style="@style/SyncLayout.Vertical"
android:gravity="center"
android:padding="10dp" >
<TextView
android:id="@+id/setup_subtitle"
style="@style/SyncTextItem"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:text="@string/sync_subtitle_connect" />
<TextView
style="@style/SyncLinkItem"
android:layout_marginBottom="10dp"
android:onClick="showClickHandler"
android:text="@string/sync_link_show" />
@ -32,16 +40,16 @@
android:gravity="center"
android:orientation="vertical" >
<EditText
android:id="@+id/pair_row1"
style="@style/SyncEditPin" />
<EditText
android:id="@+id/pair_row2"
style="@style/SyncEditPin" />
<EditText
android:id="@+id/pair_row3"
style="@style/SyncEditPin"
android:imeOptions="actionDone" />
<EditText
android:id="@+id/pair_row1"
style="@style/SyncEditPin" />
<EditText
android:id="@+id/pair_row2"
style="@style/SyncEditPin" />
<EditText
android:id="@+id/pair_row3"
style="@style/SyncEditPin"
android:imeOptions="actionDone" />
</LinearLayout>
<LinearLayout
@ -54,31 +62,28 @@
<TextView
style="@style/SyncTextItem"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_margin="10dp"
android:text="@string/sync_pair_tryagain"
android:textSize="10dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<Button
style="@style/SyncButtonCommon"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
<Button
android:id="@+id/pair_button_connect"
style="@style/SyncButtonCommon"
android:onClick="connectClickHandler"
android:clickable="false"
android:enabled="false"
android:text="@string/sync_button_connect" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</TableLayout>
<LinearLayout
android:id="@id/pair_bottom"
style="@style/SyncBottom"
android:orientation="horizontal" >
<Button
style="@style/SyncButton"
android:onClick="cancelClickHandler"
android:text="@string/sync_button_cancel" />
<Button
android:id="@+id/pair_button_connect"
style="@style/SyncButton"
android:onClick="connectClickHandler"
android:clickable="false"
android:enabled="false"
android:text="@string/sync_button_connect" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,38 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncTextFrame" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SyncLayout" >
<LinearLayout
android:id="@+id/success_top"
style="@style/SyncTop" >
<ImageView
style="@style/SyncTopIcon"/>
<TextView
style="@style/SyncTextTitle"
android:text="@string/sync_title_success" />
<View style="@style/SyncViewLine" />
<TextView
android:id="@+id/setup_success_subtitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="20dp"
android:text="@string/sync_subtitle_success" />
style="@style/SyncTextTitle"
android:text="@string/sync_title_success" />
</LinearLayout>
<TextView
android:id="@+id/setup_success_subtitle"
style="@style/SyncTextItem"
android:gravity="left"
android:padding="20dp"
android:layout_below="@id/success_top"
android:text="@string/sync_subtitle_success" />
<LinearLayout
style="@style/SyncBottom" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="settingsClickHandler"
android:text="@string/sync_settings" />
<View
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
<TextView
android:id="@+id/link_pair"
style="@style/SyncLinkItem"
android:layout_gravity="center|bottom"
android:onClick="pairClickHandler"
android:text="@string/sync_title_pair" />
</TableLayout>
style="@style/SyncButton"
android:onClick="settingsClickHandler"
android:text="@string/sync_settings" />
</LinearLayout>
</RelativeLayout>

Просмотреть файл

@ -1,34 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="SyncLayout" parent="@android:style/Widget">
<item name="android:layout_width">wrap_content</item>
<style name="SyncLayout">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:gravity">center</item>
</style>
<style name="SyncLayout.Vertical" parent="@style/SyncLayout">
<item name="android:orientation">vertical</item>
</style>
<style name="SyncLayout.Horizontal" parent="@style/SyncLayout">
<item name="android:orientation">horizontal</item>
</style>
<!-- TextView Styles -->
<style name="SyncTextFrame" parent="@android:style/TextAppearance">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_gravity">center</item>
<item name="android:padding">20dp</item>
<item name="android:orientation">vertical</item>
<item name="android:background">#82818A</item>
</style>
<style name="SyncTextItem" parent="@android:style/TextAppearance.Medium">
<item name="android:gravity">center</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center_vertical</item>
<item name="android:textSize">15dp</item>
</style>
<style name="SyncLinkItem" parent="SyncTextItem">
<item name="android:clickable">true</item>
<item name="android:textColor">#99CCFF</item>
<item name="android:textColor">#ACC4D5</item>
</style>
<style name="SyncTextTitle" parent="@style/SyncTextItem">
<item name="android:gravity">center</item>
<item name="android:paddingBottom">10dp</item>
<item name="android:layout_gravity">center_vertical</item>
<item name="android:paddingLeft">4dp</item>
<item name="android:gravity">left</item>
<item name="android:textSize">20dp</item>
</style>
<!-- EditView Styles -->
@ -44,16 +47,48 @@
<item name="android:maxLength">4</item>
<item name="android:imeOptions">actionNext</item>
</style>
<!-- Misc Styles -->
<style name="SyncButtonCommon">
<!-- Theme Styles -->
<style name="SyncTheme" parent="@android:style/Theme.NoTitleBar"/>
<style name="SyncTop">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">left</item>
<item name="android:orientation">horizontal</item>
<item name="android:layout_alignParentTop">true</item>
<item name="android:background">@android:drawable/bottom_bar</item>
</style>
<style name="SyncBottom">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:layout_alignParentBottom">true</item>
<item name="android:background">@android:drawable/bottom_bar</item>
</style>
<style name="SyncButton" parent="@android:style/Widget.Button">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">1</item>
</style>
<!-- Text Display Styles -->
<style name="SyncPinText" parent="@android:style/Widget.TextView">
<item name="android:layout_width">130sp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center</item>
<item name="android:layout_marginBottom">5dp</item>
<item name="android:gravity">center</item>
<item name="android:background">@drawable/pin_background</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textSize">35sp</item>
<item name="android:text">@string/sync_pin_default</item>
</style>
<style name="SyncTopIcon">
<item name="android:src">@drawable/sync_ic_launcher</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="SyncViewLine">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">2dp</item>
<item name="android:paddingTop">5dp</item>
<item name="android:paddingBottom">10dp</item>
<item name="android:background">#FFFFFF</item>
<item name="android:paddingTop">2dp</item>
<item name="android:paddingLeft">4dp</item>
</style>
</resources>

Просмотреть файл

@ -19,7 +19,8 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chenxia Liu <liuche@mozilla.com>
* Chenxia Liu <liuche@mozilla.com>
* Richard Newman <rnewman@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@ -52,49 +53,49 @@ import org.mozilla.gecko.sync.crypto.KeyBundle;
import android.util.Log;
public class JPakeCrypto {
private static final String LOG_TAG = "JpakeCrypto";
private static final String LOG_TAG = "JPakeCrypto";
/*
* Primes P and Q, and generator G - from original Mozilla jpake
* Primes P and Q, and generator G - from original Mozilla J-PAKE
* implementation.
*/
public static final BigInteger P = new BigInteger(
"90066455B5CFC38F9CAA4A48B4281F292C260FEEF01FD61037E56258A7795A1C"
+ "7AD46076982CE6BB956936C6AB4DCFE05E6784586940CA544B9B2140E1EB523F"
+ "009D20A7E7880E4E5BFA690F1B9004A27811CD9904AF70420EEFD6EA11EF7DA1"
+ "29F58835FF56B89FAA637BC9AC2EFAAB903402229F491D8D3485261CD068699B"
+ "6BA58A1DDBBEF6DB51E8FE34E8A78E542D7BA351C21EA8D8F1D29F5D5D159394"
+ "87E27F4416B0CA632C59EFD1B1EB66511A5A0FBF615B766C5862D0BD8A3FE7A0"
+ "E0DA0FB2FE1FCB19E8F9996A8EA0FCCDE538175238FC8B0EE6F29AF7F642773E"
+ "BE8CD5402415A01451A840476B2FCEB0E388D30D4B376C37FE401C2A2C2F941D"
+ "AD179C540C1C8CE030D460C4D983BE9AB0B20F69144C1AE13F9383EA1C08504F"
+ "B0BF321503EFE43488310DD8DC77EC5B8349B8BFE97C2C560EA878DE87C11E3D"
+ "597F1FEA742D73EEC7F37BE43949EF1A0D15C3F3E3FC0A8335617055AC91328E"
+ "C22B50FC15B941D3D1624CD88BC25F3E941FDDC6200689581BFEC416B4B2CB73",
16);
public static final BigInteger P = new BigInteger(
"90066455B5CFC38F9CAA4A48B4281F292C260FEEF01FD61037E56258A7795A1C" +
"7AD46076982CE6BB956936C6AB4DCFE05E6784586940CA544B9B2140E1EB523F" +
"009D20A7E7880E4E5BFA690F1B9004A27811CD9904AF70420EEFD6EA11EF7DA1" +
"29F58835FF56B89FAA637BC9AC2EFAAB903402229F491D8D3485261CD068699B" +
"6BA58A1DDBBEF6DB51E8FE34E8A78E542D7BA351C21EA8D8F1D29F5D5D159394" +
"87E27F4416B0CA632C59EFD1B1EB66511A5A0FBF615B766C5862D0BD8A3FE7A0" +
"E0DA0FB2FE1FCB19E8F9996A8EA0FCCDE538175238FC8B0EE6F29AF7F642773E" +
"BE8CD5402415A01451A840476B2FCEB0E388D30D4B376C37FE401C2A2C2F941D" +
"AD179C540C1C8CE030D460C4D983BE9AB0B20F69144C1AE13F9383EA1C08504F" +
"B0BF321503EFE43488310DD8DC77EC5B8349B8BFE97C2C560EA878DE87C11E3D" +
"597F1FEA742D73EEC7F37BE43949EF1A0D15C3F3E3FC0A8335617055AC91328E" +
"C22B50FC15B941D3D1624CD88BC25F3E941FDDC6200689581BFEC416B4B2CB73",
16);
public static final BigInteger Q = new BigInteger(
"CFA0478A54717B08CE64805B76E5B14249A77A4838469DF7F7DC987EFCCFB11D",
16);
public static final BigInteger Q = new BigInteger(
"CFA0478A54717B08CE64805B76E5B14249A77A4838469DF7F7DC987EFCCFB11D",
16);
public static final BigInteger G = new BigInteger(
"5E5CBA992E0A680D885EB903AEA78E4A45A469103D448EDE3B7ACCC54D521E37"
+ "F84A4BDD5B06B0970CC2D2BBB715F7B82846F9A0C393914C792E6A923E2117AB"
+ "805276A975AADB5261D91673EA9AAFFEECBFA6183DFCB5D3B7332AA19275AFA1"
+ "F8EC0B60FB6F66CC23AE4870791D5982AAD1AA9485FD8F4A60126FEB2CF05DB8"
+ "A7F0F09B3397F3937F2E90B9E5B9C9B6EFEF642BC48351C46FB171B9BFA9EF17"
+ "A961CE96C7E7A7CC3D3D03DFAD1078BA21DA425198F07D2481622BCE45969D9C"
+ "4D6063D72AB7A0F08B2F49A7CC6AF335E08C4720E31476B67299E231F8BD90B3"
+ "9AC3AE3BE0C6B6CACEF8289A2E2873D58E51E029CAFBD55E6841489AB66B5B4B"
+ "9BA6E2F784660896AFF387D92844CCB8B69475496DE19DA2E58259B090489AC8"
+ "E62363CDF82CFD8EF2A427ABCD65750B506F56DDE3B988567A88126B914D7828"
+ "E2B63A6D7ED0747EC59E0E0A23CE7D8A74C1D2C2A7AFB6A29799620F00E11C33"
+ "787F7DED3B30E1A22D09F1FBDA1ABBBFBF25CAE05A13F812E34563F99410E73B",
16);
public static final BigInteger G = new BigInteger(
"5E5CBA992E0A680D885EB903AEA78E4A45A469103D448EDE3B7ACCC54D521E37" +
"F84A4BDD5B06B0970CC2D2BBB715F7B82846F9A0C393914C792E6A923E2117AB" +
"805276A975AADB5261D91673EA9AAFFEECBFA6183DFCB5D3B7332AA19275AFA1" +
"F8EC0B60FB6F66CC23AE4870791D5982AAD1AA9485FD8F4A60126FEB2CF05DB8" +
"A7F0F09B3397F3937F2E90B9E5B9C9B6EFEF642BC48351C46FB171B9BFA9EF17" +
"A961CE96C7E7A7CC3D3D03DFAD1078BA21DA425198F07D2481622BCE45969D9C" +
"4D6063D72AB7A0F08B2F49A7CC6AF335E08C4720E31476B67299E231F8BD90B3" +
"9AC3AE3BE0C6B6CACEF8289A2E2873D58E51E029CAFBD55E6841489AB66B5B4B" +
"9BA6E2F784660896AFF387D92844CCB8B69475496DE19DA2E58259B090489AC8" +
"E62363CDF82CFD8EF2A427ABCD65750B506F56DDE3B988567A88126B914D7828" +
"E2B63A6D7ED0747EC59E0E0A23CE7D8A74C1D2C2A7AFB6A29799620F00E11C33" +
"787F7DED3B30E1A22D09F1FBDA1ABBBFBF25CAE05A13F812E34563F99410E73B",
16);
/**
*
* Round 1 of JPAKE protocol.
* Round 1 of J-PAKE protocol.
* Generate x1, x2, and ZKP for other party.
*
* @param mySignerId
@ -118,7 +119,7 @@ public class JPakeCrypto {
}
/**
* Round 2 of JPAKE protocol.
* Round 2 of J-PAKE protocol.
* Generate A and ZKP for A.
* Verify ZKP from other party. Does not check for replay ZKP.
*
@ -135,7 +136,7 @@ public class JPakeCrypto {
public static void round2(String secret, JPakeParty jp,
JPakeNumGenerator gen) throws Gx4IsOneException, IncorrectZkpException {
Log.d(LOG_TAG, "round2 started");
Log.d(LOG_TAG, "round2 started.");
if (jp.gx4 == BigInteger.ONE) {
throw new Gx4IsOneException();
@ -159,11 +160,11 @@ public class JPakeCrypto {
jp.thisZkpA = createZkp(y1, y2, a, jp.signerId, gen);
jp.thisA = a;
Log.d(LOG_TAG, "round2 finished");
Log.d(LOG_TAG, "round2 finished.");
}
/**
* Final round of JPAKE protocol.
* Final round of J-PAKE protocol.
*
* @param b
* @param zkp
@ -174,7 +175,7 @@ public class JPakeCrypto {
*/
public static KeyBundle finalRound(String secret, JPakeParty jp)
throws IncorrectZkpException {
Log.d(LOG_TAG, "final round started");
Log.d(LOG_TAG, "Final round started.");
BigInteger gb = jp.gx1.multiply(jp.gx2).mod(P).multiply(jp.gx3)
.mod(P);
checkZkp(gb, jp.otherA, jp.otherZkpA);
@ -188,7 +189,7 @@ public class JPakeCrypto {
byte[] hmac = new byte[32];
generateKeyAndHmac(k, enc, hmac);
Log.d(LOG_TAG, "final round finished; returning key");
Log.d(LOG_TAG, "Final round finished; returning key.");
return new KeyBundle(enc, hmac);
}
@ -198,8 +199,7 @@ public class JPakeCrypto {
try {
Mac hmacSha256;
hmacSha256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key,
"HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
hmacSha256.init(secret_key);
result = hmacSha256.doFinal(data);
} catch (GeneralSecurityException e) {
@ -243,14 +243,18 @@ public class JPakeCrypto {
// Check parameters of zkp, and compare to computed hash. These shouldn't
// fail.
if (gx.compareTo(BigInteger.ZERO) < 1) {// g^x > 1
Log.e(LOG_TAG, "g^x > 1 fails");
Log.e(LOG_TAG, "g^x > 1 fails.");
throw new IncorrectZkpException();
} else if (gx.compareTo(P.subtract(BigInteger.ONE)) > -1) { // g^x < p-1
Log.e(LOG_TAG, "g^x < p-1 fails");
}
if (gx.compareTo(P.subtract(BigInteger.ONE)) > -1) { // g^x < p-1
Log.e(LOG_TAG, "g^x < p-1 fails.");
throw new IncorrectZkpException();
} else if (gx.modPow(Q, P).compareTo(BigInteger.ONE) != 0) {
Log.e(LOG_TAG, "g^x^q % p = 1 fails");
} else if (zkp.gr.compareTo(g.modPow(zkp.b, P).multiply(gx.modPow(h, P)).mod(P)) != 0) {
}
if (gx.modPow(Q, P).compareTo(BigInteger.ONE) != 0) {
Log.e(LOG_TAG, "g^x^q % p = 1 fails.");
throw new IncorrectZkpException();
}
if (zkp.gr.compareTo(g.modPow(zkp.b, P).multiply(gx.modPow(h, P)).mod(P)) != 0) {
// b = r-h*x ==> g^r = g^b*g^x^(h)
Log.i(LOG_TAG, "gb*g(xh) = "
+ g.modPow(zkp.b, P).multiply(gx.modPow(h, P)).mod(P).toString(16));
@ -260,11 +264,10 @@ public class JPakeCrypto {
Log.d(LOG_TAG, "g^(xh) = " + gx.modPow(h, P).toString(16));
Log.d(LOG_TAG, "gx = " + gx.toString(16));
Log.d(LOG_TAG, "h = " + h.toString(16));
Log.e(LOG_TAG, "zkp calculation incorrect");
Log.e(LOG_TAG, "zkp calculation incorrect.");
throw new IncorrectZkpException();
} else {
Log.d(LOG_TAG, "*** ZKP SUCCESS ***");
}
Log.d(LOG_TAG, "*** ZKP SUCCESS ***");
}
/*

Просмотреть файл

@ -50,6 +50,7 @@ import android.util.Log;
import ch.boye.httpclientandroidlib.Header;
import ch.boye.httpclientandroidlib.HttpEntity;
import ch.boye.httpclientandroidlib.HttpResponse;
import ch.boye.httpclientandroidlib.HttpVersion;
import ch.boye.httpclientandroidlib.auth.Credentials;
import ch.boye.httpclientandroidlib.auth.UsernamePasswordCredentials;
import ch.boye.httpclientandroidlib.client.ClientProtocolException;
@ -157,6 +158,7 @@ public class BaseResource implements Resource {
HttpConnectionParams.setConnectionTimeout(params, delegate.connectionTimeout());
HttpConnectionParams.setSoTimeout(params, delegate.socketTimeout());
HttpProtocolParams.setContentCharset(params, charset);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
delegate.addHeaders(request, client);
}
@ -182,8 +184,7 @@ public class BaseResource implements Resource {
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("https", 443, sf));
schemeRegistry.register(new Scheme("http", 80, new PlainSocketFactory()));
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
schemeRegistry);
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(schemeRegistry);
connManager = cm;
return cm;
}

Просмотреть файл

@ -173,7 +173,7 @@ public class SyncStorageRequest implements Resource {
}
}
public static String USER_AGENT = "Firefox AndroidSync 0.2";
public static String USER_AGENT = "Firefox AndroidSync 0.3";
protected SyncResourceDelegate resourceDelegate;
public SyncStorageRequestDelegate delegate;
protected BaseResource resource;

Просмотреть файл

@ -43,19 +43,59 @@ import java.net.Socket;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import android.util.Log;
import ch.boye.httpclientandroidlib.conn.ssl.SSLSocketFactory;
import ch.boye.httpclientandroidlib.params.HttpParams;
public class TLSSocketFactory extends SSLSocketFactory {
private static final String LOG_TAG = "TLSSocketFactory";
private static final String[] DEFAULT_CIPHER_SUITES = new String[] {
"SSL_RSA_WITH_RC4_128_SHA", // "RC4_SHA"
};
private static final String[] DEFAULT_PROTOCOLS = new String[] {
"SSLv3",
"TLSv1"
};
// Guarded by `this`.
private static String[] cipherSuites = DEFAULT_CIPHER_SUITES;
public TLSSocketFactory(SSLContext sslContext) {
super(sslContext);
}
/**
* Attempt to specify the cipher suites to use for a connection. If
* setting fails (as it will on Android 2.2, because the wrong names
* are in use to specify ciphers), attempt to set the defaults.
*
* We store the list of cipher suites in `cipherSuites`, which
* avoids this fallback handling having to be executed more than once.
*
* This method is synchronized to ensure correct use of that member.
*
* See Bug 717691 for more details.
*
* @param socket
* The SSLSocket on which to operate.
*/
public static synchronized void setEnabledCipherSuites(SSLSocket socket) {
try {
socket.setEnabledCipherSuites(cipherSuites);
} catch (IllegalArgumentException e) {
cipherSuites = socket.getSupportedCipherSuites();
Log.d(LOG_TAG, "Setting enabled cipher suites failed: " + e.getMessage());
Log.d(LOG_TAG, "Using " + cipherSuites.length + " supported suites.");
socket.setEnabledCipherSuites(cipherSuites);
}
}
@Override
public Socket createSocket(HttpParams params) throws IOException {
SSLSocket socket = (SSLSocket) super.createSocket(params);
socket.setEnabledProtocols(new String[] { "SSLv3", "TLSv1" });
socket.setEnabledCipherSuites(new String[] { "SSL_RSA_WITH_RC4_128_SHA" });
socket.setEnabledProtocols(DEFAULT_PROTOCOLS);
setEnabledCipherSuites(socket);
return socket;
}

Просмотреть файл

@ -82,6 +82,7 @@ public class AccountActivity extends AccountAuthenticatorActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.SyncTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.sync_account);
mContext = getApplicationContext();
@ -132,7 +133,7 @@ public class AccountActivity extends AccountAuthenticatorActivity {
}
public void cancelClickHandler(View target) {
moveTaskToBack(true);
finish();
}
/*

Просмотреть файл

@ -50,6 +50,7 @@ public class SetupFailureActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.SyncTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.sync_setup_failure);
mContext = this.getApplicationContext();

Просмотреть файл

@ -44,15 +44,18 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.TextView;
public class SetupSuccessActivity extends Activity {
private final static String LOG_TAG = "SetupSuccessActivity";
private TextView setupSubtitle;
private Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.SyncTheme);
super.onCreate(savedInstanceState);
mContext = getApplicationContext();
Bundle extras = this.getIntent().getExtras();
@ -68,7 +71,7 @@ public class SetupSuccessActivity extends Activity {
/* Click Handlers */
public void settingsClickHandler(View target) {
Intent intent = new Intent("android.settings.SYNC_SETTINGS");
Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
intent.setFlags(Constants.FLAG_ACTIVITY_REORDER_TO_FRONT_NO_ANIMATION);
startActivity(intent);
finish();

Просмотреть файл

@ -53,6 +53,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
@ -79,7 +80,9 @@ public class SetupSyncActivity extends AccountAuthenticatorActivity {
private TextView setupTitleView;
private TextView setupNoDeviceLinkTitleView;
private TextView setupSubtitleView;
private TextView pinTextView;
private TextView pinTextView1;
private TextView pinTextView2;
private TextView pinTextView3;
private JPakeClient jClient;
// Android context.
@ -94,6 +97,7 @@ public class SetupSyncActivity extends AccountAuthenticatorActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.SyncTheme);
Log.i(LOG_TAG, "Called SetupSyncActivity.onCreate.");
super.onCreate(savedInstanceState);
@ -134,9 +138,14 @@ public class SetupSyncActivity extends AccountAuthenticatorActivity {
return;
}
}
// Display toast for "Only one account supported."
// Display toast for "Only one account supported." and redirect to account management.
Toast toast = Toast.makeText(mContext, R.string.sync_notification_oneaccount, Toast.LENGTH_LONG);
toast.show();
Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
intent.setFlags(Constants.FLAG_ACTIVITY_REORDER_TO_FRONT_NO_ANIMATION);
startActivity(intent);
finish();
}
@ -202,20 +211,23 @@ public class SetupSyncActivity extends AccountAuthenticatorActivity {
}
// Format PIN for display.
int charPerLine = pin.length() / 3;
String prettyPin = pin.substring(0, charPerLine) + "\n";
prettyPin += pin.substring(charPerLine, 2 * charPerLine) + "\n";
prettyPin += pin.substring(2 * charPerLine, pin.length());
final String pin1 = pin.substring(0, charPerLine);
final String pin2 = pin.substring(charPerLine, 2 * charPerLine);
final String pin3 = pin.substring(2 * charPerLine, pin.length());
final String toDisplay = prettyPin;
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView view = pinTextView;
if (view == null) {
TextView view1 = pinTextView1;
TextView view2 = pinTextView2;
TextView view3 = pinTextView3;
if (view1 == null || view2 == null || view3 == null) {
Log.w(LOG_TAG, "Couldn't find view to display PIN.");
return;
}
view.setText(toDisplay);
view1.setText(pin1);
view2.setText(pin2);
view3.setText(pin3);
}
});
}
@ -475,7 +487,9 @@ public class SetupSyncActivity extends AccountAuthenticatorActivity {
setupTitleView = ((TextView) findViewById(R.id.setup_title));
setupSubtitleView = (TextView) findViewById(R.id.setup_subtitle);
setupNoDeviceLinkTitleView = (TextView) findViewById(R.id.link_nodevice);
pinTextView = ((TextView) findViewById(R.id.text_pin));
pinTextView1 = ((TextView) findViewById(R.id.text_pin1));
pinTextView2 = ((TextView) findViewById(R.id.text_pin2));
pinTextView3 = ((TextView) findViewById(R.id.text_pin3));
// UI checks.
if (setupTitleView == null) {

Просмотреть файл

@ -1 +1,2 @@
mobile/android/base/resources/drawable/pin_background.xml
mobile/android/base/resources/drawable/sync_icon.png

Просмотреть файл

@ -1,13 +1,14 @@
<string name="sync_app_name">&sync.app.name.label;</string>
<string name="sync_title_connect">&sync.title.connect.label;</string>
<string name="sync_title_connect">&sync.title.adddevice.label;</string>
<string name="sync_title_pair">&sync.title.pair.label;</string>
<!-- J-PAKE PIN Screen -->
<string name="sync_subtitle_connect">&sync.subtitle.connect.label;</string>
<string name="sync_subtitle_header">&sync.subtitle.header.label;</string>
<string name="sync_subtitle_connect">&sync.subtitle.connectlocation.label;</string>
<string name="sync_subtitle_pair">&sync.subtitle.pair.label;</string>
<string name="sync_pin_default">&sync.pin.default.label;</string>
<string name="sync_link_show">&sync.link.show.label;</string>
<string name="sync_link_nodevice">&sync.link.nodevice.label;</string>
<string name="sync_pin_default">&sync.pin.oneline.label;</string>
<string name="sync_link_show"><u>&sync.link.show.label;</u></string>
<string name="sync_link_advancedsetup"><u>&sync.link.advancedsetup.label;</u></string>
<!-- J-PAKE Waiting Screen -->