diff --git a/briar-android/res/layout/activity_password.xml b/briar-android/res/layout/activity_password.xml index bda170a9432446c6bf6394e5c19a5f1650ffac6a..d69ff185fa6a1a84911fe800b6a9f45891e1706a 100644 --- a/briar-android/res/layout/activity_password.xml +++ b/briar-android/res/layout/activity_password.xml @@ -40,7 +40,6 @@ android:imeOptions="actionDone" android:inputType="textPassword" android:maxLines="1" /> - </android.support.design.widget.TextInputLayout> <Button @@ -61,7 +60,6 @@ android:layout_alignTop="@id/btn_sign_in" android:layout_alignBottom="@id/btn_sign_in" android:layout_centerHorizontal="true" - android:gravity="center" android:visibility="invisible" /> <TextView diff --git a/briar-android/res/layout/activity_setup.xml b/briar-android/res/layout/activity_setup.xml index d5ec69ba6828ffcc77f2c5a7d0a309e364300743..ec3678cef4d35c70df522a72c548999af4c5c4c4 100644 --- a/briar-android/res/layout/activity_setup.xml +++ b/briar-android/res/layout/activity_setup.xml @@ -5,10 +5,9 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="@dimen/margin_activity_vertical" android:paddingEnd="@dimen/margin_activity_horizontal" @@ -18,9 +17,11 @@ android:paddingTop="@dimen/margin_activity_vertical"> <TextView + android:id="@+id/nickname_title" + style="@style/BriarTextTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center" + android:layout_centerHorizontal="true" android:text="@string/choose_nickname" android:textSize="@dimen/text_size_medium"/> @@ -28,6 +29,8 @@ android:id="@+id/nickname_entry_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_below="@id/nickname_title" app:errorEnabled="true"> <EditText @@ -39,9 +42,12 @@ </android.support.design.widget.TextInputLayout> <TextView + android:id="@+id/password_title" + style="@style/BriarTextTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center" + android:layout_centerHorizontal="true" + android:layout_below="@id/nickname_entry_wrapper" android:text="@string/choose_password" android:textSize="@dimen/text_size_medium"/> @@ -49,6 +55,8 @@ android:id="@+id/password_entry_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_below="@id/password_title" app:errorEnabled="true"> <EditText @@ -60,9 +68,12 @@ </android.support.design.widget.TextInputLayout> <TextView + android:id="@+id/password_confirm_title" + style="@style/BriarTextTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center" + android:layout_centerHorizontal="true" + android:layout_below="@id/password_entry_wrapper" android:text="@string/confirm_password" android:textSize="@dimen/text_size_medium"/> @@ -70,6 +81,8 @@ android:id="@+id/password_confirm_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_below="@id/password_confirm_title" app:errorEnabled="true"> <EditText @@ -85,20 +98,31 @@ android:id="@+id/strength_meter" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_below="@id/password_confirm_wrapper" android:visibility="invisible"/> <Button android:id="@+id/create_account" + style="@style/BriarButton.Default" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_below="@id/strength_meter" + android:layout_marginTop="@dimen/margin_medium" android:enabled="false" android:text="@string/create_account_button"/> <ProgressBar android:id="@+id/progress_wheel" + style="?android:attr/progressBarStyleInverse" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:indeterminate="true" - android:visibility="gone"/> - </LinearLayout> + android:layout_alignTop="@id/create_account" + android:layout_alignBottom="@id/create_account" + android:layout_centerHorizontal="true" + android:visibility="invisible" /> + + </RelativeLayout> + </ScrollView> \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/BaseActivity.java b/briar-android/src/org/briarproject/android/BaseActivity.java index a36252747158257bfb15dc3144089c7b878c2fbe..138d3447ad744eacb2bd36b3424d56dcbc70fc4a 100644 --- a/briar-android/src/org/briarproject/android/BaseActivity.java +++ b/briar-android/src/org/briarproject/android/BaseActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; +import android.os.IBinder; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -31,7 +32,6 @@ import roboguice.inject.RoboInjector; import roboguice.util.RoboContext; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; -import static android.view.inputmethod.InputMethodManager.HIDE_IMPLICIT_ONLY; import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; import static org.briarproject.android.TestingConstants.PREVENT_SCREENSHOTS; @@ -39,7 +39,7 @@ public abstract class BaseActivity extends AppCompatActivity implements RoboContext { private final static String PREFS_DB = "db"; - private final static String KEY_DB_KEY = "key"; + private final static String PREFS_KEY = "key"; private final HashMap<Key<?>, Object> scopedObjects = new HashMap<Key<?>, Object>(); @@ -128,38 +128,24 @@ public abstract class BaseActivity extends AppCompatActivity return scopedObjects; } - private SharedPreferences getBriarPrefs(String prefsName) { - return getSharedPreferences(prefsName, MODE_PRIVATE); + private SharedPreferences getSharedPrefs() { + return getSharedPreferences(PREFS_DB, MODE_PRIVATE); } - protected String getDbKeyInHex() { - return getBriarPrefs(PREFS_DB).getString(KEY_DB_KEY, null); + protected String getEncryptedDatabaseKey() { + return getSharedPrefs().getString(PREFS_KEY, null); } - private void clearPrefs(String prefsName) { - SharedPreferences.Editor editor = getBriarPrefs(prefsName).edit(); - editor.clear(); + protected void storeEncryptedDatabaseKey(final String hex) { + SharedPreferences.Editor editor = getSharedPrefs().edit(); + editor.putString(PREFS_KEY, hex); editor.apply(); } - protected void clearDbPrefs() { - clearPrefs(PREFS_DB); - } - - protected void gotoAndFinish(Class classInstance, int resultCode) { - if (resultCode != Integer.MIN_VALUE) - setResult(resultCode); - startActivity(new Intent(this, classInstance)); - finish(); - } - - protected void gotoAndFinish(Class classInstance) { - gotoAndFinish(classInstance, Integer.MIN_VALUE); - } - - protected void toggleSoftKeyboard() { - Object o = getSystemService(INPUT_METHOD_SERVICE); - ((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0); + protected void clearSharedPrefs() { + SharedPreferences.Editor editor = getSharedPrefs().edit(); + editor.clear(); + editor.apply(); } protected void showSoftKeyboard(View view) { @@ -168,8 +154,8 @@ public abstract class BaseActivity extends AppCompatActivity } protected void hideSoftKeyboard(View view) { + IBinder token = view.getWindowToken(); Object o = getSystemService(INPUT_METHOD_SERVICE); - ((InputMethodManager) o).hideSoftInputFromWindow(view.getWindowToken(), - 0); + ((InputMethodManager) o).hideSoftInputFromWindow(token, 0); } } diff --git a/briar-android/src/org/briarproject/android/PasswordActivity.java b/briar-android/src/org/briarproject/android/PasswordActivity.java index 353cb0953623da46f5e70557db19c9b60c0c191d..a1f06a3ea4201bd60bf5637d16ef95f021afe314 100644 --- a/briar-android/src/org/briarproject/android/PasswordActivity.java +++ b/briar-android/src/org/briarproject/android/PasswordActivity.java @@ -38,7 +38,6 @@ public class PasswordActivity extends BaseActivity { @Inject @CryptoExecutor private Executor cryptoExecutor; private Button signInButton; private ProgressBar progress; - private TextView title; private TextInputLayout input; private EditText password; @@ -52,9 +51,9 @@ public class PasswordActivity extends BaseActivity { public void onCreate(Bundle state) { super.onCreate(state); - String hex = getDbKeyInHex(); + String hex = getEncryptedDatabaseKey(); if (hex == null || !databaseConfig.databaseExists()) { - clearDbPrefs(); + clearSharedPrefsAndDeleteDatabase(); return; } encrypted = StringUtils.fromHexString(hex); @@ -62,7 +61,6 @@ public class PasswordActivity extends BaseActivity { setContentView(R.layout.activity_password); signInButton = (Button) findViewById(R.id.btn_sign_in); progress = (ProgressBar) findViewById(R.id.progress_wheel); - title = (TextView) findViewById(R.id.title_password); input = (TextInputLayout) findViewById(R.id.password_layout); password = (EditText) findViewById(R.id.edit_password); password.setOnEditorActionListener(new OnEditorActionListener() { @@ -98,11 +96,12 @@ public class PasswordActivity extends BaseActivity { startActivity(intent); } - @Override - protected void clearDbPrefs() { - super.clearDbPrefs(); + private void clearSharedPrefsAndDeleteDatabase() { + clearSharedPrefs(); FileUtils.deleteFileOrDir(databaseConfig.getDatabaseDirectory()); - gotoAndFinish(SetupActivity.class, RESULT_CANCELED); + setResult(RESULT_CANCELED); + startActivity(new Intent(this, SetupActivity.class)); + finish(); } public void onSignInClick(View v) { @@ -115,12 +114,13 @@ public class PasswordActivity extends BaseActivity { builder.setTitle(R.string.dialog_title_lost_password); builder.setMessage(R.string.dialog_message_lost_password); builder.setNegativeButton(R.string.no, null); - builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - clearDbPrefs(); - } - }); + builder.setPositiveButton(R.string.yes, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + clearSharedPrefsAndDeleteDatabase(); + } + }); AlertDialog dialog = builder.create(); dialog.show(); } diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index 380792bf187b7c92294b2aca0d01e7a9d97bd0eb..237dca1f8f5fc9b059838718caa56c6469b314b2 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -1,8 +1,6 @@ package org.briarproject.android; import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.design.widget.TextInputLayout; import android.text.Editable; @@ -38,7 +36,6 @@ import javax.inject.Inject; import roboguice.inject.InjectView; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; -import static android.view.View.GONE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; @@ -134,8 +131,8 @@ public class SetupActivity extends BaseActivity implements OnClickListener, } public void onClick(View view) { - // Replace the feedback text and button with a progress bar - createAccountButton.setVisibility(GONE); + // Replace the button with a progress bar + createAccountButton.setVisibility(INVISIBLE); progress.setVisibility(VISIBLE); final String nickname = nicknameEntry.getText().toString(); final String password = passwordEntry.getText().toString(); @@ -144,8 +141,8 @@ public class SetupActivity extends BaseActivity implements OnClickListener, public void run() { SecretKey key = crypto.generateSecretKey(); databaseConfig.setEncryptionKey(key); - byte[] encrypted = encryptDatabaseKey(key, password); - storeEncryptedDatabaseKey(encrypted); + String hex = encryptDatabaseKey(key, password); + storeEncryptedDatabaseKey(hex); LocalAuthor localAuthor = createLocalAuthor(nickname); showDashboard(referenceManager.putReference(localAuthor, LocalAuthor.class)); @@ -153,24 +150,13 @@ public class SetupActivity extends BaseActivity implements OnClickListener, }); } - private void storeEncryptedDatabaseKey(final byte[] encrypted) { - long now = System.currentTimeMillis(); - SharedPreferences prefs = getSharedPreferences("db", MODE_PRIVATE); - Editor editor = prefs.edit(); - editor.putString("key", StringUtils.toHexString(encrypted)); - editor.commit(); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Key storage took " + duration + " ms"); - } - - private byte[] encryptDatabaseKey(SecretKey key, String password) { + private String encryptDatabaseKey(SecretKey key, String password) { long now = System.currentTimeMillis(); byte[] encrypted = crypto.encryptWithPassword(key.getBytes(), password); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Key derivation took " + duration + " ms"); - return encrypted; + return StringUtils.toHexString(encrypted); } private LocalAuthor createLocalAuthor(String nickname) {