diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index 18b687629..476229541 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -105,25 +105,6 @@
android:value=".android.contact.ContactListActivity"
/>
-
-
-
-
-
-
-
-
@@ -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">
@@ -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">
@@ -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">
-
+ android:layout_alignTop="@id/create_account"
+ android:layout_alignBottom="@id/create_account"
+ android:layout_centerHorizontal="true"
+ android:visibility="invisible" />
+
+
+
\ 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 a36252747..138d3447a 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, Object> scopedObjects =
new HashMap, 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 353cb0953..a1f06a3ea 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 380792bf1..237dca1f8 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) {
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index e50540bc2..4b79ce438 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -37,7 +37,6 @@ import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.MessageAddedEvent;
import org.briarproject.api.event.MessagesAckedEvent;
import org.briarproject.api.event.MessagesSentEvent;
-import org.briarproject.api.identity.AuthorId;
import org.briarproject.api.messaging.MessagingManager;
import org.briarproject.api.messaging.PrivateConversation;
import org.briarproject.api.messaging.PrivateMessageFactory;
@@ -67,14 +66,12 @@ import javax.inject.Inject;
import static android.widget.Toast.LENGTH_SHORT;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT;
import static org.briarproject.api.messaging.PrivateMessageHeader.Status.DELIVERED;
import static org.briarproject.api.messaging.PrivateMessageHeader.Status.SENT;
public class ConversationActivity extends BriarActivity
implements EventListener, OnClickListener {
- private static final int REQUEST_READ = 2;
private static final Logger LOG =
Logger.getLogger(ConversationActivity.class.getName());
@@ -96,7 +93,6 @@ public class ConversationActivity extends BriarActivity
private volatile String contactName = null;
private volatile GroupId groupId = null;
private volatile PrivateConversation conversation = null;
- private volatile AuthorId localAuthorId = null;
private volatile boolean connected;
@Override
@@ -108,10 +104,6 @@ public class ConversationActivity extends BriarActivity
if (id == -1) throw new IllegalStateException();
contactId = new ContactId(id);
- Intent data = new Intent();
- data.putExtra("briar.CONTACT_ID", id);
- setResult(RESULT_OK, data);
-
setContentView(R.layout.activity_conversation);
adapter = new ConversationAdapter(this);
@@ -141,23 +133,13 @@ public class ConversationActivity extends BriarActivity
if (isFinishing()) markMessagesRead();
}
- @Override
- protected void onActivityResult(int request, int result, Intent data) {
- super.onActivityResult(request, result, data);
- if (request == REQUEST_READ && result == RESULT_PREV_NEXT) {
- int position = data.getIntExtra("briar.POSITION", -1);
- if (position >= 0 && position < adapter.getItemCount())
- displayMessage(position);
- }
- }
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.contact_actions, menu);
- // adapt icon color to dark action bar
+ // Adapt icon color to dark action bar
menu.findItem(R.id.action_social_remove_person).getIcon().setColorFilter(
getResources().getColor(R.color.action_bar_text),
PorterDuff.Mode.SRC_IN);
@@ -171,7 +153,6 @@ public class ConversationActivity extends BriarActivity
switch (item.getItemId()) {
case R.id.action_social_remove_person:
askToRemoveContact();
-
return true;
default:
return super.onOptionsItemSelected(item);
@@ -185,7 +166,6 @@ public class ConversationActivity extends BriarActivity
long now = System.currentTimeMillis();
Contact contact = contactManager.getContact(contactId);
contactName = contact.getAuthor().getName();
- localAuthorId = contact.getLocalAuthorId();
groupId = messagingManager.getConversationId(contactId);
conversation = messagingManager.getConversation(groupId);
connected = connectionRegistry.isConnected(contactId);
@@ -458,23 +438,6 @@ public class ConversationActivity extends BriarActivity
});
}
- private void displayMessage(int position) {
- ConversationItem item = adapter.getItem(position);
- PrivateMessageHeader header = item.getHeader();
- Intent i = new Intent(this, ReadPrivateMessageActivity.class);
- i.putExtra("briar.CONTACT_ID", contactId.getInt());
- i.putExtra("briar.CONTACT_NAME", contactName);
- i.putExtra("briar.GROUP_ID", groupId.getBytes());
- i.putExtra("briar.LOCAL_AUTHOR_ID", localAuthorId.getBytes());
- i.putExtra("briar.AUTHOR_NAME", header.getAuthor().getName());
- i.putExtra("briar.MESSAGE_ID", header.getId().getBytes());
- i.putExtra("briar.CONTENT_TYPE", header.getContentType());
- i.putExtra("briar.TIMESTAMP", header.getTimestamp());
- i.putExtra("briar.MIN_TIMESTAMP", getMinTimestampForNewMessage());
- i.putExtra("briar.POSITION", position);
- startActivityForResult(i, REQUEST_READ);
- }
-
private void askToRemoveContact() {
runOnUiThread(new Runnable() {
@Override
@@ -523,10 +486,8 @@ public class ConversationActivity extends BriarActivity
String deleted = getString(R.string.contact_deleted_toast);
Toast.makeText(ConversationActivity.this, deleted, LENGTH_SHORT)
.show();
-
finish();
}
});
}
-
}
diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
deleted file mode 100644
index 01ba00303..000000000
--- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package org.briarproject.android.contact;
-
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.text.format.DateUtils;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-import org.briarproject.R;
-import org.briarproject.android.BriarActivity;
-import org.briarproject.android.util.AuthorView;
-import org.briarproject.android.util.ElasticHorizontalSpace;
-import org.briarproject.android.util.HorizontalBorder;
-import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.db.DbException;
-import org.briarproject.api.db.NoSuchMessageException;
-import org.briarproject.api.identity.AuthorId;
-import org.briarproject.api.messaging.MessagingManager;
-import org.briarproject.api.sync.GroupId;
-import org.briarproject.api.sync.MessageId;
-import org.briarproject.util.StringUtils;
-
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
-
-import static android.view.Gravity.CENTER;
-import static android.view.Gravity.CENTER_VERTICAL;
-import static android.widget.LinearLayout.HORIZONTAL;
-import static android.widget.LinearLayout.VERTICAL;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1;
-import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
-import static org.briarproject.api.identity.Author.Status.VERIFIED;
-
-@Deprecated
-public class ReadPrivateMessageActivity extends BriarActivity
-implements OnClickListener {
-
- static final int RESULT_REPLY = RESULT_FIRST_USER;
- static final int RESULT_PREV_NEXT = RESULT_FIRST_USER + 1;
-
- private static final Logger LOG =
- Logger.getLogger(ReadPrivateMessageActivity.class.getName());
-
- private String contactName = null;
- private AuthorId localAuthorId = null;
- private long timestamp = -1, minTimestamp = -1;
- private ImageButton prevButton = null, nextButton = null;
- private ImageButton replyButton = null;
- private TextView content = null;
- private int position = -1;
-
- // Fields that are accessed from background threads must be volatile
- @Inject private volatile MessagingManager messagingManager;
- private volatile MessageId messageId = null;
- private volatile GroupId groupId = null;
-
- @Override
- public void onCreate(Bundle state) {
- super.onCreate(state);
-
- Intent i = getIntent();
- contactName = i.getStringExtra("briar.CONTACT_NAME");
- if (contactName == null) throw new IllegalStateException();
- setTitle(contactName);
- byte[] b = i.getByteArrayExtra("briar.LOCAL_AUTHOR_ID");
- if (b == null) throw new IllegalStateException();
- localAuthorId = new AuthorId(b);
- String authorName = i.getStringExtra("briar.AUTHOR_NAME");
- if (authorName == null) throw new IllegalStateException();
- b = i.getByteArrayExtra("briar.MESSAGE_ID");
- if (b == null) throw new IllegalStateException();
- messageId = new MessageId(b);
- b = i.getByteArrayExtra("briar.GROUP_ID");
- if (b == null) throw new IllegalStateException();
- groupId = new GroupId(b);
- String contentType = i.getStringExtra("briar.CONTENT_TYPE");
- if (contentType == null) throw new IllegalStateException();
- timestamp = i.getLongExtra("briar.TIMESTAMP", -1);
- if (timestamp == -1) throw new IllegalStateException();
- minTimestamp = i.getLongExtra("briar.MIN_TIMESTAMP", -1);
- if (minTimestamp == -1) throw new IllegalStateException();
- position = i.getIntExtra("briar.POSITION", -1);
- if (position == -1) throw new IllegalStateException();
-
- LinearLayout layout = new LinearLayout(this);
- layout.setLayoutParams(MATCH_WRAP);
- layout.setOrientation(VERTICAL);
-
- ScrollView scrollView = new ScrollView(this);
- scrollView.setLayoutParams(MATCH_WRAP_1);
-
- LinearLayout message = new LinearLayout(this);
- message.setOrientation(VERTICAL);
-
- LinearLayout header = new LinearLayout(this);
- header.setLayoutParams(MATCH_WRAP);
- header.setOrientation(HORIZONTAL);
- header.setGravity(CENTER_VERTICAL);
-
- AuthorView author = new AuthorView(this);
- author.setLayoutParams(WRAP_WRAP_1);
- author.init(authorName, VERIFIED);
- header.addView(author);
-
- int pad = LayoutUtils.getPadding(this);
-
- TextView date = new TextView(this);
- date.setPadding(0, pad, pad, pad);
- date.setText(DateUtils.getRelativeTimeSpanString(this, timestamp));
- header.addView(date);
- message.addView(header);
-
- if (contentType.equals("text/plain")) {
- // Load and display the message body
- content = new TextView(this);
- content.setPadding(pad, 0, pad, pad);
- message.addView(content);
- loadMessageBody();
- }
- scrollView.addView(message);
- layout.addView(scrollView);
-
- layout.addView(new HorizontalBorder(this));
-
- LinearLayout footer = new LinearLayout(this);
- footer.setLayoutParams(MATCH_WRAP);
- footer.setOrientation(HORIZONTAL);
- footer.setGravity(CENTER);
- Resources res = getResources();
- footer.setBackgroundColor(res.getColor(R.color.button_bar_background));
-
- prevButton = new ImageButton(this);
- prevButton.setBackgroundResource(0);
- prevButton.setImageResource(R.drawable.navigation_previous_item);
- prevButton.setOnClickListener(this);
- footer.addView(prevButton);
- footer.addView(new ElasticHorizontalSpace(this));
-
- nextButton = new ImageButton(this);
- nextButton.setBackgroundResource(0);
- nextButton.setImageResource(R.drawable.navigation_next_item);
- nextButton.setOnClickListener(this);
- footer.addView(nextButton);
- footer.addView(new ElasticHorizontalSpace(this));
-
- replyButton = new ImageButton(this);
- replyButton.setBackgroundResource(0);
- replyButton.setImageResource(R.drawable.social_reply);
- replyButton.setOnClickListener(this);
- footer.addView(replyButton);
- layout.addView(footer);
-
- setContentView(layout);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- if (isFinishing()) markMessageRead();
- }
-
- private void markMessageRead() {
- runOnDbThread(new Runnable() {
- public void run() {
- try {
- long now = System.currentTimeMillis();
- messagingManager.setReadFlag(messageId, true);
- long duration = System.currentTimeMillis() - now;
- if (LOG.isLoggable(INFO))
- LOG.info("Marking read took " + duration + " ms");
- } catch (DbException e) {
- if (LOG.isLoggable(WARNING))
- LOG.log(WARNING, e.toString(), e);
- }
- }
- });
- }
-
- private void loadMessageBody() {
- runOnDbThread(new Runnable() {
- public void run() {
- try {
- long now = System.currentTimeMillis();
- byte[] body = messagingManager.getMessageBody(messageId);
- long duration = System.currentTimeMillis() - now;
- if (LOG.isLoggable(INFO))
- LOG.info("Loading message took " + duration + " ms");
- displayMessageBody(StringUtils.fromUtf8(body));
- } catch (NoSuchMessageException e) {
- finishOnUiThread();
- } catch (DbException e) {
- if (LOG.isLoggable(WARNING))
- LOG.log(WARNING, e.toString(), e);
- }
- }
- });
- }
-
- private void displayMessageBody(final String body) {
- runOnUiThread(new Runnable() {
- public void run() {
- content.setText(body);
- }
- });
- }
-
- public void onClick(View view) {
- if (view == prevButton) {
- Intent i = new Intent();
- i.putExtra("briar.POSITION", position - 1);
- setResult(RESULT_PREV_NEXT, i);
- finish();
- } else if (view == nextButton) {
- Intent i = new Intent();
- i.putExtra("briar.POSITION", position + 1);
- setResult(RESULT_PREV_NEXT, i);
- finish();
- } else if (view == replyButton) {
- Intent i = new Intent(this, WritePrivateMessageActivity.class);
- i.putExtra("briar.CONTACT_NAME", contactName);
- i.putExtra("briar.GROUP_ID", groupId.getBytes());
- i.putExtra("briar.LOCAL_AUTHOR_ID",
- localAuthorId.getBytes());
- i.putExtra("briar.PARENT_ID", messageId.getBytes());
- i.putExtra("briar.MIN_TIMESTAMP", minTimestamp);
- startActivity(i);
- setResult(RESULT_REPLY);
- finish();
- }
- }
-}
diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
deleted file mode 100644
index 74623463e..000000000
--- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package org.briarproject.android.contact;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.InputType;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import org.briarproject.R;
-import org.briarproject.android.BriarActivity;
-import org.briarproject.android.util.CommonLayoutParams;
-import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.crypto.CryptoExecutor;
-import org.briarproject.api.db.DbException;
-import org.briarproject.api.db.NoSuchContactException;
-import org.briarproject.api.db.NoSuchSubscriptionException;
-import org.briarproject.api.identity.AuthorId;
-import org.briarproject.api.identity.IdentityManager;
-import org.briarproject.api.identity.LocalAuthor;
-import org.briarproject.api.messaging.MessagingManager;
-import org.briarproject.api.messaging.PrivateConversation;
-import org.briarproject.api.messaging.PrivateMessageFactory;
-import org.briarproject.api.sync.GroupId;
-import org.briarproject.api.sync.Message;
-import org.briarproject.api.sync.MessageId;
-import org.briarproject.util.StringUtils;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.concurrent.Executor;
-import java.util.logging.Logger;
-
-import javax.inject.Inject;
-
-import static android.text.InputType.TYPE_CLASS_TEXT;
-import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
-import static android.text.TextUtils.TruncateAt.END;
-import static android.widget.LinearLayout.VERTICAL;
-import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT;
-import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT;
-import static android.widget.RelativeLayout.CENTER_VERTICAL;
-import static android.widget.RelativeLayout.LEFT_OF;
-import static android.widget.Toast.LENGTH_LONG;
-import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
-import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP;
-
-public class WritePrivateMessageActivity extends BriarActivity
-implements OnClickListener {
-
- private static final Logger LOG =
- Logger.getLogger(WritePrivateMessageActivity.class.getName());
-
- @Inject @CryptoExecutor private Executor cryptoExecutor;
- private TextView from = null;
- private ImageButton sendButton = null;
- private EditText content = null;
-
- // Fields that are accessed from background threads must be volatile
- @Inject private volatile IdentityManager identityManager;
- @Inject private volatile MessagingManager messagingManager;
- @Inject private volatile PrivateMessageFactory privateMessageFactory;
- private volatile GroupId groupId = null;
- private volatile AuthorId localAuthorId = null;
- private volatile MessageId parentId = null;
- private volatile long minTimestamp = -1;
- private volatile LocalAuthor localAuthor = null;
- private volatile PrivateConversation conversation = null;
-
- @Override
- public void onCreate(Bundle state) {
- super.onCreate(state);
-
- Intent i = getIntent();
- String contactName = i.getStringExtra("briar.CONTACT_NAME");
- if (contactName == null) throw new IllegalStateException();
- setTitle(contactName);
- byte[] b = i.getByteArrayExtra("briar.GROUP_ID");
- if (b == null) throw new IllegalStateException();
- groupId = new GroupId(b);
- b = i.getByteArrayExtra("briar.LOCAL_AUTHOR_ID");
- if (b == null) throw new IllegalStateException();
- minTimestamp = i.getLongExtra("briar.MIN_TIMESTAMP", -1);
- if (minTimestamp == -1) throw new IllegalStateException();
- localAuthorId = new AuthorId(b);
- b = i.getByteArrayExtra("briar.PARENT_ID");
- if (b != null) parentId = new MessageId(b);
-
- LinearLayout layout = new LinearLayout(this);
- layout.setLayoutParams(MATCH_WRAP);
- layout.setOrientation(VERTICAL);
- int pad = LayoutUtils.getPadding(this);
- layout.setPadding(pad, 0, pad, pad);
-
- RelativeLayout header = new RelativeLayout(this);
-
- from = new TextView(this);
- from.setId(1);
- from.setTextSize(18);
- from.setSingleLine();
- from.setEllipsize(END);
- from.setPadding(0, 0, pad, 0);
- from.setText(R.string.from);
- RelativeLayout.LayoutParams leftOf = CommonLayoutParams.relative();
- leftOf.addRule(ALIGN_PARENT_LEFT);
- leftOf.addRule(CENTER_VERTICAL);
- leftOf.addRule(LEFT_OF, 2);
- header.addView(from, leftOf);
-
- sendButton = new ImageButton(this);
- sendButton.setId(2);
- sendButton.setBackgroundResource(0);
- sendButton.setImageResource(R.drawable.social_send_now);
- sendButton.setEnabled(false); // Enabled after loading the conversation
- sendButton.setOnClickListener(this);
- RelativeLayout.LayoutParams right = CommonLayoutParams.relative();
- right.addRule(ALIGN_PARENT_RIGHT);
- right.addRule(CENTER_VERTICAL);
- header.addView(sendButton, right);
- layout.addView(header);
-
- content = new EditText(this);
- content.setId(3);
- int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE
- | TYPE_TEXT_FLAG_CAP_SENTENCES;
- content.setInputType(inputType);
- content.setHint(R.string.private_message_hint);
- layout.addView(content);
-
- setContentView(layout);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (localAuthor == null || conversation == null)
- loadAuthorAndConversation();
- }
-
- private void loadAuthorAndConversation() {
- runOnDbThread(new Runnable() {
- public void run() {
- try {
- long now = System.currentTimeMillis();
- localAuthor = identityManager.getLocalAuthor(localAuthorId);
- conversation = messagingManager.getConversation(groupId);
- long duration = System.currentTimeMillis() - now;
- if (LOG.isLoggable(INFO))
- LOG.info("Load took " + duration + " ms");
- displayLocalAuthor();
- } catch (NoSuchContactException e) {
- finishOnUiThread();
- } catch (NoSuchSubscriptionException e) {
- finishOnUiThread();
- } catch (DbException e) {
- if (LOG.isLoggable(WARNING))
- LOG.log(WARNING, e.toString(), e);
- }
- }
- });
- }
-
- private void displayLocalAuthor() {
- runOnUiThread(new Runnable() {
- public void run() {
- String format = getString(R.string.format_from);
- String name = localAuthor.getName();
- from.setText(String.format(format, name));
- sendButton.setEnabled(true);
- }
- });
- }
-
- public void onClick(View view) {
- String message = content.getText().toString();
- if (message.equals("")) return;
- createMessage(StringUtils.toUtf8(message));
- Toast.makeText(this, R.string.message_sent_toast, LENGTH_LONG).show();
- finish();
- }
-
- private void createMessage(final byte[] body) {
- cryptoExecutor.execute(new Runnable() {
- public void run() {
- // Don't use an earlier timestamp than the newest message
- long timestamp = System.currentTimeMillis();
- timestamp = Math.max(timestamp, minTimestamp);
- try {
- Message m = privateMessageFactory.createPrivateMessage(
- parentId, conversation, "text/plain", timestamp,
- body);
- storeMessage(m);
- } catch (GeneralSecurityException e) {
- throw new RuntimeException(e);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- });
- }
-
- private void storeMessage(final Message m) {
- runOnDbThread(new Runnable() {
- public void run() {
- try {
- long now = System.currentTimeMillis();
- messagingManager.addLocalMessage(m);
- long duration = System.currentTimeMillis() - now;
- if (LOG.isLoggable(INFO))
- LOG.info("Storing message took " + duration + " ms");
- } catch (DbException e) {
- if (LOG.isLoggable(WARNING))
- LOG.log(WARNING, e.toString(), e);
- }
- }
- });
- }
-}