diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml index 0bb07db5c..6df393ec0 100644 --- a/briar-android/src/main/AndroidManifest.xml +++ b/briar-android/src/main/AndroidManifest.xml @@ -179,7 +179,7 @@ android:name=".android.forum.CreateForumActivity" android:label="@string/create_forum_title" android:parentActivityName=".android.navdrawer.NavDrawerActivity" - android:windowSoftInputMode="stateVisible"> + android:windowSoftInputMode="adjustResize"> 0; } - @Override - public void onClick(View view) { - if (view == createForumButton) { - hideSoftKeyboard(view); - if (!validateName()) return; - createForumButton.setVisibility(GONE); - progress.setVisibility(VISIBLE); - storeForum(nameEntry.getText().toString()); - } + private void createForum() { + if (!validateName()) return; + hideSoftKeyboard(nameEntry); + createForumButton.setVisibility(GONE); + progress.setVisibility(VISIBLE); + storeForum(nameEntry.getText().toString()); } private void storeForum(final String name) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java deleted file mode 100644 index 315aed855..000000000 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/BaseGroupInviteActivity.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.briarproject.briar.android.privategroup.creation; - -import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; -import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; -import org.briarproject.briar.android.contactselection.ContactSelectorActivity; -import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler; -import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener; - -import java.util.Collection; - -import javax.inject.Inject; - -import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH; - -@MethodsNotNullByDefault -@ParametersNotNullByDefault -public abstract class BaseGroupInviteActivity - extends ContactSelectorActivity implements MessageFragmentListener { - - @Inject - CreateGroupController controller; - - @Override - public void contactsSelected(Collection contacts) { - super.contactsSelected(contacts); - - showNextFragment(new CreateGroupMessageFragment()); - } - - @Override - public boolean onButtonClick(String message) { - if (groupId == null) - throw new IllegalStateException("GroupId was not initialized"); - controller.sendInvitation(groupId, contacts, message, - new UiResultExceptionHandler(this) { - @Override - public void onResultUi(Void result) { - setResult(RESULT_OK); - supportFinishAfterTransition(); - } - - @Override - public void onExceptionUi(DbException exception) { - setResult(RESULT_CANCELED); - handleDbException(exception); - } - }); - return true; - } - - @Override - public int getMaximumMessageLength() { - return MAX_GROUP_INVITATION_MSG_LENGTH; - } - -} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java index 30e80f829..6cc0c6e57 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupActivity.java @@ -9,16 +9,20 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; +import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler; import org.briarproject.briar.android.privategroup.conversation.GroupActivity; -import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener; import javax.annotation.Nullable; +import javax.inject.Inject; @MethodsNotNullByDefault @ParametersNotNullByDefault -public class CreateGroupActivity extends BaseGroupInviteActivity implements - CreateGroupListener, MessageFragmentListener { +public class CreateGroupActivity extends BriarActivity + implements CreateGroupListener { + + @Inject + CreateGroupController controller; @Override public void injectActivity(ActivityComponent component) { @@ -29,32 +33,20 @@ public class CreateGroupActivity extends BaseGroupInviteActivity implements public void onCreate(@Nullable Bundle bundle) { super.onCreate(bundle); + setContentView(R.layout.activity_fragment_container); + if (bundle == null) { showInitialFragment(new CreateGroupFragment()); } } - @Override - public void onBackPressed() { - if (getSupportFragmentManager().getBackStackEntryCount() == 1) { - // At this point, the group had been created already, - // so don't allow to create it again. - openNewGroup(); - overridePendingTransition(R.anim.screen_old_in, - R.anim.screen_new_out); - } else { - super.onBackPressed(); - } - } - @Override public void onGroupNameChosen(String name) { controller.createGroup(name, new UiResultExceptionHandler(this) { @Override public void onResultUi(GroupId g) { - groupId = g; - switchToContactSelectorFragment(g); + openNewGroup(g); } @Override @@ -64,16 +56,10 @@ public class CreateGroupActivity extends BaseGroupInviteActivity implements }); } - private void switchToContactSelectorFragment(GroupId g) { - showNextFragment(GroupInviteFragment.newInstance(g)); - } - - private void openNewGroup() { + private void openNewGroup(GroupId g) { Intent i = new Intent(this, GroupActivity.class); - i.putExtra(GROUP_ID, groupId.getBytes()); + i.putExtra(GROUP_ID, g.getBytes()); startActivity(i); - // finish this activity, so we can't come back to it finish(); } - } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupFragment.java index afede5594..aea42e265 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupFragment.java @@ -4,11 +4,15 @@ import android.content.Context; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.R; @@ -22,8 +26,9 @@ public class CreateGroupFragment extends BaseFragment { public final static String TAG = CreateGroupFragment.class.getName(); private CreateGroupListener listener; - private EditText name; - private Button button; + private EditText nameEntry; + private Button createGroupButton; + private TextView feedback; @Override public void onAttach(Context context) { @@ -35,32 +40,42 @@ public class CreateGroupFragment extends BaseFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // inflate view View v = inflater.inflate(R.layout.fragment_create_group, container, false); - name = (EditText) v.findViewById(R.id.name); - name.addTextChangedListener(new TextWatcher() { + nameEntry = (EditText) v.findViewById(R.id.name); + nameEntry.addTextChangedListener(new TextWatcher() { + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - validateName(); + public void onTextChanged(CharSequence s, int start, + int lengthBefore, int lengthAfter) { + enableOrDisableCreateButton(); } @Override public void afterTextChanged(Editable s) { } }); - button = (Button) v.findViewById(R.id.button); - button.setOnClickListener(new View.OnClickListener() { + nameEntry.setOnEditorActionListener(new OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, + KeyEvent e) { + createGroup(); + return true; + } + }); + + feedback = (TextView) v.findViewById(R.id.feedback); + + createGroupButton = (Button) v.findViewById(R.id.button); + createGroupButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - listener.hideSoftKeyboard(name); - listener.onGroupNameChosen(name.getText().toString()); + createGroup(); } }); @@ -70,7 +85,7 @@ public class CreateGroupFragment extends BaseFragment { @Override public void onStart() { super.onStart(); - listener.showSoftKeyboard(name); + listener.showSoftKeyboard(nameEntry); } @Override @@ -83,12 +98,25 @@ public class CreateGroupFragment extends BaseFragment { return TAG; } - private void validateName() { - String name = this.name.getText().toString(); - if (name.length() < 1 || StringUtils.utf8IsTooLong(name, MAX_GROUP_NAME_LENGTH)) - button.setEnabled(false); - else if (!button.isEnabled()) - button.setEnabled(true); + private void enableOrDisableCreateButton() { + if (createGroupButton == null) return; // Not created yet + createGroupButton.setEnabled(validateName()); } + private boolean validateName() { + String name = nameEntry.getText().toString(); + int length = StringUtils.toUtf8(name).length; + if (length > MAX_GROUP_NAME_LENGTH) { + feedback.setText(R.string.name_too_long); + return false; + } + feedback.setText(""); + return length > 0; + } + + private void createGroup() { + if (!validateName()) return; + listener.hideSoftKeyboard(nameEntry); + listener.onGroupNameChosen(nameEntry.getText().toString()); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupCreateModule.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupModule.java similarity index 91% rename from briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupCreateModule.java rename to briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupModule.java index fc51ac8e9..9399958fe 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupCreateModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupModule.java @@ -6,7 +6,7 @@ import dagger.Module; import dagger.Provides; @Module -public class GroupCreateModule { +public class CreateGroupModule { @ActivityScope @Provides diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java index 9f6a092f5..3da66f7cb 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/GroupInviteActivity.java @@ -3,25 +3,43 @@ package org.briarproject.briar.android.privategroup.creation; import android.content.Intent; import android.os.Bundle; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.briar.android.activity.ActivityComponent; +import org.briarproject.briar.android.contactselection.ContactSelectorActivity; +import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler; import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener; -public class GroupInviteActivity extends BaseGroupInviteActivity +import java.util.Collection; + +import javax.annotation.Nullable; +import javax.inject.Inject; + +import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH; + +@MethodsNotNullByDefault +@ParametersNotNullByDefault +public class GroupInviteActivity extends ContactSelectorActivity implements MessageFragmentListener { + @Inject + CreateGroupController controller; + @Override public void injectActivity(ActivityComponent component) { component.inject(this); } @Override - public void onCreate(Bundle bundle) { + public void onCreate(@Nullable Bundle bundle) { super.onCreate(bundle); Intent i = getIntent(); byte[] g = i.getByteArrayExtra(GROUP_ID); - if (g == null) throw new IllegalStateException("No GroupId in intent."); + if (g == null) throw new IllegalStateException("No GroupId in intent"); groupId = new GroupId(g); if (bundle == null) { @@ -29,4 +47,36 @@ public class GroupInviteActivity extends BaseGroupInviteActivity } } + @Override + public void contactsSelected(Collection contacts) { + super.contactsSelected(contacts); + + showNextFragment(new CreateGroupMessageFragment()); + } + + @Override + public boolean onButtonClick(String message) { + if (groupId == null) + throw new IllegalStateException("GroupId was not initialized"); + controller.sendInvitation(groupId, contacts, message, + new UiResultExceptionHandler(this) { + @Override + public void onResultUi(Void result) { + setResult(RESULT_OK); + supportFinishAfterTransition(); + } + + @Override + public void onExceptionUi(DbException exception) { + setResult(RESULT_CANCELED); + handleDbException(exception); + } + }); + return true; + } + + @Override + public int getMaximumMessageLength() { + return MAX_GROUP_INVITATION_MSG_LENGTH; + } } diff --git a/briar-android/src/main/res/layout/activity_create_forum.xml b/briar-android/src/main/res/layout/activity_create_forum.xml index 96afb47a9..da0a85875 100644 --- a/briar-android/src/main/res/layout/activity_create_forum.xml +++ b/briar-android/src/main/res/layout/activity_create_forum.xml @@ -1,37 +1,30 @@ - - + android:orientation="vertical" + android:layout_margin="@dimen/margin_large"> + android:inputType="text|textCapSentences" + android:hint="@string/choose_forum_hint" /> + android:gravity="center" />