Skip to content

Commit

Permalink
Add 'Add to a group' button to bottom sheet.
Browse files Browse the repository at this point in the history
  • Loading branch information
alan-signal committed Jun 9, 2020
1 parent 7e934ef commit e1bb773
Show file tree
Hide file tree
Showing 17 changed files with 505 additions and 37 deletions.
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,9 @@
<activity android:name=".groups.ui.creategroup.CreateGroupActivity"
android:theme="@style/TextSecure.LightNoActionBar" />

<activity android:name=".groups.ui.addtogroup.AddToGroupsActivity"
android:theme="@style/TextSecure.LightNoActionBar" />

<activity android:name=".groups.ui.addmembers.AddMembersActivity"
android:theme="@style/TextSecure.LightNoActionBar" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ private Set<RecipientId> getCurrentSelection() {
: Collections.unmodifiableSet(Stream.of(currentSelection).collect(Collectors.toSet()));
}

private boolean isMulti() {
public boolean isMulti() {
return requireActivity().getIntent().getBooleanExtra(MULTI_SELECT, false);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.fragment.app.FragmentActivity;

import com.bumptech.glide.load.engine.DiskCacheStrategy;

Expand All @@ -24,6 +25,7 @@
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment;
import org.thoughtcrime.securesms.util.AvatarUtil;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.ThemeUtil;
Expand Down Expand Up @@ -162,11 +164,17 @@ public void setAvatar(@NonNull GlideRequests requestManager, @Nullable Recipient
private void setAvatarClickHandler(@NonNull final Recipient recipient, boolean quickContactEnabled) {
if (quickContactEnabled) {
super.setOnClickListener(v -> {
Context context = getContext();
if (FeatureFlags.newGroupUI() && recipient.isPushGroup()) {
getContext().startActivity(ManageGroupActivity.newIntent(getContext(), recipient.requireGroupId().requirePush()),
ManageGroupActivity.createTransitionBundle(getContext(), this));
context.startActivity(ManageGroupActivity.newIntent(context, recipient.requireGroupId().requirePush()),
ManageGroupActivity.createTransitionBundle(context, this));
} else {
getContext().startActivity(RecipientPreferenceActivity.getLaunchIntent(getContext(), recipient.getId()));
if (context instanceof FragmentActivity) {
RecipientBottomSheetDialogFragment.create(recipient.getId(), null)
.show(((FragmentActivity) context).getSupportFragmentManager(), "BOTTOM");
} else {
context.startActivity(RecipientPreferenceActivity.getLaunchIntent(context, recipient.getId()));
}
}
});
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Rect;

import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.widget.TextViewCompat;

import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
Expand All @@ -18,20 +13,23 @@
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.core.widget.TextViewCompat;

import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.DarkOverflowToolbar;

public class ContactFilterToolbar extends DarkOverflowToolbar {
public final class ContactFilterToolbar extends DarkOverflowToolbar {
private OnFilterChangedListener listener;

private EditText searchText;
private AnimatingToggle toggle;
private ImageView keyboardToggle;
private ImageView dialpadToggle;
private ImageView clearToggle;
private LinearLayout toggleContainer;
private final EditText searchText;
private final AnimatingToggle toggle;
private final ImageView keyboardToggle;
private final ImageView dialpadToggle;
private final ImageView clearToggle;
private final LinearLayout toggleContainer;

public ContactFilterToolbar(Context context) {
this(context, null);
Expand All @@ -45,12 +43,12 @@ public ContactFilterToolbar(Context context, AttributeSet attrs, int defStyleAtt
super(context, attrs, defStyleAttr);
inflate(context, R.layout.contact_filter_toolbar, this);

this.searchText = ViewUtil.findById(this, R.id.search_view);
this.toggle = ViewUtil.findById(this, R.id.button_toggle);
this.keyboardToggle = ViewUtil.findById(this, R.id.search_keyboard);
this.dialpadToggle = ViewUtil.findById(this, R.id.search_dialpad);
this.clearToggle = ViewUtil.findById(this, R.id.search_clear);
this.toggleContainer = ViewUtil.findById(this, R.id.toggle_container);
this.searchText = findViewById(R.id.search_view);
this.toggle = findViewById(R.id.button_toggle);
this.keyboardToggle = findViewById(R.id.search_keyboard);
this.dialpadToggle = findViewById(R.id.search_dialpad);
this.clearToggle = findViewById(R.id.search_clear);
this.toggleContainer = findViewById(R.id.toggle_container);

this.keyboardToggle.setOnClickListener(new View.OnClickListener() {
@Override
Expand Down Expand Up @@ -103,11 +101,11 @@ public void afterTextChanged(Editable s) {
setLogo(null);
setContentInsetStartWithNavigation(0);
expandTapArea(toggleContainer, dialpadToggle);
styleSearchText(searchText, context, attrs, defStyleAttr);
applyAttributes(searchText, context, attrs, defStyleAttr);
searchText.requestFocus();
}

private void styleSearchText(@NonNull EditText searchText,
private void applyAttributes(@NonNull EditText searchText,
@NonNull Context context,
@NonNull AttributeSet attrs,
int defStyle)
Expand All @@ -121,6 +119,9 @@ private void styleSearchText(@NonNull EditText searchText,
if (styleResource != -1) {
TextViewCompat.setTextAppearance(searchText, styleResource);
}
if (!attributes.getBoolean(R.styleable.ContactFilterToolbar_showDialpad, true)) {
dialpadToggle.setVisibility(GONE);
}
attributes.recycle();
}

Expand All @@ -133,6 +134,10 @@ public void setOnFilterChangedListener(OnFilterChangedListener listener) {
this.listener = listener;
}

public void setHint(@StringRes int hint) {
searchText.setHint(hint);
}

private void notifyListener() {
if (listener != null) listener.onFilterChanged(searchText.getText().toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public ViewHolder(View itemView) {
super(itemView);
}

public abstract void bind(@NonNull GlideRequests glideRequests, @Nullable RecipientId recipientId, int type, String name, String number, String label, int color, boolean multiSelect);
public abstract void bind(@NonNull GlideRequests glideRequests, @Nullable RecipientId recipientId, int type, String name, String number, String label, int color, boolean checkboxVisible);
public abstract void unbind(@NonNull GlideRequests glideRequests);
public abstract void setChecked(boolean checked);
public abstract void setEnabled(boolean enabled);
Expand All @@ -121,8 +121,8 @@ public ContactSelectionListItem getView() {
return (ContactSelectionListItem) itemView;
}

public void bind(@NonNull GlideRequests glideRequests, @Nullable RecipientId recipientId, int type, String name, String number, String label, int color, boolean multiSelect) {
getView().set(glideRequests, recipientId, type, name, number, label, color, multiSelect);
public void bind(@NonNull GlideRequests glideRequests, @Nullable RecipientId recipientId, int type, String name, String number, String label, int color, boolean checkBoxVisible) {
getView().set(glideRequests, recipientId, type, name, number, label, color, checkBoxVisible);
}

@Override
Expand Down Expand Up @@ -151,7 +151,7 @@ public static class DividerViewHolder extends ViewHolder {
}

@Override
public void bind(@NonNull GlideRequests glideRequests, @Nullable RecipientId recipientId, int type, String name, String number, String label, int color, boolean multiSelect) {
public void bind(@NonNull GlideRequests glideRequests, @Nullable RecipientId recipientId, int type, String name, String number, String label, int color, boolean checkboxVisible) {
this.label.setText(name);
}

Expand Down Expand Up @@ -222,11 +222,13 @@ public void onBindItemViewHolder(ViewHolder viewHolder, @NonNull Cursor cursor)
int color = (contactType == ContactRepository.PUSH_TYPE) ? drawables.getColor(0, 0xa0000000) :
drawables.getColor(1, 0xff000000);

boolean currentContact = currentContacts.contains(id);

viewHolder.unbind(glideRequests);
viewHolder.bind(glideRequests, id, contactType, name, number, labelText, color, multiSelect);
viewHolder.bind(glideRequests, id, contactType, name, number, labelText, color, multiSelect || currentContact);
viewHolder.setEnabled(true);

if (currentContacts.contains(id)) {
if (currentContact) {
viewHolder.setChecked(true);
viewHolder.setEnabled(false);
} else if (numberType == ContactRepository.NEW_USERNAME_TYPE) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public void set(@NonNull GlideRequests glideRequests,
String number,
String label,
int color,
boolean multiSelect)
boolean checkboxVisible)
{
this.glideRequests = glideRequests;
this.number = number;
Expand All @@ -90,8 +90,7 @@ public void set(@NonNull GlideRequests glideRequests,

setText(recipientSnapshot, type, name, number, label);

if (multiSelect) this.checkBox.setVisibility(View.VISIBLE);
else this.checkBox.setVisibility(View.GONE);
this.checkBox.setVisibility(checkboxVisible ? View.VISIBLE : View.GONE);
}

public void setChecked(boolean selected) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,12 @@ public Cursor loadInBackground() {
private List<Cursor> getUnfilteredResults() {
ArrayList<Cursor> cursorList = new ArrayList<>();

addRecentsSection(cursorList);
addContactsSection(cursorList);
if (groupsOnly(mode)) {
addGroupsSection(cursorList);
} else {
addRecentsSection(cursorList);
addContactsSection(cursorList);
}

return cursorList;
}
Expand Down Expand Up @@ -376,6 +380,10 @@ private static boolean groupsEnabled(int mode) {
return flagSet(mode, DisplayMode.FLAG_ACTIVE_GROUPS);
}

private static boolean groupsOnly(int mode) {
return mode == DisplayMode.FLAG_ACTIVE_GROUPS;
}

private static boolean flagSet(int mode, int flag) {
return (mode & flag) > 0;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.thoughtcrime.securesms.groups.ui.addtogroup;

import android.content.Context;

import androidx.annotation.NonNull;

import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupChangeBusyException;
import org.thoughtcrime.securesms.groups.GroupChangeFailedException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupInsufficientRightsException;
import org.thoughtcrime.securesms.groups.GroupManager;
import org.thoughtcrime.securesms.groups.GroupNotAMemberException;
import org.thoughtcrime.securesms.groups.MembershipNotSuitableForV2Exception;
import org.thoughtcrime.securesms.groups.ui.GroupChangeErrorCallback;
import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;

import java.io.IOException;
import java.util.Collections;

final class AddToGroupRepository {

private static final String TAG = Log.tag(AddToGroupRepository.class);

private final Context context;

AddToGroupRepository() {
this.context = ApplicationDependencies.getApplication();
}

public void add(@NonNull RecipientId recipientId,
@NonNull Recipient groupRecipient,
@NonNull GroupChangeErrorCallback error,
@NonNull Runnable success)
{
SignalExecutors.UNBOUNDED.execute(() -> {
try {
GroupId.Push pushGroupId = groupRecipient.requireGroupId().requirePush();

GroupManager.addMembers(context, pushGroupId, Collections.singletonList(recipientId));

success.run();
} catch (GroupInsufficientRightsException | GroupNotAMemberException e) {
Log.w(TAG, e);
error.onError(GroupChangeFailureReason.NO_RIGHTS);
} catch (GroupChangeFailedException | GroupChangeBusyException | IOException e) {
Log.w(TAG, e);
error.onError(GroupChangeFailureReason.OTHER);
} catch (MembershipNotSuitableForV2Exception e) {
Log.w(TAG, e);
error.onError(GroupChangeFailureReason.NOT_CAPABLE);
}
});
}
}

0 comments on commit e1bb773

Please sign in to comment.