diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/NewCallHeaderItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/NewCallHeaderItem.java new file mode 100644 index 000000000..4cffd6cf7 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/NewCallHeaderItem.java @@ -0,0 +1,101 @@ +/* + * Nextcloud Talk application + * + * @author Mario Danic + * Copyright (C) 2017-2018 Mario Danic + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.adapters.items; + +import android.view.View; +import android.widget.RelativeLayout; + +import com.nextcloud.talk.R; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import eu.davidea.flexibleadapter.FlexibleAdapter; +import eu.davidea.flexibleadapter.items.AbstractHeaderItem; +import eu.davidea.flexibleadapter.items.IHeader; +import eu.davidea.viewholders.FlexibleViewHolder; + +public class NewCallHeaderItem extends AbstractHeaderItem + implements IHeader { + private static final String TAG = "NewCallHeaderItem"; + + HeaderViewHolder headerViewHolder; + + public NewCallHeaderItem() { + super(); + setSelectable(true); + } + + @Override + public boolean equals(Object o) { + return false; + } + + @Override + public int getLayoutRes() { + return R.layout.rv_item_call_header; + } + + @Override + public HeaderViewHolder createViewHolder(View view, FlexibleAdapter adapter) { + headerViewHolder = new HeaderViewHolder(view, adapter); + return headerViewHolder; + } + + @Override + public void bindViewHolder(FlexibleAdapter adapter, HeaderViewHolder holder, int position, List payloads) { + headerViewHolder = holder; + + if (holder.secondaryRelativeLayout.getVisibility() == View.GONE && adapter.isSelected(position)) { + togglePublicCall(true); + } else if (holder.initialRelativeLayout.getVisibility() == View.GONE && !adapter.isSelected(position)) { + togglePublicCall(false); + } + } + + public void togglePublicCall(boolean showDescription) { + if (!showDescription) { + headerViewHolder.secondaryRelativeLayout.setVisibility(View.GONE); + headerViewHolder.initialRelativeLayout.setVisibility(View.VISIBLE); + } else { + headerViewHolder.initialRelativeLayout.setVisibility(View.GONE); + headerViewHolder.secondaryRelativeLayout.setVisibility(View.VISIBLE); + } + } + + static class HeaderViewHolder extends FlexibleViewHolder { + + @BindView(R.id.initial_relative_layout) + public RelativeLayout initialRelativeLayout; + + @BindView(R.id.secondary_relative_layout) + public RelativeLayout secondaryRelativeLayout; + + /** + * Default constructor. + */ + HeaderViewHolder(View view, FlexibleAdapter adapter) { + super(view, adapter, true); + ButterKnife.bind(this, view); + } + } +} diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java index 32713627f..57714c962 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java @@ -110,6 +110,10 @@ public class UserItem extends AbstractFlexibleItem flipView = holder.avatarFlipView; + if (adapter.isSelected(position) && !flipView.isFlipped()) { + flipItemSelection(); + } + if (adapter.hasSearchText()) { FlexibleUtils.highlightText(holder.contactDisplayName, participant.getName(), adapter.getSearchText()); } else { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java index 200d3bcb7..52aa56749 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java @@ -53,6 +53,7 @@ import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler; import com.nextcloud.talk.R; import com.nextcloud.talk.activities.CallActivity; import com.nextcloud.talk.adapters.items.EmptyFooterItem; +import com.nextcloud.talk.adapters.items.NewCallHeaderItem; import com.nextcloud.talk.adapters.items.UserHeaderItem; import com.nextcloud.talk.adapters.items.UserItem; import com.nextcloud.talk.api.NcApi; @@ -139,6 +140,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ private String searchQuery; private boolean isNewConversationView; + private boolean isPublicCall; private HashMap userHeaderItems = new HashMap(); @@ -163,8 +165,12 @@ public class ContactsController extends BaseController implements SearchView.OnQ @Override protected void onAttach(@NonNull View view) { super.onAttach(view); - if (getActionBar() != null && isNewConversationView) { - getActionBar().setDisplayHomeAsUpEnabled(true); + if (isNewConversationView) { + checkAndHandleBottomButtons(); + + if (getActionBar() != null) { + getActionBar().setDisplayHomeAsUpEnabled(true); + } } } @@ -212,10 +218,12 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (adapter != null) { List selectedPositions = adapter.getSelectedPositions(); for (Integer position : selectedPositions) { - UserItem userItem = (UserItem) adapter.getItem(position); - adapter.toggleSelection(position); - if (userItem != null) { - userItem.flipItemSelection(); + if (adapter.getItem(position) instanceof UserItem) { + UserItem userItem = (UserItem) adapter.getItem(position); + adapter.toggleSelection(position); + if (userItem != null) { + userItem.flipItemSelection(); + } } } } @@ -389,10 +397,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ return firstName.compareToIgnoreCase(secondName); }); + if (isNewConversationView) { + contactItems.add(0, new NewCallHeaderItem()); + } + adapter.updateDataSet(contactItems, true); searchItem.setVisible(contactItems.size() > 0); swipeRefreshLayout.setRefreshing(false); + if (isNewConversationView) { checkAndHandleBottomButtons(); } @@ -569,16 +582,27 @@ public class ContactsController extends BaseController implements SearchView.OnQ checkAndHandleBottomButtons(); } + } else if (adapter.getItem(position) instanceof NewCallHeaderItem) { + adapter.toggleSelection(position); + isPublicCall = adapter.isSelected(position); + ((NewCallHeaderItem)adapter.getItem(position)).togglePublicCall(isPublicCall); + checkAndHandleBottomButtons(); } return true; } private void checkAndHandleBottomButtons() { if (adapter != null && bottomButtonsLinearLayout != null && clearButton != null) { - if (adapter.getSelectedItemCount() > 0) { + if (adapter.getSelectedItemCount() > 0 || isPublicCall) { if (bottomButtonsLinearLayout.getVisibility() != View.VISIBLE) { bottomButtonsLinearLayout.setVisibility(View.VISIBLE); } + + if (isPublicCall && adapter.getSelectedItemCount() < 2) { + clearButton.setVisibility(View.GONE); + } else { + clearButton.setVisibility(View.VISIBLE); + } } else { bottomButtonsLinearLayout.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.java b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.java index 0b3a619b6..328a7b5e7 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.java +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.java @@ -37,4 +37,5 @@ public class BundleKeys { public static final String KEY_ROOM_TOKEN = "KEY_ROOM_TOKEN"; public static final String KEY_USER_ENTITY = "KEY_USER_ENTITY"; public static final String KEY_NEW_CONVERSATION = "KEY_NEW_CONVERSATION"; + public static final String KEY_IS_PUBLIC_CALL = "KEY_IS_PUBLIC_CALL"; } diff --git a/app/src/main/res/drawable/ic_group_black_24px.xml b/app/src/main/res/drawable/ic_group_black_24px.xml new file mode 100644 index 000000000..49c84ae88 --- /dev/null +++ b/app/src/main/res/drawable/ic_group_black_24px.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/layout/rv_item_call_header.xml b/app/src/main/res/layout/rv_item_call_header.xml new file mode 100644 index 000000000..1760a82a4 --- /dev/null +++ b/app/src/main/res/layout/rv_item_call_header.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 61e4842da..f2fb6f43b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,6 +102,9 @@ Incoming call Guest + NEW PUBLIC CALL + Public calls let you invite people from outside through a specially + crafted link. %1$s on %2$s notification channel