Setup wizard for new users

This commit is contained in:
str4d
2014-06-19 02:46:35 +00:00
parent 82bbdea990
commit b03c172b4c
9 changed files with 307 additions and 6 deletions

View File

@@ -34,6 +34,14 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="i2p.bote.android.EmailListActivity" />
</activity>
<activity
android:name=".intro.SetupActivity"
android:label="@string/title_activity_setup"
android:parentActivityName=".EmailListActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="i2p.bote.android.EmailListActivity" />
</activity>
<activity
android:name=".ViewEmailActivity"
android:parentActivityName=".EmailListActivity" />

View File

@@ -36,6 +36,7 @@ import i2p.bote.I2PBote;
import i2p.bote.android.addressbook.AddressBookActivity;
import i2p.bote.android.config.SettingsActivity;
import i2p.bote.android.intro.IntroActivity;
import i2p.bote.android.intro.SetupActivity;
import i2p.bote.android.service.BoteService;
import i2p.bote.android.service.Init;
import i2p.bote.android.service.Init.RouterChoice;
@@ -66,8 +67,9 @@ public class EmailListActivity extends ActionBarActivity implements
private static final String PREF_FIRST_START = "firstStart";
private static final String ACTIVE_FOLDER = "activeFolder";
private static final int RUN_SETUP_WIZARD = 1;
private static final int REQUEST_START_I2P = 2;
private static final int SHOW_INTRODUCTION = 1;
private static final int RUN_SETUP = 2;
private static final int REQUEST_START_I2P = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -217,7 +219,7 @@ public class EmailListActivity extends ActionBarActivity implements
if (true || mSharedPrefs.getBoolean(PREF_FIRST_START, true)) {
mSharedPrefs.edit().putBoolean(PREF_FIRST_START, false).apply();
Intent i = new Intent(EmailListActivity.this, IntroActivity.class);
startActivityForResult(i, RUN_SETUP_WIZARD);
startActivityForResult(i, SHOW_INTRODUCTION);
}
}
@@ -366,10 +368,15 @@ public class EmailListActivity extends ActionBarActivity implements
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RUN_SETUP_WIZARD) {
if (requestCode == SHOW_INTRODUCTION) {
if (resultCode == RESULT_OK) {
// TODO remove (and implement a UI tutorial?)
Toast.makeText(this, "Setup wizard not yet implemented.", Toast.LENGTH_SHORT).show();
Intent i = new Intent(EmailListActivity.this, SetupActivity.class);
startActivityForResult(i, RUN_SETUP);
}
} else if (requestCode == RUN_SETUP) {
if (resultCode == RESULT_OK) {
// TODO implement a UI tutorial?
Toast.makeText(this, "Setup complete.", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == REQUEST_START_I2P) {
if (resultCode == RESULT_OK) {

View File

@@ -31,6 +31,7 @@ public class EditIdentityActivity extends ActionBarActivity implements
public void onTaskFinished() {
Toast.makeText(this, R.string.identity_saved,
Toast.LENGTH_SHORT).show();
setResult(RESULT_OK);
finish();
}
}

View File

@@ -22,6 +22,7 @@ public class SetPasswordActivity extends ActionBarActivity implements
public void onTaskFinished() {
Toast.makeText(this, R.string.password_changed,
Toast.LENGTH_SHORT).show();
setResult(RESULT_OK);
finish();
}
}

View File

@@ -0,0 +1,123 @@
package i2p.bote.android.intro;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import i2p.bote.android.R;
import i2p.bote.android.config.EditIdentityActivity;
import i2p.bote.android.config.SetPasswordActivity;
public class SetupActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new SetPasswordFragment())
.commit();
}
}
/**
* Set password.
*/
public static class SetPasswordFragment extends Fragment {
private static final int SET_PASSWORD = 1;
public SetPasswordFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_setup_set_password, container, false);
((Button)rootView.findViewById(R.id.button_set_password)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), SetPasswordActivity.class);
startActivityForResult(i, SET_PASSWORD);
}
});
((Button)rootView.findViewById(R.id.button_skip)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
nextPage();
}
});
return rootView;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SET_PASSWORD) {
if (resultCode == RESULT_OK) {
nextPage();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private void nextPage() {
getFragmentManager().beginTransaction()
.replace(R.id.container, new CreateIdentityFragment())
.commit();
}
}
/**
* Create identity.
*/
public static class CreateIdentityFragment extends Fragment {
private static final int CREATE_IDENTITY = 1;
public CreateIdentityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_setup_create_identity, container, false);
((Button)rootView.findViewById(R.id.button_set_password)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), EditIdentityActivity.class);
startActivityForResult(i, CREATE_IDENTITY);
}
});
((Button)rootView.findViewById(R.id.button_skip)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
nextPage();
}
});
return rootView;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CREATE_IDENTITY) {
if (resultCode == RESULT_OK) {
nextPage();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private void nextPage() {
// TODO have a "finished" page?
getActivity().setResult(RESULT_OK);
getActivity().finish();
}
}
}

