diff --git a/briar-android/src/net/sf/briar/android/AndroidModule.java b/briar-android/src/net/sf/briar/android/AndroidModule.java index b13d5756f5b8bcef2781f25b774dc4078c4019b0..ceac1c7a437415d1e53f25b2c77c00a43eab04b3 100644 --- a/briar-android/src/net/sf/briar/android/AndroidModule.java +++ b/briar-android/src/net/sf/briar/android/AndroidModule.java @@ -8,7 +8,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import net.sf.briar.api.android.AndroidExecutor; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.ReferenceManager; import net.sf.briar.api.crypto.CryptoComponent; @@ -33,8 +32,6 @@ public class AndroidModule extends AbstractModule { @Override protected void configure() { bind(AndroidExecutor.class).to(AndroidExecutorImpl.class); - bind(BundleEncrypter.class).to(BundleEncrypterImpl.class).in( - Singleton.class); bind(ReferenceManager.class).to(ReferenceManagerImpl.class).in( Singleton.class); // Use a single thread so DB accesses from the UI don't overlap, with diff --git a/briar-android/src/net/sf/briar/android/BriarActivity.java b/briar-android/src/net/sf/briar/android/BriarActivity.java deleted file mode 100644 index 5afee39e12ee23c2fdc97892ff49ea8c5d3700dc..0000000000000000000000000000000000000000 --- a/briar-android/src/net/sf/briar/android/BriarActivity.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.sf.briar.android; - -import roboguice.activity.RoboActivity; -import android.os.Bundle; - -/** - * An abstract superclass for activities that overrides the default behaviour - * to prevent sensitive state from being saved unless the subclass explicitly - * saves it. - */ -public abstract class BriarActivity extends RoboActivity { - - @Override - public void onCreate(Bundle state) { - // Don't pass state through to the superclass - super.onCreate(null); - } - - @Override - public void onRestoreInstanceState(Bundle state) { - // Don't pass state through to the superclass - } - - @Override - public void onSaveInstanceState(Bundle state) { - // Don't allow the superclass to save state - } - - protected void finishOnUiThread() { - runOnUiThread(new Runnable() { - public void run() { - finish(); - } - }); - } -} diff --git a/briar-android/src/net/sf/briar/android/BriarFragmentActivity.java b/briar-android/src/net/sf/briar/android/BriarFragmentActivity.java deleted file mode 100644 index 44809a3bf2343da4d1ebf65423e132b9daff8248..0000000000000000000000000000000000000000 --- a/briar-android/src/net/sf/briar/android/BriarFragmentActivity.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.sf.briar.android; - -import roboguice.activity.RoboFragmentActivity; -import android.os.Bundle; - -/** - * An abstract superclass for activities that overrides the default behaviour - * to prevent sensitive state from being saved unless the subclass explicitly - * saves it. - */ -public class BriarFragmentActivity extends RoboFragmentActivity { - - @Override - public void onCreate(Bundle state) { - // Don't pass state through to the superclass - super.onCreate(null); - } - - @Override - public void onRestoreInstanceState(Bundle state) { - // Don't pass state through to the superclass - } - - @Override - public void onSaveInstanceState(Bundle state) { - // Don't allow the superclass to save state - } - - protected void finishOnUiThread() { - runOnUiThread(new Runnable() { - public void run() { - finish(); - } - }); - } -} diff --git a/briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java b/briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java deleted file mode 100644 index 34197abd11c6b09332c3a2b0e93144f23dfa947a..0000000000000000000000000000000000000000 --- a/briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.sf.briar.android; - -import static java.util.logging.Level.INFO; - -import java.util.logging.Logger; - -import net.sf.briar.api.android.BundleEncrypter; -import net.sf.briar.api.crypto.CryptoComponent; -import net.sf.briar.util.ByteUtils; -import android.os.Bundle; -import android.os.Parcel; - -import com.google.inject.Inject; - -class BundleEncrypterImpl implements BundleEncrypter { - - private static final Logger LOG = - Logger.getLogger(BundleEncrypterImpl.class.getName()); - - private final CryptoComponent crypto; - - @Inject - BundleEncrypterImpl(CryptoComponent crypto) { - this.crypto = crypto; - } - - @Override - public void encrypt(Bundle b) { - // Marshall the plaintext contents into a byte array - Parcel p = Parcel.obtain(); - b.writeToParcel(p, 0); - byte[] plaintext = p.marshall(); - p.recycle(); - if(LOG.isLoggable(INFO)) { - LOG.info("Marshalled " + b.size() + " mappings, " - + plaintext.length + " plaintext bytes"); - } - // Encrypt the plaintext - byte[] ciphertext = crypto.encryptTemporaryStorage(plaintext); - ByteUtils.erase(plaintext); - // Replace the plaintext contents with the ciphertext - b.clear(); - b.putByteArray("net.sf.briar.CIPHERTEXT", ciphertext); - } - - @Override - public boolean decrypt(Bundle b) { - // Retrieve the ciphertext - byte[] ciphertext = b.getByteArray("net.sf.briar.CIPHERTEXT"); - if(ciphertext == null) throw new IllegalArgumentException(); - // Decrypt the ciphertext - byte[] plaintext = crypto.decryptTemporaryStorage(ciphertext); - if(plaintext == null) return false; - // Unmarshall the plaintext - Parcel p = Parcel.obtain(); - p.unmarshall(plaintext, 0, plaintext.length); - ByteUtils.erase(plaintext); - // Restore the plaintext contents - p.setDataPosition(0); - b.readFromParcel(p); - p.recycle(); - if(LOG.isLoggable(INFO)) { - LOG.info("Unmarshalled " + (b.size() - 1) + " mappings, " - + plaintext.length + " plaintext bytes"); - } - return true; - } -} diff --git a/briar-android/src/net/sf/briar/android/HomeScreenActivity.java b/briar-android/src/net/sf/briar/android/HomeScreenActivity.java index 7749ef1085cfe4355678d37f607703928c7a9a1e..2798b2693ed2d7aee783c06034a0f1fd534ca0c8 100644 --- a/briar-android/src/net/sf/briar/android/HomeScreenActivity.java +++ b/briar-android/src/net/sf/briar/android/HomeScreenActivity.java @@ -36,6 +36,7 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseConfig; import net.sf.briar.api.db.DbException; import net.sf.briar.util.StringUtils; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -58,7 +59,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class HomeScreenActivity extends BriarActivity { +public class HomeScreenActivity extends RoboActivity { // This build expires at the beginning of June 2013 private static final long EXPIRY_DATE = 1370044800000L; @@ -84,7 +85,7 @@ public class HomeScreenActivity extends BriarActivity { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); boolean quit = i.getBooleanExtra("net.sf.briar.QUIT", false); long handle = i.getLongExtra("net.sf.briar.LOCAL_AUTHOR_HANDLE", -1); diff --git a/briar-android/src/net/sf/briar/android/SetupActivity.java b/briar-android/src/net/sf/briar/android/SetupActivity.java index fbae8b829da33098e47aafae24cebf935dab9ebd..f54e4e67467d8abfec7105313d0948b919a6ee43 100644 --- a/briar-android/src/net/sf/briar/android/SetupActivity.java +++ b/briar-android/src/net/sf/briar/android/SetupActivity.java @@ -25,6 +25,7 @@ import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoExecutor; import net.sf.briar.api.db.DatabaseConfig; import net.sf.briar.util.StringUtils; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; @@ -40,7 +41,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class SetupActivity extends BriarActivity implements OnClickListener { +public class SetupActivity extends RoboActivity implements OnClickListener { private static final int MIN_PASSWORD_LENGTH = 8; @@ -58,7 +59,7 @@ public class SetupActivity extends BriarActivity implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/SplashScreenActivity.java b/briar-android/src/net/sf/briar/android/SplashScreenActivity.java index 2c1e6000566a50e3ae1ab459ffde337530de21ee..2ff1a7d050b9c06de72887eebaccf3508a2cd983 100644 --- a/briar-android/src/net/sf/briar/android/SplashScreenActivity.java +++ b/briar-android/src/net/sf/briar/android/SplashScreenActivity.java @@ -22,7 +22,7 @@ public class SplashScreenActivity extends RoboSplashActivity { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setGravity(CENTER); diff --git a/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java b/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java index 4e8095e9a3e8fd0fd920f25c27dec586438123f0..c1c0cf0776bcf7d1be75800c4240e37d9e9e5071 100644 --- a/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java @@ -15,7 +15,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.AscendingHeaderComparator; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; @@ -32,6 +31,7 @@ import net.sf.briar.api.db.event.MessageExpiredEvent; import net.sf.briar.api.db.event.RatingChangedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -44,7 +44,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class BlogActivity extends BriarFragmentActivity +public class BlogActivity extends RoboFragmentActivity implements DatabaseListener, OnClickListener, OnItemClickListener { private static final Logger LOG = @@ -65,7 +65,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -125,7 +125,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { displayHeaders(headers); } catch(NoSuchSubscriptionException e) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -204,7 +208,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e; if(s.getGroup().getId().equals(groupId)) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } } } diff --git a/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java b/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java index c7a8f1d0c6a912db32a3b6c25deaf338c22e4f81..adbca52d6ef3c89cd40aa0333f8a9df6bfdf49e3 100644 --- a/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java @@ -19,7 +19,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; @@ -39,6 +38,7 @@ import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -51,7 +51,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class BlogListActivity extends BriarFragmentActivity +public class BlogListActivity extends RoboFragmentActivity implements DatabaseListener, OnClickListener, NoBlogsDialog.Listener, OnItemClickListener { @@ -72,7 +72,7 @@ OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java b/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java index e21a4f911716eb98fd179b869f63618052c41d57..420eebf2bcb47366dcd02065a603039189a5470c 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java @@ -15,7 +15,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.contact.SelectContactsDialog; @@ -28,6 +27,7 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -41,7 +41,7 @@ import android.widget.RadioGroup; import com.google.inject.Inject; -public class ConfigureBlogActivity extends BriarFragmentActivity +public class ConfigureBlogActivity extends RoboFragmentActivity implements OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -66,7 +66,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -227,7 +227,11 @@ SelectContactsDialog.Listener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java b/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java index 26444d0f285025103c9e2fbfb2f377df15118237..fe7d99ae6496caf42dd723458c4cd133ea508594 100644 --- a/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java @@ -21,7 +21,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.contact.SelectContactsDialog; @@ -36,6 +35,7 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.messaging.GroupFactory; import net.sf.briar.api.messaging.LocalGroup; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -53,7 +53,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class CreateBlogActivity extends BriarFragmentActivity +public class CreateBlogActivity extends RoboFragmentActivity implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -79,7 +79,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -254,7 +254,11 @@ SelectContactsDialog.Listener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java b/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java index 539203a68e296aed93020c1e76087dfb425521ca..32b453e9d7c88ead1d9b15684c3b4ddcc9df96c2 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.logging.Logger; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.api.android.DatabaseUiExecutor; @@ -26,6 +25,7 @@ import net.sf.briar.api.db.event.SubscriptionAddedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -35,7 +35,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ManageBlogsActivity extends BriarFragmentActivity +public class ManageBlogsActivity extends RoboFragmentActivity implements DatabaseListener, OnItemClickListener { private static final Logger LOG = @@ -53,7 +53,7 @@ implements DatabaseListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); adapter = new ManageBlogsAdapter(this); list = new ListView(this); diff --git a/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java index f27e0ae4a363250f4de343a17f232f468162b0dc..51f0993049984844627c8850cc55fc01efe83aab 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java @@ -19,12 +19,10 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalSpace; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; @@ -32,6 +30,7 @@ import net.sf.briar.api.db.NoSuchMessageException; import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.Rating; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; @@ -46,7 +45,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class ReadBlogPostActivity extends BriarFragmentActivity +public class ReadBlogPostActivity extends RoboFragmentActivity implements OnClickListener { static final int RESULT_REPLY = RESULT_FIRST_USER; @@ -59,7 +58,6 @@ implements OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private GroupId groupId = null; private boolean postable = false; private Rating rating = UNRATED; @@ -76,7 +74,7 @@ implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -97,11 +95,11 @@ implements OnClickListener { long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); if(timestamp == -1) throw new IllegalStateException(); - if(state != null && bundleEncrypter.decrypt(state)) { - read = state.getBoolean("net.sf.briar.READ"); - } else { + if(state == null) { read = false; setReadInDatabase(true); + } else { + read = state.getBoolean("net.sf.briar.READ"); } LinearLayout layout = new LinearLayout(this); @@ -255,7 +253,11 @@ implements OnClickListener { }); } catch(NoSuchMessageException e) { if(LOG.isLoggable(INFO)) LOG.info("Message removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -272,8 +274,8 @@ implements OnClickListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); state.putBoolean("net.sf.briar.READ", read); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java index a6e3ab970310e2079e58985635039b4421e460bd..e8242ba17ceecdff5bccf257bbfd23471c01993f 100644 --- a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.identity.CreateIdentityActivity; @@ -26,7 +25,6 @@ import net.sf.briar.android.identity.LocalAuthorItemComparator; import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter; import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.api.LocalAuthor; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.KeyParser; @@ -37,9 +35,9 @@ import net.sf.briar.api.messaging.LocalGroup; import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; @@ -53,7 +51,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class WriteBlogPostActivity extends BriarActivity +public class WriteBlogPostActivity extends RoboActivity implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = @@ -62,7 +60,6 @@ implements OnItemSelectedListener, OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; @Inject private CryptoComponent crypto; @Inject private MessageFactory messageFactory; private LocalAuthorSpinnerAdapter fromAdapter = null; @@ -81,7 +78,7 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -142,10 +139,6 @@ implements OnItemSelectedListener, OnClickListener { int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | TYPE_TEXT_FLAG_CAP_SENTENCES; content.setInputType(inputType); - if(state != null && bundleEncrypter.decrypt(state)) { - Parcelable p = state.getParcelable("net.sf.briar.CONTENT"); - if(p != null) content.onRestoreInstanceState(p); - } layout.addView(content); setContentView(layout); @@ -241,13 +234,6 @@ implements OnItemSelectedListener, OnClickListener { }); } - @Override - public void onSaveInstanceState(Bundle state) { - Parcelable p = content.onSaveInstanceState(); - state.putParcelable("net.sf.briar.CONTENT", p); - bundleEncrypter.encrypt(state); - } - @Override public void onDestroy() { super.onDestroy(); diff --git a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java index f6ee26f870aa10e9690cff834cdf89d9a0c8748f..ccc41eb1b05d08a1703bf06ff968425f758d24b7 100644 --- a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java +++ b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.invitation.AddContactActivity; @@ -37,6 +36,7 @@ import net.sf.briar.api.db.event.DatabaseEvent; import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.transport.ConnectionListener; import net.sf.briar.api.transport.ConnectionRegistry; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -48,7 +48,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ContactListActivity extends BriarActivity +public class ContactListActivity extends RoboActivity implements OnClickListener, DatabaseListener, ConnectionListener { private static final Logger LOG = @@ -68,7 +68,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java b/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java index be63993446ca61d80dac0a20f8a29cbe6be62152..d432b28334dd7fa26005a6f5d3dfc6c164045733 100644 --- a/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java @@ -15,7 +15,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.contact.SelectContactsDialog; @@ -28,6 +27,7 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -41,7 +41,7 @@ import android.widget.RadioGroup; import com.google.inject.Inject; -public class ConfigureGroupActivity extends BriarFragmentActivity +public class ConfigureGroupActivity extends RoboFragmentActivity implements OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -66,7 +66,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -225,7 +225,11 @@ SelectContactsDialog.Listener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java b/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java index ee0dbafd20b07344c0e439c2d8a8af7e463d6f97..04bd359254ed0e40b3df33546f7ab856b9018a4a 100644 --- a/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.contact.SelectContactsDialog; @@ -33,6 +32,7 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupFactory; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -50,7 +50,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class CreateGroupActivity extends BriarFragmentActivity +public class CreateGroupActivity extends RoboFragmentActivity implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -74,7 +74,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -188,7 +188,11 @@ SelectContactsDialog.Listener { } catch(IOException e) { throw new RuntimeException(e); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/groups/GroupActivity.java b/briar-android/src/net/sf/briar/android/groups/GroupActivity.java index ee389d2feba68f65ecf43a16a9b76c5e7b0fef6b..9604a5c8288b74d42a8ec3be283ad7af630b0ff4 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupActivity.java @@ -15,7 +15,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.AscendingHeaderComparator; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; @@ -32,6 +31,7 @@ import net.sf.briar.api.db.event.MessageExpiredEvent; import net.sf.briar.api.db.event.RatingChangedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -44,7 +44,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class GroupActivity extends BriarActivity implements DatabaseListener, +public class GroupActivity extends RoboActivity implements DatabaseListener, OnClickListener, OnItemClickListener { private static final Logger LOG = @@ -64,7 +64,7 @@ OnClickListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -123,7 +123,11 @@ OnClickListener, OnItemClickListener { displayHeaders(headers); } catch(NoSuchSubscriptionException e) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -202,7 +206,11 @@ OnClickListener, OnItemClickListener { SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e; if(s.getGroup().getId().equals(groupId)) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } } } diff --git a/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java b/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java index dcab38c8c34fcaab049bcf935030177c57baaef1..1601f97f27c7ea887abf984361d9c77c5295c91e 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; @@ -37,6 +36,7 @@ import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -49,7 +49,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class GroupListActivity extends BriarFragmentActivity +public class GroupListActivity extends RoboFragmentActivity implements DatabaseListener, OnClickListener, NoGroupsDialog.Listener, OnItemClickListener { @@ -70,7 +70,7 @@ OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java b/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java index 976f8b9a55b54f1d3aac91630ed4100824a65bf1..a62f607c3328d182efa5ebfbd213589b207f8ece 100644 --- a/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.logging.Logger; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.api.android.DatabaseUiExecutor; @@ -26,6 +25,7 @@ import net.sf.briar.api.db.event.SubscriptionAddedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -35,7 +35,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ManageGroupsActivity extends BriarFragmentActivity +public class ManageGroupsActivity extends RoboFragmentActivity implements DatabaseListener, OnItemClickListener { private static final Logger LOG = @@ -53,7 +53,7 @@ implements DatabaseListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); adapter = new ManageGroupsAdapter(this); list = new ListView(this); diff --git a/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java index bc5a33a3d7b4ff3fb741bea4384221eac5129d86..9576d90ef2255101e9c222ceb72470683bde821a 100644 --- a/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java @@ -19,13 +19,11 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.api.AuthorId; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; @@ -33,6 +31,7 @@ import net.sf.briar.api.db.NoSuchMessageException; import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.Rating; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; @@ -47,7 +46,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class ReadGroupPostActivity extends BriarActivity +public class ReadGroupPostActivity extends RoboActivity implements OnClickListener { static final int RESULT_REPLY = RESULT_FIRST_USER; @@ -60,7 +59,6 @@ implements OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private GroupId groupId = null; private Rating rating = UNRATED; private boolean read; @@ -78,7 +76,7 @@ implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -104,11 +102,11 @@ implements OnClickListener { long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); if(timestamp == -1) throw new IllegalStateException(); - if(state != null && bundleEncrypter.decrypt(state)) { - read = state.getBoolean("net.sf.briar.READ"); - } else { + if(state == null) { read = false; setReadInDatabase(true); + } else { + read = state.getBoolean("net.sf.briar.READ"); } LinearLayout layout = new LinearLayout(this); @@ -279,7 +277,11 @@ implements OnClickListener { }); } catch(NoSuchMessageException e) { if(LOG.isLoggable(INFO)) LOG.info("Message removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -296,8 +298,8 @@ implements OnClickListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); state.putBoolean("net.sf.briar.READ", read); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java index afacecf6fc134ee2e9a13f0c3a5b1157c7b4bce3..cb05d3266c8eabe6363f1f1cdb2d3c067bcd9cca 100644 --- a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.identity.CreateIdentityActivity; @@ -29,7 +28,6 @@ import net.sf.briar.android.identity.LocalAuthorItemComparator; import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter; import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.api.LocalAuthor; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.KeyParser; @@ -40,9 +38,9 @@ import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; @@ -56,7 +54,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class WriteGroupPostActivity extends BriarActivity +public class WriteGroupPostActivity extends RoboActivity implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = @@ -65,7 +63,6 @@ implements OnItemSelectedListener, OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; @Inject private CryptoComponent crypto; @Inject private MessageFactory messageFactory; private LocalAuthorSpinnerAdapter fromAdapter = null; @@ -84,7 +81,7 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -145,10 +142,6 @@ implements OnItemSelectedListener, OnClickListener { int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | TYPE_TEXT_FLAG_CAP_SENTENCES; content.setInputType(inputType); - if(state != null && bundleEncrypter.decrypt(state)) { - Parcelable p = state.getParcelable("net.sf.briar.CONTENT"); - if(p != null) content.onRestoreInstanceState(p); - } layout.addView(content); setContentView(layout); @@ -246,13 +239,6 @@ implements OnItemSelectedListener, OnClickListener { }); } - @Override - public void onSaveInstanceState(Bundle state) { - Parcelable p = content.onSaveInstanceState(); - state.putParcelable("net.sf.briar.CONTENT", p); - bundleEncrypter.encrypt(state); - } - @Override public void onDestroy() { super.onDestroy(); diff --git a/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java b/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java index f5928c8efcaba39f3283c1bfc4e9b8c36ccb250a..eeadc22e682d56520248c250aa58cfa4248f80f5 100644 --- a/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java +++ b/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.api.AuthorFactory; @@ -30,6 +29,7 @@ import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoExecutor; import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -45,7 +45,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class CreateIdentityActivity extends BriarActivity +public class CreateIdentityActivity extends RoboActivity implements OnEditorActionListener, OnClickListener { private static final Logger LOG = @@ -67,7 +67,7 @@ implements OnEditorActionListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -168,7 +168,11 @@ implements OnEditorActionListener, OnClickListener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java index 33a43d4ade6668c2d36ae2605c71fc09b82f0ec1..43378046d12287ffda8910a9699708701db425e5 100644 --- a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java +++ b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java @@ -12,7 +12,6 @@ import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.identity.LocalAuthorItem; @@ -20,7 +19,6 @@ import net.sf.briar.android.identity.LocalAuthorItemComparator; import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter; import net.sf.briar.api.AuthorId; import net.sf.briar.api.LocalAuthor; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.ReferenceManager; import net.sf.briar.api.crypto.CryptoComponent; @@ -30,6 +28,7 @@ import net.sf.briar.api.invitation.InvitationListener; import net.sf.briar.api.invitation.InvitationState; import net.sf.briar.api.invitation.InvitationTask; import net.sf.briar.api.invitation.InvitationTaskFactory; +import roboguice.activity.RoboActivity; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; @@ -41,7 +40,7 @@ import android.os.Bundle; import com.google.inject.Inject; -public class AddContactActivity extends BriarActivity +public class AddContactActivity extends RoboActivity implements InvitationListener { private static final Logger LOG = @@ -50,7 +49,6 @@ implements InvitationListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; @Inject private CryptoComponent crypto; @Inject private InvitationTaskFactory invitationTaskFactory; @Inject private ReferenceManager referenceManager; @@ -73,9 +71,9 @@ implements InvitationListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); - if(state == null || !bundleEncrypter.decrypt(state)) { - // This is a new activity or the app has restarted + super.onCreate(state); + if(state == null) { + // This is a new activity setView(new NetworkSetupView(this)); } else { // Restore the activity's state @@ -174,6 +172,7 @@ implements InvitationListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); if(localAuthorId != null) { state.putByteArray("net.sf.briar.LOCAL_AUTHOR_ID", localAuthorId.getBytes()); @@ -183,7 +182,6 @@ implements InvitationListener { state.putBoolean("net.sf.briar.FAILED", connectionFailed); state.putString("net.sf.briar.CONTACT_NAME", contactName); if(task != null) state.putLong("net.sf.briar.TASK_HANDLE", taskHandle); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java index b93b8be7f58972e0fc697ad970f32fe53ec5ef6d..68bcd1391e42252a88f8166bb0b775de5bc1e13b 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java @@ -13,7 +13,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.AscendingHeaderComparator; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; @@ -29,6 +28,7 @@ import net.sf.briar.api.db.event.DatabaseEvent; import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.MessageExpiredEvent; import net.sf.briar.api.db.event.PrivateMessageAddedEvent; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -41,7 +41,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ConversationActivity extends BriarActivity +public class ConversationActivity extends RoboActivity implements DatabaseListener, OnClickListener, OnItemClickListener { private static final Logger LOG = @@ -62,7 +62,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); @@ -124,7 +124,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { displayHeaders(headers); } catch(NoSuchContactException e) { if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -192,7 +196,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { ContactRemovedEvent c = (ContactRemovedEvent) e; if(c.getContactId().equals(contactId)) { if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } } else if(e instanceof MessageExpiredEvent) { if(LOG.isLoggable(INFO)) LOG.info("Message expired, reloading"); diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java index 379cedee6116dc13533d75e7f35b0202e47a6abd..eacfcc1ecccd52ce04633a50e72e9fce6f01d71c 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java @@ -13,7 +13,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.invitation.AddContactActivity; @@ -30,6 +29,7 @@ import net.sf.briar.api.db.event.DatabaseEvent; import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.MessageExpiredEvent; import net.sf.briar.api.db.event.PrivateMessageAddedEvent; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -40,7 +40,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ConversationListActivity extends BriarFragmentActivity +public class ConversationListActivity extends RoboFragmentActivity implements OnClickListener, DatabaseListener, NoContactsDialog.Listener { private static final Logger LOG = @@ -58,7 +58,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java index 811bbd27ad61358a8cec48ecbdaa954ea6bb600a..d1b7d3d87bff5972e56f0a8bbfc48057ce368548 100644 --- a/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java @@ -19,19 +19,18 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.api.ContactId; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.NoSuchMessageException; import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.Rating; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; @@ -46,7 +45,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class ReadPrivateMessageActivity extends BriarActivity +public class ReadPrivateMessageActivity extends RoboActivity implements OnClickListener { static final int RESULT_REPLY = RESULT_FIRST_USER; @@ -59,7 +58,6 @@ implements OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private ContactId contactId = null; private Rating rating = UNRATED; private boolean read; @@ -74,7 +72,7 @@ implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); @@ -96,11 +94,11 @@ implements OnClickListener { long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); if(timestamp == -1) throw new IllegalStateException(); - if(state != null && bundleEncrypter.decrypt(state)) { - read = state.getBoolean("net.sf.briar.READ"); - } else { + if(state == null) { read = false; setReadInDatabase(true); + } else { + read = state.getBoolean("net.sf.briar.READ"); } LinearLayout layout = new LinearLayout(this); @@ -249,7 +247,11 @@ implements OnClickListener { }); } catch(NoSuchMessageException e) { if(LOG.isLoggable(INFO)) LOG.info("Message removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -266,8 +268,8 @@ implements OnClickListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); state.putBoolean("net.sf.briar.READ", read); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java index ef421fcc599571a09cbd561cc4de9b189eb27ed0..734652ef9fc04b02be56213dae0639819db6210b 100644 --- a/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.contact.ContactItem; @@ -29,16 +28,15 @@ import net.sf.briar.api.AuthorId; import net.sf.briar.api.Contact; import net.sf.briar.api.ContactId; import net.sf.briar.api.LocalAuthor; -import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; @@ -52,7 +50,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class WritePrivateMessageActivity extends BriarActivity +public class WritePrivateMessageActivity extends RoboActivity implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = @@ -61,7 +59,6 @@ implements OnItemSelectedListener, OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private TextView from = null; private ContactSpinnerAdapter adapter = null; private Spinner spinner = null; @@ -78,7 +75,7 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); @@ -133,10 +130,6 @@ implements OnItemSelectedListener, OnClickListener { int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | TYPE_TEXT_FLAG_CAP_SENTENCES; content.setInputType(inputType); - if(state != null && bundleEncrypter.decrypt(state)) { - Parcelable p = state.getParcelable("net.sf.briar.CONTENT"); - if(p != null) content.onRestoreInstanceState(p); - } layout.addView(content); setContentView(layout); @@ -195,13 +188,6 @@ implements OnItemSelectedListener, OnClickListener { }); } - @Override - public void onSaveInstanceState(Bundle state) { - Parcelable p = content.onSaveInstanceState(); - state.putParcelable("net.sf.briar.CONTENT", p); - bundleEncrypter.encrypt(state); - } - @Override public void onDestroy() { super.onDestroy(); diff --git a/briar-api/src/net/sf/briar/api/android/BundleEncrypter.java b/briar-api/src/net/sf/briar/api/android/BundleEncrypter.java deleted file mode 100644 index e2af1a8324e564645675212c4560d395bc2b2718..0000000000000000000000000000000000000000 --- a/briar-api/src/net/sf/briar/api/android/BundleEncrypter.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.sf.briar.api.android; - -import android.os.Bundle; - -/** - * Encrypts and decrypts the contents of bundles in case the operating system - * writes them to unencrypted storage. - * <p> - * This interface is designed to be accessed from the UI thread, so - * implementations may not be thread-safe. - */ -public interface BundleEncrypter { - - /** - * Encrypts the given bundle, replacing its contents with the encrypted - * data. - */ - void encrypt(Bundle b); - - /** - * Decrypts the given bundle, replacing its contents with the decrypted - * data, or returns false if the bundle contains invalid data, which may - * occur if the process that created the encrypted bundle was terminated - * and replaced by the current process. - */ - boolean decrypt(Bundle b); -} diff --git a/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java b/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java index 517a7c6d2afdaef844de9cb7ff30eabfed202a57..3515588e0164a9385740d5945ec9cb2268f6dfc1 100644 --- a/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java +++ b/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java @@ -95,21 +95,6 @@ public interface CryptoComponent { void encodeTag(byte[] tag, Cipher tagCipher, ErasableKey tagKey, long connection); - /** - * Encrypts and authenticates the given plaintext so it can be written to - * temporary storage. The ciphertext will not be decryptable after the app - * restarts. - */ - byte[] encryptTemporaryStorage(byte[] plaintext); - - /** - * Decrypts and authenticates the given ciphertext that has been read from - * temporary storage. Returns null if the ciphertext cannot be decrypted - * and authenticated (for example, if it was written before the app - * restarted). - */ - byte[] decryptTemporaryStorage(byte[] ciphertext); - /** * Encrypts and authenticates the given plaintext so it can be written to * storage. The encryption and authentication keys are derived from the diff --git a/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java b/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java index c846af33a55d6d2c39e4d60ffeb19f005373121e..d16009c13d4b288d3e4f1e3f6fd9bc0b8574b11d 100644 --- a/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java +++ b/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java @@ -133,7 +133,6 @@ class CryptoComponentImpl implements CryptoComponent { private final KeyPairGenerator agreementKeyPairGenerator; private final KeyPairGenerator signatureKeyPairGenerator; private final SecureRandom secureRandom; - private final ErasableKey temporaryStorageKey; CryptoComponentImpl() { Security.addProvider(new BouncyCastleProvider()); @@ -156,7 +155,6 @@ class CryptoComponentImpl implements CryptoComponent { throw new RuntimeException(e); } secureRandom = new SecureRandom(); - temporaryStorageKey = generateSecretKey(); } public ErasableKey generateSecretKey() { @@ -372,49 +370,6 @@ class CryptoComponentImpl implements CryptoComponent { } } - public byte[] encryptTemporaryStorage(byte[] input) { - // Generate a random IV - byte[] ivBytes = new byte[STORAGE_IV_BYTES]; - secureRandom.nextBytes(ivBytes); - IvParameterSpec iv = new IvParameterSpec(ivBytes); - // The output contains the IV, ciphertext and MAC - int outputLen = STORAGE_IV_BYTES + input.length + GCM_MAC_BYTES; - byte[] output = new byte[outputLen]; - System.arraycopy(ivBytes, 0, output, 0, STORAGE_IV_BYTES); - // Initialise the cipher and encrypt the plaintext - Cipher cipher; - try { - cipher = Cipher.getInstance(STORAGE_CIPHER_ALGO, PROVIDER); - cipher.init(ENCRYPT_MODE, temporaryStorageKey, iv); - cipher.doFinal(input, 0, input.length, output, STORAGE_IV_BYTES); - return output; - } catch(GeneralSecurityException e) { - throw new RuntimeException(e); - } - } - - public byte[] decryptTemporaryStorage(byte[] input) { - // The input contains the IV, ciphertext and MAC - if(input.length < STORAGE_IV_BYTES + GCM_MAC_BYTES) - return null; // Invalid - IvParameterSpec iv = new IvParameterSpec(input, 0, STORAGE_IV_BYTES); - // Initialise the cipher - Cipher cipher; - try { - cipher = Cipher.getInstance(STORAGE_CIPHER_ALGO, PROVIDER); - cipher.init(DECRYPT_MODE, temporaryStorageKey, iv); - } catch(GeneralSecurityException e) { - throw new RuntimeException(e); - } - // Try to decrypt the ciphertext (may be invalid) - try { - return cipher.doFinal(input, STORAGE_IV_BYTES, - input.length - STORAGE_IV_BYTES); - } catch(GeneralSecurityException e) { - return null; // Invalid - } - } - public byte[] encryptWithPassword(byte[] input, char[] password) { // Generate a random salt byte[] salt = new byte[PBKDF_SALT_BYTES];