Use "singleTask" to ensure a single ConversationActivity instance.

1) Mark the Activity as singleTask.

2) Process onNewIntent for updates.

3) Propagate onNewIntent to the ConversationFragment.

Fixes #2232
Fixes #1532
Fixes #146
Fixes #851
Closes #2266
This commit is contained in:
Moxie Marlinspike 2014-12-24 18:32:51 -08:00 committed by Jake McGinty
parent d7419caa4b
commit 1443d846c4
3 changed files with 52 additions and 26 deletions

View File

@ -107,6 +107,7 @@
<activity android:name=".ConversationActivity"
android:windowSoftInputMode="stateUnchanged"
android:launchMode="singleTask"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".GroupCreateActivity"

View File

@ -178,19 +178,29 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
initializeReceivers();
initializeViews();
initializeResources();
}
@Override
protected void onStart() {
super.onStart();
initializeDraft();
}
@Override
protected void onStop() {
super.onStop();
saveDraft();
protected void onNewIntent(Intent intent) {
if (!Util.isEmpty(composeText) || attachmentManager.isAttachmentPresent()) {
saveDraft();
attachmentManager.clear();
composeText.setText("");
}
setIntent(intent);
initializeResources();
initializeDraft();
ConversationFragment fragment = getFragment();
if (fragment != null) {
fragment.onNewIntent();
}
}
@Override
@ -220,6 +230,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
protected void onDestroy() {
saveDraft();
unregisterReceiver(securityUpdateReceiver);
unregisterReceiver(groupUpdateReceiver);
MemoryCleaner.clean(masterSecret);
@ -718,24 +729,19 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
}
private void initializeResources() {
recipients = RecipientFactory.getRecipientsForIds(this, getIntent().getLongArrayExtra(RECIPIENTS_EXTRA), true);
threadId = getIntent().getLongExtra(THREAD_ID_EXTRA, -1);
distributionType = getIntent().getIntExtra(DISTRIBUTION_TYPE_EXTRA,
ThreadDatabase.DistributionTypes.DEFAULT);
sendButton = (SendButton)findViewById(R.id.send_button);
composeText = (EditText)findViewById(R.id.embedded_text_editor);
masterSecret = getIntent().getParcelableExtra(MASTER_SECRET_EXTRA);
charactersLeft = (TextView)findViewById(R.id.space_left);
emojiDrawer = (EmojiDrawer)findViewById(R.id.emoji_drawer);
emojiToggle = (EmojiToggle)findViewById(R.id.emoji_toggle);
private void initializeViews() {
sendButton = (SendButton) findViewById(R.id.send_button);
composeText = (EditText) findViewById(R.id.embedded_text_editor);
charactersLeft = (TextView) findViewById(R.id.space_left);
emojiDrawer = (EmojiDrawer) findViewById(R.id.emoji_drawer);
emojiToggle = (EmojiToggle) findViewById(R.id.emoji_toggle);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
emojiToggle.setVisibility(View.GONE);
}
attachmentAdapter = new AttachmentTypeSelectorAdapter(this);
attachmentManager = new AttachmentManager(this, this);
attachmentAdapter = new AttachmentTypeSelectorAdapter(this);
attachmentManager = new AttachmentManager(this, this);
SendButtonListener sendButtonListener = new SendButtonListener();
ComposeKeyPressedListener composeKeyPressedListener = new ComposeKeyPressedListener();
@ -750,6 +756,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
composeText.setOnFocusChangeListener(composeKeyPressedListener);
emojiDrawer.setComposeEditText(composeText);
emojiToggle.setOnClickListener(new EmojiToggleListener());
}
private void initializeResources() {
recipients = RecipientFactory.getRecipientsForIds(this, getIntent().getLongArrayExtra(RECIPIENTS_EXTRA), true);
threadId = getIntent().getLongExtra(THREAD_ID_EXTRA, -1);
distributionType = getIntent().getIntExtra(DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT);
masterSecret = getIntent().getParcelableExtra(MASTER_SECRET_EXTRA);
recipients.addListener(new RecipientModifiedListener() {
@Override
@ -906,9 +919,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (this.threadId <= 0 || this.recipients == null || this.recipients.isEmpty())
return;
final Drafts drafts = getDraftsForCurrentState();
final long thisThreadId = this.threadId;
final Drafts drafts = getDraftsForCurrentState();
final long thisThreadId = this.threadId;
final MasterSecret thisMasterSecret = this.masterSecret.parcelClone();
new AsyncTask<Void, Void, Void>() {
@ -1001,8 +1013,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
boolean refreshFragment = (threadId != this.threadId);
this.threadId = threadId;
ConversationFragment fragment = (ConversationFragment) getSupportFragmentManager()
.findFragmentById(R.id.fragment_content);
ConversationFragment fragment = getFragment();
if (fragment == null) {
return;
@ -1018,6 +1029,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
fragment.scrollToBottom();
}
private ConversationFragment getFragment() {
return (ConversationFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_content);
}
private void sendMessage() {
try {
final Recipients recipients = getRecipients();

View File

@ -78,6 +78,16 @@ public class ConversationFragment extends ListFragment
this.listener = (ConversationFragmentListener)activity;
}
public void onNewIntent() {
if (actionMode != null) {
actionMode.finish();
}
initializeResources();
initializeListAdapter();
getLoaderManager().restartLoader(0, null, this);
}
private void initializeResources() {
this.masterSecret = this.getActivity().getIntent().getParcelableExtra("master_secret");
this.recipients = RecipientFactory.getRecipientsForIds(getActivity(), getActivity().getIntent().getLongArrayExtra("recipients"), true);