View File

@@ -0,0 +1,7 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="i2p.bote.android.intro.SetupActivity"
tools:ignore="MergeRootFrame" />

View File

@@ -0,0 +1,72 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="i2p.bote.android.intro.SetupActivity.SetPasswordFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="@string/create_identity" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:text="@string/setup_create_identity_1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/setup_create_identity_2"
android:id="@+id/textView3"
android:layout_below="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/setup_create_identity_3"
android:id="@+id/textView4"
android:layout_below="@+id/textView3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/create_identity"
android:id="@+id/button_set_password"
android:layout_below="@+id/textView4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/skip"
android:id="@+id/button_skip"
android:layout_alignTop="@+id/button_set_password"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>

View File

@@ -0,0 +1,72 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="i2p.bote.android.intro.SetupActivity.SetPasswordFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="@string/set_password" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/setup_set_password_1"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/setup_set_password_2"
android:id="@+id/textView3"
android:layout_below="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/setup_set_password_3"
android:id="@+id/textView4"
android:layout_below="@+id/textView3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/set_password"
android:id="@+id/button_set_password"
android:layout_below="@+id/textView4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="@dimen/activity_vertical_margin" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/skip"
android:id="@+id/button_skip"
android:layout_alignTop="@+id/button_set_password"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>

View File

@@ -16,6 +16,16 @@
<string name="intro_4_1">Because Bote is a little different to traditional email, there are a few things to set up before you can start using it.</string>
<string name="intro_4_2">The setup wizard will take a couple of minutes, and then everything will be ready.</string>
<string name="lets_get_started">Let\'s Get Started</string>
<string name="title_activity_setup">Setup</string>
<string name="skip">Skip</string>
<string name="set_password">Set password</string>
<string name="setup_set_password_1">You can set a password for Bote. This will prevent other users from reading your emails, and will encrypt all files on-disk.</string>
<string name="setup_set_password_2">If you set a password, automatic email checking will be disabled. You can manually check for emails once you have authenticated by pulling down on the Inbox.</string>
<string name="setup_set_password_3">If you do not set a password now, you can do so later from the Settings menu.</string>
<string name="create_identity">Create identity</string>
<string name="setup_create_identity_1">To receive emails, you need an Identity. This is a set of cryptographic keys that enables you to encrypt and decrypt emails.</string>
<string name="setup_create_identity_2">A Destination is the public part of an Identity. This is the address that you will give to your contacts so they can send emails to you. When you send emails using an Identity, its Destination is included in the From field so the recipient can reply.</string>
<string name="setup_create_identity_3">If you do not create an Identity now, you can do so later from the Settings menu. If you only want to send emails, you do not need an Identity, because Bote emails can be sent anonymously. However the recipient will be unable to reply to you.</string>
<string name="action_new_email">New email</string>
<string name="action_send_email">Send email</string>
<string name="action_start_bote">Connect to network</string>