From bd1f3fc2bd38d6d9574b5b2454fd593de74eb346 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Oct 2016 10:04:00 -0300 Subject: [PATCH 1/9] Make ContactSelectorFragment reusable --- ...ions.xml => contact_selection_actions.xml} | 4 +-- briar-android/res/values-de/strings.xml | 2 +- briar-android/res/values-es/strings.xml | 2 +- briar-android/res/values-it/strings.xml | 2 +- briar-android/res/values-pt-rBR/strings.xml | 2 +- briar-android/res/values/strings.xml | 2 +- .../sharing/ContactSelectorFragment.java | 25 ++++++++----------- .../sharing/ContactSelectorListener.java | 25 +++++++++++++++++++ .../android/sharing/ShareActivity.java | 14 ++++++++--- .../android/sharing/ShareBlogActivity.java | 2 +- .../android/sharing/ShareForumActivity.java | 2 +- 11 files changed, 55 insertions(+), 27 deletions(-) rename briar-android/res/menu/{forum_share_actions.xml => contact_selection_actions.xml} (73%) create mode 100644 briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java diff --git a/briar-android/res/menu/forum_share_actions.xml b/briar-android/res/menu/contact_selection_actions.xml similarity index 73% rename from briar-android/res/menu/forum_share_actions.xml rename to briar-android/res/menu/contact_selection_actions.xml index a3d6c1547..fbef25059 100644 --- a/briar-android/res/menu/forum_share_actions.xml +++ b/briar-android/res/menu/contact_selection_actions.xml @@ -4,9 +4,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> \ No newline at end of file diff --git a/briar-android/res/values-de/strings.xml b/briar-android/res/values-de/strings.xml index 2967f16b1..e3f453755 100644 --- a/briar-android/res/values-de/strings.xml +++ b/briar-android/res/values-de/strings.xml @@ -171,7 +171,7 @@ Forum wurde verlassen Forum teilen - Teile dieses Forum mit den gewählten Kontakten + Teile dieses Forum mit den gewählten Kontakten Kontakte auswählen Du scheinst hier neu zu sein und noch keine Kontakte zu haben.\n\nBitte komm zurück, wenn du deinen ersten Kontakt hinzugefügt hast. Forum mit gewählten Kontakten geteilt diff --git a/briar-android/res/values-es/strings.xml b/briar-android/res/values-es/strings.xml index 521fbd9f8..63135b3bf 100644 --- a/briar-android/res/values-es/strings.xml +++ b/briar-android/res/values-es/strings.xml @@ -159,7 +159,7 @@ Foro abandonado Compartir foro - Compartir este foro con los contactos seleccionados + Compartir este foro con los contactos seleccionados Elige contactos Parece que eres nuevo aquí y no tienes contactos aún.\n\nPor favor, vuelve cuando hayas añadido tu primer contacto. Foro compartido con los contactos seleccionados diff --git a/briar-android/res/values-it/strings.xml b/briar-android/res/values-it/strings.xml index 28a764499..e7b7a678f 100644 --- a/briar-android/res/values-it/strings.xml +++ b/briar-android/res/values-it/strings.xml @@ -136,7 +136,7 @@ Forum lasciato Condividi Forum - Condividi questo forum con i contatti scelti + Condividi questo forum con i contatti scelti Scegli Contatti Forum condiviso con i contatti scelti C\'è stato un errore nella condivisione di questo forum. diff --git a/briar-android/res/values-pt-rBR/strings.xml b/briar-android/res/values-pt-rBR/strings.xml index 4fd4eb8c7..75d4cc14b 100644 --- a/briar-android/res/values-pt-rBR/strings.xml +++ b/briar-android/res/values-pt-rBR/strings.xml @@ -171,7 +171,7 @@ Se sentido sozinho aqui? Compartilhe esse fórum com seus contatos! Saiu do fórum Compartilhar fórum - Compartilhar este fórum com os contatos escolhidos + Compartilhar este fórum com os contatos escolhidos Escolher contatos Parece que você é novo aqui e não tem nenhum contato ainda. Por favor volte aqui depois de adicionar um contato. diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index b1652f5fb..004c00129 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -195,7 +195,7 @@ Share Forum - Share this forum with chosen contacts + Contacts selected Choose Contacts It seems that you are new here and have no contacts yet.\n\nPlease come back here after you added your first contact. Forum shared with chosen contacts diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java index 82db75adf..b496bcdeb 100644 --- a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java @@ -23,7 +23,6 @@ import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.db.DbException; -import org.briarproject.api.forum.ForumSharingManager; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.sync.GroupId; @@ -48,7 +47,6 @@ public class ContactSelectorFragment extends BaseFragment implements public static final String TAG = ContactSelectorFragment.class.getName(); private static final Logger LOG = Logger.getLogger(TAG); - private ShareActivity shareActivity; private Menu menu; private BriarRecyclerView list; private ContactSelectorAdapter adapter; @@ -59,13 +57,11 @@ public class ContactSelectorFragment extends BaseFragment implements volatile ContactManager contactManager; @Inject volatile IdentityManager identityManager; - @Inject - volatile ForumSharingManager forumSharingManager; private volatile GroupId groupId; + private volatile ContactSelectorListener listener; public static ContactSelectorFragment newInstance(GroupId groupId) { - Bundle args = new Bundle(); args.putByteArray(GROUP_ID, groupId.getBytes()); ContactSelectorFragment fragment = new ContactSelectorFragment(); @@ -81,7 +77,7 @@ public class ContactSelectorFragment extends BaseFragment implements @Override public void onAttach(Context context) { super.onAttach(context); - shareActivity = (ShareActivity) context; + listener = (ContactSelectorListener) context; } @Override @@ -139,6 +135,7 @@ public class ContactSelectorFragment extends BaseFragment implements @Override public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); if (adapter != null) { selectedContacts = adapter.getSelectedContactIds(); outState.putIntegerArrayList(CONTACTS, @@ -148,7 +145,7 @@ public class ContactSelectorFragment extends BaseFragment implements @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.forum_share_actions, menu); + inflater.inflate(R.menu.contact_selection_actions, menu); super.onCreateOptionsMenu(menu, inflater); this.menu = menu; // hide sharing action initially, if no contact is selected @@ -160,11 +157,11 @@ public class ContactSelectorFragment extends BaseFragment implements // Handle presses on the action bar items switch (item.getItemId()) { case android.R.id.home: - shareActivity.onBackPressed(); + listener.onBackPressed(); return true; - case R.id.action_share_forum: + case R.id.action_contacts_selected: selectedContacts = adapter.getSelectedContactIds(); - shareActivity.showMessageScreen(groupId, selectedContacts); + listener.contactsSelected(groupId, selectedContacts); return true; default: return super.onOptionsItemSelected(item); @@ -185,7 +182,7 @@ public class ContactSelectorFragment extends BaseFragment implements } private void loadContacts(@Nullable final Collection selection) { - shareActivity.runOnDbThread(new Runnable() { + listener.runOnDbThread(new Runnable() { @Override public void run() { try { @@ -199,7 +196,7 @@ public class ContactSelectorFragment extends BaseFragment implements boolean selected = selection != null && selection.contains(c.getId()); // do we have already some sharing with that contact? - boolean disabled = shareActivity.isDisabled(groupId, c); + boolean disabled = listener.isDisabled(groupId, c); contacts.add(new SelectableContactListItem(c, localAuthor, groupId, selected, disabled)); } @@ -216,7 +213,7 @@ public class ContactSelectorFragment extends BaseFragment implements } private void displayContacts(final List contacts) { - shareActivity.runOnUiThreadUnlessDestroyed(new Runnable() { + listener.runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { if (contacts.isEmpty()) list.showData(); @@ -228,7 +225,7 @@ public class ContactSelectorFragment extends BaseFragment implements private void updateMenuItem() { if (menu == null) return; - MenuItem item = menu.findItem(R.id.action_share_forum); + MenuItem item = menu.findItem(R.id.action_contacts_selected); if (item == null) return; selectedContacts = adapter.getSelectedContactIds(); diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java new file mode 100644 index 000000000..e1805594a --- /dev/null +++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java @@ -0,0 +1,25 @@ +package org.briarproject.android.sharing; + +import android.support.annotation.UiThread; + +import org.briarproject.android.DestroyableContext; +import org.briarproject.api.contact.Contact; +import org.briarproject.api.contact.ContactId; +import org.briarproject.api.db.DbException; +import org.briarproject.api.sync.GroupId; + +import java.util.Collection; + +public interface ContactSelectorListener extends DestroyableContext { + + void runOnDbThread(Runnable runnable); + + boolean isDisabled(GroupId groupId, Contact c) throws DbException; + + @UiThread + void contactsSelected(GroupId groupId, Collection contacts); + + @UiThread + void onBackPressed(); + +} diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java index d79a7ed2e..abef634fe 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java @@ -6,7 +6,7 @@ import android.view.View; import org.briarproject.R; import org.briarproject.android.BriarActivity; -import org.briarproject.android.fragment.BaseFragment; +import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; @@ -17,7 +17,7 @@ import java.util.Collection; import java.util.List; public abstract class ShareActivity extends BriarActivity implements - BaseFragment.BaseFragmentListener { + BaseFragmentListener, ContactSelectorListener { final static String CONTACTS = "contacts"; @@ -44,9 +44,15 @@ public abstract class ShareActivity extends BriarActivity implements abstract ShareMessageFragment getMessageFragment(GroupId groupId, Collection contacts); - abstract boolean isDisabled(GroupId groupId, Contact c) throws DbException; + /** + * This must only be called from a DbThread + */ + public abstract boolean isDisabled(GroupId groupId, Contact c) + throws DbException; - void showMessageScreen(GroupId groupId, Collection contacts) { + @Override + public void contactsSelected(GroupId groupId, + Collection contacts) { ShareMessageFragment messageFragment = getMessageFragment(groupId, contacts); diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java index 696ea1452..b102453e5 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java @@ -29,7 +29,7 @@ public class ShareBlogActivity extends ShareActivity { /** * This must only be called from a DbThread */ - boolean isDisabled(GroupId groupId, Contact c) throws DbException { + public boolean isDisabled(GroupId groupId, Contact c) throws DbException { return !blogSharingManager.canBeShared(groupId, c); } } diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java index 51a5d5a22..1f7653537 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java @@ -28,7 +28,7 @@ public class ShareForumActivity extends ShareActivity { /** * This must only be called from a DbThread */ - boolean isDisabled(GroupId groupId, Contact c) throws DbException { + public boolean isDisabled(GroupId groupId, Contact c) throws DbException { return !forumSharingManager.canBeShared(groupId, c); } } From feed2581c94459fe62f5333a8db48c38edf525c2 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Oct 2016 12:56:31 -0300 Subject: [PATCH 2/9] Factor out a reuseable MessageFragment --- briar-android/res/layout/activity_share.xml | 6 - briar-android/res/layout/fragment_message.xml | 10 ++ .../res/layout/fragment_share_message.xml | 28 ---- .../android/sharing/BaseMessageFragment.java | 94 ++++++++++++ .../android/sharing/ShareActivity.java | 137 +++++++++++++----- .../android/sharing/ShareBlogActivity.java | 28 ++-- .../sharing/ShareBlogMessageFragment.java | 69 ++------- .../android/sharing/ShareForumActivity.java | 31 ++-- .../sharing/ShareForumMessageFragment.java | 67 ++------- .../android/sharing/ShareMessageFragment.java | 135 ----------------- 10 files changed, 271 insertions(+), 334 deletions(-) delete mode 100644 briar-android/res/layout/activity_share.xml create mode 100644 briar-android/res/layout/fragment_message.xml delete mode 100644 briar-android/res/layout/fragment_share_message.xml create mode 100644 briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java delete mode 100644 briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java diff --git a/briar-android/res/layout/activity_share.xml b/briar-android/res/layout/activity_share.xml deleted file mode 100644 index 80f19387f..000000000 --- a/briar-android/res/layout/activity_share.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/briar-android/res/layout/fragment_message.xml b/briar-android/res/layout/fragment_message.xml new file mode 100644 index 000000000..168ff34a4 --- /dev/null +++ b/briar-android/res/layout/fragment_message.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/briar-android/res/layout/fragment_share_message.xml b/briar-android/res/layout/fragment_share_message.xml deleted file mode 100644 index 45b33c0ba..000000000 --- a/briar-android/res/layout/fragment_share_message.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - diff --git a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java new file mode 100644 index 000000000..bb26a29ad --- /dev/null +++ b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java @@ -0,0 +1,94 @@ +package org.briarproject.android.sharing; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.StringRes; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import org.briarproject.R; +import org.briarproject.android.fragment.BaseFragment; +import org.briarproject.android.view.LargeTextInputView; +import org.briarproject.android.view.TextInputView.TextInputListener; +import org.briarproject.util.StringUtils; + +import static org.briarproject.api.sharing.SharingConstants.MAX_INVITATION_MESSAGE_LENGTH; +import static org.briarproject.util.StringUtils.truncateUtf8; + +abstract class BaseMessageFragment extends BaseFragment + implements TextInputListener { + + protected LargeTextInputView message; + private MessageFragmentListener listener; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + listener = (MessageFragmentListener) context; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + // allow for "up" button to act as back button + setHasOptionsMenu(true); + + // inflate view + View v = inflater.inflate(R.layout.fragment_message, container, + false); + message = (LargeTextInputView) v.findViewById(R.id.messageView); + message.setButtonText(getString(getButtonText())); + message.setHint(getHintText()); + message.setListener(this); + + return v; + } + + protected void setTitle(int res) { + listener.setTitle(res); + } + + protected abstract @StringRes int getButtonText(); + protected abstract @StringRes int getHintText(); + + @Override + public void onStart() { + super.onStart(); + message.showSoftKeyboard(); + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + listener.onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onSendClick(String msg) { + // disable button to prevent accidental double actions + message.setSendButtonEnabled(false); + message.hideSoftKeyboard(); + + msg = truncateUtf8(msg, MAX_INVITATION_MESSAGE_LENGTH); + listener.onButtonClick(msg); + } + + public interface MessageFragmentListener { + + void onBackPressed(); + + void setTitle(@StringRes int titleRes); + + void onButtonClick(String message); + + } + +} diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java index abef634fe..85c1cbc2d 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java @@ -2,11 +2,14 @@ package org.briarproject.android.sharing; import android.content.Intent; import android.os.Bundle; -import android.view.View; +import android.support.annotation.StringRes; +import android.support.annotation.UiThread; +import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.BriarActivity; import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; +import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; @@ -15,34 +18,77 @@ import org.briarproject.api.sync.GroupId; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.logging.Logger; + +import static android.widget.Toast.LENGTH_SHORT; +import static java.util.logging.Level.WARNING; public abstract class ShareActivity extends BriarActivity implements - BaseFragmentListener, ContactSelectorListener { + BaseFragmentListener, ContactSelectorListener, MessageFragmentListener { + private final static Logger LOG = + Logger.getLogger(ShareActivity.class.getName()); final static String CONTACTS = "contacts"; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + private volatile GroupId groupId; + private volatile Collection contacts; - setContentView(R.layout.activity_share); + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + + setContentView(R.layout.activity_fragment_container); Intent i = getIntent(); byte[] b = i.getByteArrayExtra(GROUP_ID); if (b == null) throw new IllegalStateException("No GroupId"); - GroupId groupId = new GroupId(b); + groupId = new GroupId(b); - if (savedInstanceState == null) { + if (bundle == null) { ContactSelectorFragment contactSelectorFragment = ContactSelectorFragment.newInstance(groupId); getSupportFragmentManager().beginTransaction() - .add(R.id.shareContainer, contactSelectorFragment) + .add(R.id.fragmentContainer, contactSelectorFragment) .commit(); + } else { + ArrayList intContacts = + bundle.getIntegerArrayList(CONTACTS); + if (intContacts != null) { + contacts = getContactsFromIntegers(intContacts); + } } } - abstract ShareMessageFragment getMessageFragment(GroupId groupId, - Collection contacts); + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (contacts != null) { + outState.putIntegerArrayList(CONTACTS, + getContactsFromIds(contacts)); + } + } + + @UiThread + @Override + public void contactsSelected(GroupId groupId, + Collection contacts) { + this.groupId = groupId; + this.contacts = contacts; + + BaseMessageFragment messageFragment = getMessageFragment(); + + getSupportFragmentManager().beginTransaction() + .setCustomAnimations(android.R.anim.fade_in, + android.R.anim.fade_out, + android.R.anim.slide_in_left, + android.R.anim.slide_out_right) + .replace(R.id.fragmentContainer, messageFragment, + ContactSelectorFragment.TAG) + .addToBackStack(null) + .commit(); + } + + abstract BaseMessageFragment getMessageFragment(); /** * This must only be called from a DbThread @@ -50,26 +96,8 @@ public abstract class ShareActivity extends BriarActivity implements public abstract boolean isDisabled(GroupId groupId, Contact c) throws DbException; - @Override - public void contactsSelected(GroupId groupId, - Collection contacts) { - ShareMessageFragment messageFragment = - getMessageFragment(groupId, contacts); - - getSupportFragmentManager().beginTransaction() - .setCustomAnimations(android.R.anim.fade_in, - android.R.anim.fade_out, - android.R.anim.slide_in_left, - android.R.anim.slide_out_right) - .replace(R.id.shareContainer, messageFragment, - ContactSelectorFragment.TAG) - .addToBackStack(null) - .commit(); - } - static ArrayList getContactsFromIds( Collection contacts) { - // transform ContactIds to Integers so they can be added to a bundle ArrayList intContacts = new ArrayList<>(contacts.size()); for (ContactId contactId : contacts) { @@ -78,15 +106,8 @@ public abstract class ShareActivity extends BriarActivity implements return intContacts; } - void sharingSuccessful(View v) { - setResult(RESULT_OK); - hideSoftKeyboard(v); - supportFinishAfterTransition(); - } - static Collection getContactsFromIntegers( ArrayList intContacts) { - // turn contact integers from a bundle back to ContactIds List contacts = new ArrayList<>(intContacts.size()); for (Integer c : intContacts) { @@ -95,6 +116,50 @@ public abstract class ShareActivity extends BriarActivity implements return contacts; } + @UiThread + @Override + public void onButtonClick(String message) { + share(message); + setResult(RESULT_OK); + supportFinishAfterTransition(); + } + + private void share(final String msg) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + for (ContactId c : contacts) { + share(groupId, c, msg); + } + } catch (DbException e) { + // TODO proper error handling + sharingError(); + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } + } + }); + } + + /** + * This method must be run from the DbThread. + */ + protected abstract void share(GroupId g, ContactId c, String msg) + throws DbException; + + private void sharingError() { + runOnUiThreadUnlessDestroyed(new Runnable() { + @Override + public void run() { + int res = getSharingError(); + Toast.makeText(ShareActivity.this, res, LENGTH_SHORT).show(); + } + }); + } + + protected abstract @StringRes int getSharingError(); + @Override public void onFragmentCreated(String tag) { diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java index b102453e5..d4ad59a6a 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java @@ -1,5 +1,6 @@ package org.briarproject.android.sharing; +import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.contact.Contact; @@ -7,18 +8,17 @@ import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; import org.briarproject.api.sync.GroupId; -import java.util.Collection; - import javax.inject.Inject; public class ShareBlogActivity extends ShareActivity { + // Fields that are accessed from background threads must be volatile @Inject - volatile BlogSharingManager blogSharingManager; + protected volatile BlogSharingManager blogSharingManager; - ShareMessageFragment getMessageFragment(GroupId groupId, - Collection contacts) { - return ShareBlogMessageFragment.newInstance(groupId, contacts); + @Override + BaseMessageFragment getMessageFragment() { + return ShareBlogMessageFragment.newInstance(); } @Override @@ -26,10 +26,20 @@ public class ShareBlogActivity extends ShareActivity { component.inject(this); } - /** - * This must only be called from a DbThread - */ + @Override public boolean isDisabled(GroupId groupId, Contact c) throws DbException { return !blogSharingManager.canBeShared(groupId, c); } + + @Override + protected void share(GroupId g, ContactId c, String msg) + throws DbException { + blogSharingManager.sendInvitation(g, c, msg); + } + + @Override + protected int getSharingError() { + return R.string.blogs_sharing_error; + } + } diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java index d9f944ab0..6d4dfb7b2 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogMessageFragment.java @@ -4,38 +4,16 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.ActivityComponent; -import org.briarproject.api.blogs.BlogSharingManager; -import org.briarproject.api.contact.ContactId; -import org.briarproject.api.db.DbException; -import org.briarproject.api.sync.GroupId; -import java.util.Collection; -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static android.widget.Toast.LENGTH_SHORT; -import static java.util.logging.Level.WARNING; - -public class ShareBlogMessageFragment extends ShareMessageFragment { +public class ShareBlogMessageFragment extends BaseMessageFragment { public final static String TAG = ShareBlogMessageFragment.class.getName(); - private static final Logger LOG = Logger.getLogger(TAG); - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile BlogSharingManager blogSharingManager; - - public static ShareBlogMessageFragment newInstance(GroupId groupId, - Collection contacts) { - - ShareBlogMessageFragment fragment = new ShareBlogMessageFragment(); - fragment.setArguments(getArguments(groupId, contacts)); - return fragment; + public static ShareBlogMessageFragment newInstance() { + return new ShareBlogMessageFragment(); } @Override @@ -43,10 +21,17 @@ public class ShareBlogMessageFragment extends ShareMessageFragment { Bundle savedInstanceState) { setTitle(R.string.blogs_sharing_share); + return super.onCreateView(inflater, container, savedInstanceState); + } - View v = super.onCreateView(inflater, container, savedInstanceState); - ui.message.setButtonText(getString(R.string.blogs_sharing_button)); - return v; + @Override + protected int getButtonText() { + return R.string.blogs_sharing_button; + } + + @Override + protected int getHintText() { + return R.string.forum_share_message; } @Override @@ -59,32 +44,4 @@ public class ShareBlogMessageFragment extends ShareMessageFragment { return TAG; } - @Override - protected void share(final String msg) { - listener.runOnDbThread(new Runnable() { - @Override - public void run() { - try { - for (ContactId c : getContacts()) { - blogSharingManager.sendInvitation(getGroupId(), c, msg); - } - } catch (DbException e) { - sharingError(); - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } - - @Override - protected void sharingError() { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { - @Override - public void run() { - int res = R.string.blogs_sharing_error; - Toast.makeText(getContext(), res, LENGTH_SHORT).show(); - } - }); - } } diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java index 1f7653537..89093a2b0 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java @@ -1,5 +1,6 @@ package org.briarproject.android.sharing; +import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; @@ -7,17 +8,17 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.forum.ForumSharingManager; import org.briarproject.api.sync.GroupId; -import java.util.Collection; - import javax.inject.Inject; public class ShareForumActivity extends ShareActivity { - @Inject - volatile ForumSharingManager forumSharingManager; - ShareMessageFragment getMessageFragment(GroupId groupId, - Collection contacts) { - return ShareForumMessageFragment.newInstance(groupId, contacts); + // Fields that are accessed from background threads must be volatile + @Inject + protected volatile ForumSharingManager forumSharingManager; + + @Override + BaseMessageFragment getMessageFragment() { + return ShareForumMessageFragment.newInstance(); } @Override @@ -25,10 +26,20 @@ public class ShareForumActivity extends ShareActivity { component.inject(this); } - /** - * This must only be called from a DbThread - */ + @Override public boolean isDisabled(GroupId groupId, Contact c) throws DbException { return !forumSharingManager.canBeShared(groupId, c); } + + @Override + protected void share(GroupId g, ContactId c, String msg) + throws DbException { + forumSharingManager.sendInvitation(g, c, msg); + } + + @Override + protected int getSharingError() { + return R.string.forum_share_error; + } + } diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java index 8414096f0..7824567a3 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareForumMessageFragment.java @@ -4,38 +4,16 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.ActivityComponent; -import org.briarproject.api.contact.ContactId; -import org.briarproject.api.db.DbException; -import org.briarproject.api.forum.ForumSharingManager; -import org.briarproject.api.sync.GroupId; -import java.util.Collection; -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static android.widget.Toast.LENGTH_SHORT; -import static java.util.logging.Level.WARNING; - -public class ShareForumMessageFragment extends ShareMessageFragment { +public class ShareForumMessageFragment extends BaseMessageFragment { public final static String TAG = ShareForumMessageFragment.class.getName(); - private static final Logger LOG = Logger.getLogger(TAG); - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile ForumSharingManager forumSharingManager; - - public static ShareForumMessageFragment newInstance(GroupId groupId, - Collection contacts) { - - ShareForumMessageFragment fragment = new ShareForumMessageFragment(); - fragment.setArguments(getArguments(groupId, contacts)); - return fragment; + public static ShareForumMessageFragment newInstance() { + return new ShareForumMessageFragment(); } @Override @@ -46,6 +24,16 @@ public class ShareForumMessageFragment extends ShareMessageFragment { return super.onCreateView(inflater, container, savedInstanceState); } + @Override + protected int getButtonText() { + return R.string.forum_share_button; + } + + @Override + protected int getHintText() { + return R.string.forum_share_message; + } + @Override public void injectFragment(ActivityComponent component) { component.inject(this); @@ -56,33 +44,4 @@ public class ShareForumMessageFragment extends ShareMessageFragment { return TAG; } - @Override - protected void share(final String msg) { - listener.runOnDbThread(new Runnable() { - @Override - public void run() { - try { - for (ContactId c : getContacts()) { - forumSharingManager. - sendInvitation(getGroupId(), c, msg); - } - } catch (DbException e) { - sharingError(); - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } - - @Override - protected void sharingError() { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { - @Override - public void run() { - int res = R.string.forum_share_error; - Toast.makeText(getContext(), res, LENGTH_SHORT).show(); - } - }); - } } diff --git a/briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java deleted file mode 100644 index ea79398cf..000000000 --- a/briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.briarproject.android.sharing; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; - -import org.briarproject.R; -import org.briarproject.android.fragment.BaseFragment; -import org.briarproject.android.view.LargeTextInputView; -import org.briarproject.android.view.TextInputView.TextInputListener; -import org.briarproject.api.blogs.BlogSharingManager; -import org.briarproject.api.contact.ContactId; -import org.briarproject.api.forum.ForumSharingManager; -import org.briarproject.api.sync.GroupId; -import org.briarproject.util.StringUtils; - -import java.util.ArrayList; -import java.util.Collection; - -import javax.inject.Inject; - -import static org.briarproject.android.sharing.ShareActivity.CONTACTS; -import static org.briarproject.android.sharing.ShareActivity.getContactsFromIds; -import static org.briarproject.api.sharing.SharingConstants.GROUP_ID; -import static org.briarproject.api.sharing.SharingConstants.MAX_INVITATION_MESSAGE_LENGTH; - -abstract class ShareMessageFragment extends BaseFragment - implements TextInputListener { - - protected ViewHolder ui; - private ShareActivity shareActivity; - - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile ForumSharingManager forumSharingManager; - @Inject - protected volatile BlogSharingManager blogSharingManager; - private volatile GroupId groupId; - private volatile Collection contacts; - - protected static Bundle getArguments(GroupId groupId, - Collection contacts) { - - Bundle args = new Bundle(); - args.putByteArray(GROUP_ID, groupId.getBytes()); - args.putIntegerArrayList(CONTACTS, getContactsFromIds(contacts)); - return args; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - shareActivity = (ShareActivity) context; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - // allow for "up" button to act as back button - setHasOptionsMenu(true); - - // get groupID and contactIDs from fragment arguments - groupId = new GroupId(getArguments().getByteArray(GROUP_ID)); - ArrayList intContacts = - getArguments().getIntegerArrayList(CONTACTS); - if (intContacts == null) throw new IllegalArgumentException(); - contacts = ShareActivity.getContactsFromIntegers(intContacts); - - // inflate view - View v = inflater.inflate(R.layout.fragment_share_message, container, - false); - ui = new ViewHolder(v); - ui.message.setListener(this); - - return v; - } - - @Override - public void onStart() { - super.onStart(); - ui.message.showSoftKeyboard(); - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - shareActivity.onBackPressed(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - protected void setTitle(int res) { - shareActivity.setTitle(res); - } - - @Override - public void onSendClick(String msg) { - // disable button to prevent accidental double invitations - ui.message.setSendButtonEnabled(false); - - msg = StringUtils.truncateUtf8(msg, MAX_INVITATION_MESSAGE_LENGTH); - share(msg); - - // don't wait for the invitation to be made before finishing activity - shareActivity.sharingSuccessful(ui.message); - } - - abstract void share(final String msg); - - abstract void sharingError(); - - protected Collection getContacts() { - return contacts; - } - - protected GroupId getGroupId() { - return groupId; - } - - protected static class ViewHolder { - protected final LargeTextInputView message; - - private ViewHolder(View v) { - message = (LargeTextInputView) v - .findViewById(R.id.invitationMessageView); - } - } -} From d5f6e71cbae83a9d0437b83abfa25f31d8cfe9bf Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Oct 2016 13:02:53 -0300 Subject: [PATCH 3/9] Create a reusable ContactSelectorActivity --- .../android/sharing/BaseMessageFragment.java | 9 +- .../sharing/ContactSelectorActivity.java | 92 +++++++++++++++++++ .../android/sharing/ShareActivity.java | 68 +------------- 3 files changed, 103 insertions(+), 66 deletions(-) create mode 100644 briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java diff --git a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java index bb26a29ad..6616fe87c 100644 --- a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java @@ -12,7 +12,6 @@ import org.briarproject.R; import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.view.LargeTextInputView; import org.briarproject.android.view.TextInputView.TextInputListener; -import org.briarproject.util.StringUtils; import static org.briarproject.api.sharing.SharingConstants.MAX_INVITATION_MESSAGE_LENGTH; import static org.briarproject.util.StringUtils.truncateUtf8; @@ -78,7 +77,10 @@ abstract class BaseMessageFragment extends BaseFragment message.hideSoftKeyboard(); msg = truncateUtf8(msg, MAX_INVITATION_MESSAGE_LENGTH); - listener.onButtonClick(msg); + if(!listener.onButtonClick(msg)) { + message.setSendButtonEnabled(true); + message.showSoftKeyboard(); + } } public interface MessageFragmentListener { @@ -87,7 +89,8 @@ abstract class BaseMessageFragment extends BaseFragment void setTitle(@StringRes int titleRes); - void onButtonClick(String message); + /** Returns true when the button click has been consumed. */ + boolean onButtonClick(String message); } diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java new file mode 100644 index 000000000..793353de5 --- /dev/null +++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorActivity.java @@ -0,0 +1,92 @@ +package org.briarproject.android.sharing; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.CallSuper; +import android.support.annotation.UiThread; + +import org.briarproject.R; +import org.briarproject.android.BriarActivity; +import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; +import org.briarproject.api.contact.Contact; +import org.briarproject.api.contact.ContactId; +import org.briarproject.api.db.DbException; +import org.briarproject.api.sync.GroupId; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public abstract class ContactSelectorActivity extends BriarActivity implements + BaseFragmentListener, ContactSelectorListener { + + final static String CONTACTS = "contacts"; + + protected volatile GroupId groupId; + protected volatile Collection contacts; + + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + + setContentView(R.layout.activity_fragment_container); + + if (bundle != null) { + ArrayList intContacts = + bundle.getIntegerArrayList(CONTACTS); + if (intContacts != null) { + contacts = getContactsFromIntegers(intContacts); + } + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (contacts != null) { + outState.putIntegerArrayList(CONTACTS, + getContactsFromIds(contacts)); + } + } + + @CallSuper + @UiThread + @Override + public void contactsSelected(GroupId groupId, + Collection contacts) { + this.groupId = groupId; + this.contacts = contacts; + } + + /** + * This must only be called from a DbThread + */ + public abstract boolean isDisabled(GroupId groupId, Contact c) + throws DbException; + + static ArrayList getContactsFromIds( + Collection contacts) { + // transform ContactIds to Integers so they can be added to a bundle + ArrayList intContacts = new ArrayList<>(contacts.size()); + for (ContactId contactId : contacts) { + intContacts.add(contactId.getInt()); + } + return intContacts; + } + + static Collection getContactsFromIntegers( + ArrayList intContacts) { + // turn contact integers from a bundle back to ContactIds + List contacts = new ArrayList<>(intContacts.size()); + for (Integer c : intContacts) { + contacts.add(new ContactId(c)); + } + return contacts; + } + + @Override + public void onFragmentCreated(String tag) { + + } + +} diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java index 85c1cbc2d..81241e603 100644 --- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java @@ -7,38 +7,27 @@ import android.support.annotation.UiThread; import android.widget.Toast; import org.briarproject.R; -import org.briarproject.android.BriarActivity; -import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener; -import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; import org.briarproject.api.sync.GroupId; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.logging.Logger; import static android.widget.Toast.LENGTH_SHORT; import static java.util.logging.Level.WARNING; -public abstract class ShareActivity extends BriarActivity implements - BaseFragmentListener, ContactSelectorListener, MessageFragmentListener { +public abstract class ShareActivity extends ContactSelectorActivity implements + MessageFragmentListener { private final static Logger LOG = Logger.getLogger(ShareActivity.class.getName()); - final static String CONTACTS = "contacts"; - - private volatile GroupId groupId; - private volatile Collection contacts; @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); - setContentView(R.layout.activity_fragment_container); - Intent i = getIntent(); byte[] b = i.getByteArrayExtra(GROUP_ID); if (b == null) throw new IllegalStateException("No GroupId"); @@ -50,21 +39,6 @@ public abstract class ShareActivity extends BriarActivity implements getSupportFragmentManager().beginTransaction() .add(R.id.fragmentContainer, contactSelectorFragment) .commit(); - } else { - ArrayList intContacts = - bundle.getIntegerArrayList(CONTACTS); - if (intContacts != null) { - contacts = getContactsFromIntegers(intContacts); - } - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (contacts != null) { - outState.putIntegerArrayList(CONTACTS, - getContactsFromIds(contacts)); } } @@ -72,11 +46,9 @@ public abstract class ShareActivity extends BriarActivity implements @Override public void contactsSelected(GroupId groupId, Collection contacts) { - this.groupId = groupId; - this.contacts = contacts; + super.contactsSelected(groupId, contacts); BaseMessageFragment messageFragment = getMessageFragment(); - getSupportFragmentManager().beginTransaction() .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, @@ -90,38 +62,13 @@ public abstract class ShareActivity extends BriarActivity implements abstract BaseMessageFragment getMessageFragment(); - /** - * This must only be called from a DbThread - */ - public abstract boolean isDisabled(GroupId groupId, Contact c) - throws DbException; - - static ArrayList getContactsFromIds( - Collection contacts) { - // transform ContactIds to Integers so they can be added to a bundle - ArrayList intContacts = new ArrayList<>(contacts.size()); - for (ContactId contactId : contacts) { - intContacts.add(contactId.getInt()); - } - return intContacts; - } - - static Collection getContactsFromIntegers( - ArrayList intContacts) { - // turn contact integers from a bundle back to ContactIds - List contacts = new ArrayList<>(intContacts.size()); - for (Integer c : intContacts) { - contacts.add(new ContactId(c)); - } - return contacts; - } - @UiThread @Override - public void onButtonClick(String message) { + public boolean onButtonClick(String message) { share(message); setResult(RESULT_OK); supportFinishAfterTransition(); + return true; } private void share(final String msg) { @@ -160,9 +107,4 @@ public abstract class ShareActivity extends BriarActivity implements protected abstract @StringRes int getSharingError(); - @Override - public void onFragmentCreated(String tag) { - - } - } From c934ec30aa511d82184ff49163cd3b9bd8ce64e5 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Oct 2016 15:08:41 -0300 Subject: [PATCH 4/9] Move Up button handling into BaseFragment --- .../android/blogs/BasePostFragment.java | 14 -------------- .../android/blogs/BlogFragment.java | 6 ------ .../android/blogs/FeedFragment.java | 1 - .../android/blogs/ReblogFragment.java | 2 -- .../android/contact/ContactListFragment.java | 2 -- .../android/forum/ForumListFragment.java | 2 -- .../android/fragment/BaseFragment.java | 18 ++++++++++++++++++ .../android/sharing/BaseMessageFragment.java | 14 -------------- .../sharing/ContactSelectorFragment.java | 4 ---- 9 files changed, 18 insertions(+), 45 deletions(-) diff --git a/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java b/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java index 04ee0a747..9e2db81dc 100644 --- a/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java @@ -5,7 +5,6 @@ import android.support.annotation.CallSuper; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; @@ -36,8 +35,6 @@ abstract class BasePostFragment extends BaseFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - setHasOptionsMenu(true); - view = inflater.inflate(R.layout.fragment_blog_post, container, false); progressBar = (ProgressBar) view.findViewById(R.id.progressBar); @@ -60,17 +57,6 @@ abstract class BasePostFragment extends BaseFragment { stopPeriodicUpdate(); } - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - getActivity().onBackPressed(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - @UiThread protected void onBlogPostLoaded(BlogPostItem post) { progressBar.setVisibility(INVISIBLE); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java index eb6552091..8809864d5 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java @@ -80,9 +80,6 @@ public class BlogFragment extends BaseFragment implements @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - setHasOptionsMenu(true); - Bundle args = getArguments(); byte[] b = args.getByteArray(GROUP_ID); if (b == null) throw new IllegalStateException("No group ID in args"); @@ -151,9 +148,6 @@ public class BlogFragment extends BaseFragment implements android.R.anim.slide_in_left, android.R.anim.slide_out_right); switch (item.getItemId()) { - case android.R.id.home: - getActivity().onBackPressed(); - return true; case R.id.action_write_blog_post: Intent i = new Intent(getActivity(), WriteBlogPostActivity.class); diff --git a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java index 9545f34ff..4be0bc541 100644 --- a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java @@ -66,7 +66,6 @@ public class FeedFragment extends BaseFragment implements public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - setHasOptionsMenu(true); View v = inflater.inflate(R.layout.fragment_blog, container, false); adapter = new BlogPostAdapter(getActivity(), this); diff --git a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java index e3d50dfee..479fecaad 100644 --- a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java @@ -72,8 +72,6 @@ public class ReblogFragment extends BaseFragment implements TextInputListener { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - setHasOptionsMenu(true); - Bundle args = getArguments(); blogId = new GroupId(args.getByteArray(GROUP_ID)); postId = new MessageId(args.getByteArray(POST_ID)); diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java index 474b2cc2b..fe1e62a4d 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java @@ -106,8 +106,6 @@ public class ContactListFragment extends BaseFragment implements EventListener { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - setHasOptionsMenu(true); - View contentView = inflater.inflate(R.layout.list, container, false); diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java index 6bbf19657..f1faecd46 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java @@ -78,8 +78,6 @@ public class ForumListFragment extends BaseEventFragment implements public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - setHasOptionsMenu(true); - View contentView = inflater.inflate(R.layout.fragment_forum_list, container, false); diff --git a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java index 2cb6b13e6..223c01367 100644 --- a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java +++ b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.v4.app.Fragment; +import android.view.MenuItem; import org.briarproject.android.ActivityComponent; import org.briarproject.android.DestroyableContext; @@ -27,6 +28,9 @@ public abstract class BaseFragment extends Fragment @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + // allow for "up" button to act as back button + setHasOptionsMenu(true); } @@ -37,6 +41,17 @@ public abstract class BaseFragment extends Fragment listener.onFragmentCreated(getUniqueTag()); } + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + listener.onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + @UiThread protected void finish() { getActivity().supportFinishAfterTransition(); @@ -47,6 +62,9 @@ public abstract class BaseFragment extends Fragment @Deprecated void runOnDbThread(Runnable runnable); + @UiThread + void onBackPressed(); + @UiThread ActivityComponent getActivityComponent(); diff --git a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java index 6616fe87c..2613fd230 100644 --- a/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/BaseMessageFragment.java @@ -32,9 +32,6 @@ abstract class BaseMessageFragment extends BaseFragment public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // allow for "up" button to act as back button - setHasOptionsMenu(true); - // inflate view View v = inflater.inflate(R.layout.fragment_message, container, false); @@ -59,17 +56,6 @@ abstract class BaseMessageFragment extends BaseFragment message.showSoftKeyboard(); } - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - listener.onBackPressed(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - @Override public void onSendClick(String msg) { // disable button to prevent accidental double actions diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java index b496bcdeb..03e4da397 100644 --- a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java @@ -84,7 +84,6 @@ public class ContactSelectorFragment extends BaseFragment implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setHasOptionsMenu(true); Bundle args = getArguments(); byte[] b = args.getByteArray(GROUP_ID); if (b == null) throw new IllegalStateException("No GroupId"); @@ -156,9 +155,6 @@ public class ContactSelectorFragment extends BaseFragment implements public boolean onOptionsItemSelected(final MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { - case android.R.id.home: - listener.onBackPressed(); - return true; case R.id.action_contacts_selected: selectedContacts = adapter.getSelectedContactIds(); listener.contactsSelected(groupId, selectedContacts); From 8dc3bd2c4c87e7bfb5cbb24fc51cbce214008f2d Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Oct 2016 17:19:27 -0300 Subject: [PATCH 5/9] Implement private group creation and fetching in PrivateGroupManager --- .../api/privategroup/PrivateGroupManager.java | 3 ++ .../privategroup/PrivateGroupManagerImpl.java | 35 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java b/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java index 956a42344..f2253c99a 100644 --- a/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java +++ b/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java @@ -18,6 +18,9 @@ public interface PrivateGroupManager extends MessageTracker { @NotNull ClientId getClientId(); + /** Adds a new private group. */ + GroupId addPrivateGroup(String name) throws DbException; + /** Removes a dissolved private group. */ void removePrivateGroup(GroupId g) throws DbException; diff --git a/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java index 6f40bd9c6..05c2d4021 100644 --- a/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.logging.Logger; @@ -70,6 +71,21 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements return CLIENT_ID; } + @Override + public GroupId addPrivateGroup(String name) throws DbException { + PrivateGroup group; + Transaction txn = db.startTransaction(false); + try { + LocalAuthor a = identityManager.getLocalAuthor(txn); + group = privateGroupFactory.createPrivateGroup(name, a); + db.addGroup(txn, group.getGroup()); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + return group.getId(); + } + @Override public void removePrivateGroup(GroupId g) throws DbException { @@ -137,7 +153,24 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements @NotNull @Override public Collection getPrivateGroups() throws DbException { - return Collections.emptyList(); + Collection groups; + Transaction txn = db.startTransaction(true); + try { + groups = db.getGroups(txn, getClientId()); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + try { + Collection privateGroups = + new ArrayList(groups.size()); + for (Group g : groups) { + privateGroups.add(privateGroupFactory.parsePrivateGroup(g)); + } + return privateGroups; + } catch (FormatException e) { + throw new DbException(e); + } } @Override From 1a812f13272578317da6c9db3a9501f5a45a1800 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Oct 2016 12:28:04 -0300 Subject: [PATCH 6/9] UI for creating private groups --- briar-android/AndroidManifest.xml | 11 ++ .../res/layout/fragment_create_group.xml | 23 +++ .../res/menu/groups_list_actions.xml | 2 +- briar-android/res/values/strings.xml | 5 +- .../android/ActivityComponent.java | 7 + .../briarproject/android/ActivityModule.java | 9 + .../creation/CreateGroupActivity.java | 158 ++++++++++++++++++ .../creation/CreateGroupController.java | 19 +++ .../creation/CreateGroupControllerImpl.java | 68 ++++++++ .../creation/CreateGroupFragment.java | 93 +++++++++++ .../creation/CreateGroupListener.java | 15 ++ .../creation/CreateGroupMessageFragment.java | 33 ++++ .../privategroup/list/GroupListFragment.java | 14 +- .../android/sharing/BaseMessageFragment.java | 3 +- 14 files changed, 453 insertions(+), 7 deletions(-) create mode 100644 briar-android/res/layout/fragment_create_group.xml create mode 100644 briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java create mode 100644 briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupController.java create mode 100644 briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java create mode 100644 briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupFragment.java create mode 100644 briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupListener.java create mode 100644 briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupMessageFragment.java diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 1bb12bfff..aad00c6d9 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -100,6 +100,17 @@ /> + + + + + + + + +