Work on menu & few other things

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2017-11-27 14:31:17 +01:00
parent a669689be1
commit 1dde5029f4
22 changed files with 635 additions and 96 deletions

View File

@ -11,13 +11,13 @@ versioning {
version = versioning.name
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
compileSdkVersion 27
buildToolsVersion '27.0.0'
defaultConfig {
applicationId "com.nextcloud.talk"
versionName version
minSdkVersion 21
targetSdkVersion 26
targetSdkVersion 27
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// Enabling multidex support.
@ -52,7 +52,7 @@ android {
}
ext {
supportLibraryVersion = '26.1.0'
supportLibraryVersion = '27.0.0'
googleLibraryVersion = '11.6.0'
}
@ -141,6 +141,8 @@ dependencies {
implementation 'ru.alexbykov:nopermission:1.1.1'
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
implementation 'com.github.Kennyc1012:BottomSheet:2.4.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.0.1', {
exclude group: 'com.android.support', module: 'support-annotations'

View File

@ -764,5 +764,4 @@ public class CallActivity extends AppCompatActivity {
}
});
}
}

View File

@ -23,6 +23,7 @@ package com.nextcloud.talk.adapters.items;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
@ -32,10 +33,13 @@ import com.nextcloud.talk.R;
import com.nextcloud.talk.api.helpers.api.ApiHelper;
import com.nextcloud.talk.api.models.json.rooms.Room;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.events.MoreMenuClickEvent;
import com.nextcloud.talk.persistence.entities.UserEntity;
import com.nextcloud.talk.utils.ColorUtils;
import com.nextcloud.talk.utils.glide.GlideApp;
import org.greenrobot.eventbus.EventBus;
import java.util.List;
import butterknife.BindView;
@ -47,20 +51,20 @@ import eu.davidea.flexibleadapter.items.IFilterable;
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
import eu.davidea.viewholders.FlexibleViewHolder;
public class RoomItem extends AbstractFlexibleItem<RoomItem.RoomItemViewHolder> implements IFilterable {
public class CallItem extends AbstractFlexibleItem<CallItem.RoomItemViewHolder> implements IFilterable {
private Room room;
private UserEntity userEntity;
public RoomItem(Room room, UserEntity userEntity) {
public CallItem(Room room, UserEntity userEntity) {
this.room = room;
this.userEntity = userEntity;
}
@Override
public boolean equals(Object o) {
if (o instanceof RoomItem) {
RoomItem inItem = (RoomItem) o;
if (o instanceof CallItem) {
CallItem inItem = (CallItem) o;
return room.equals(inItem.getModel());
}
return false;
@ -148,6 +152,8 @@ public class RoomItem extends AbstractFlexibleItem<RoomItem.RoomItemViewHolder>
holder.avatarImageView.setVisibility(View.GONE);
}
holder.moreMenuButton.setOnClickListener(view -> EventBus.getDefault().post(new MoreMenuClickEvent(room)));
}
@Override
@ -165,6 +171,8 @@ public class RoomItem extends AbstractFlexibleItem<RoomItem.RoomItemViewHolder>
public TextView roomLastPing;
@BindView(R.id.avatar_image)
public AvatarImageView avatarImageView;
@BindView(R.id.more_menu)
public ImageButton moreMenuButton;
/**
* Default constructor.

View File

@ -0,0 +1,90 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.adapters.items;
import android.view.View;
import android.widget.TextView;
import com.nextcloud.talk.R;
import com.nextcloud.talk.events.MenuItemClickEvent;
import org.greenrobot.eventbus.EventBus;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
import eu.davidea.viewholders.FlexibleViewHolder;
public class MenuItem extends AbstractFlexibleItem<MenuItem.MenuItemViewHolder> {
private String title;
public MenuItem(String title) {
this.title = title;
}
@Override
public boolean equals(Object o) {
if (o instanceof MenuItem) {
MenuItem inItem = (MenuItem) o;
return title.equals(inItem.getModel());
}
return false;
}
private String getModel() {
return title;
}
@Override
public int getLayoutRes() {
return R.layout.rv_item_menu;
}
@Override
public MenuItem.MenuItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
return new MenuItemViewHolder(view, adapter);
}
@Override
public void bindViewHolder(FlexibleAdapter adapter, MenuItem.MenuItemViewHolder holder, int position, List payloads) {
holder.menuTitle.setText(title);
holder.menuTitle.setOnClickListener(view -> EventBus.getDefault().post(new MenuItemClickEvent(title)));
}
static class MenuItemViewHolder extends FlexibleViewHolder {
@BindView(R.id.menu_text)
public TextView menuTitle;
/**
* Default constructor.
*/
MenuItemViewHolder(View view, FlexibleAdapter adapter) {
super(view, adapter);
ButterKnife.bind(this, view);
}
}
}

View File

@ -28,7 +28,7 @@ import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.LazyHeaders;
import com.nextcloud.talk.R;
import com.nextcloud.talk.api.helpers.api.ApiHelper;
import com.nextcloud.talk.api.models.User;
import com.nextcloud.talk.api.models.json.participants.Participant;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.persistence.entities.UserEntity;
import com.nextcloud.talk.utils.ColorUtils;
@ -47,11 +47,11 @@ import eu.davidea.viewholders.FlexibleViewHolder;
public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder> implements IFilterable {
private User user;
private Participant participant;
private UserEntity userEntity;
public UserItem(User user, UserEntity userEntity) {
this.user = user;
public UserItem(Participant participant, UserEntity userEntity) {
this.participant = participant;
this.userEntity = userEntity;
}
@ -59,22 +59,22 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
public boolean equals(Object o) {
if (o instanceof UserItem) {
UserItem inItem = (UserItem) o;
return user.equals(inItem.getModel());
return participant.equals(inItem.getModel());
}
return false;
}
@Override
public int hashCode() {
return user.hashCode();
return participant.hashCode();
}
/**
* @return the model object
*/
public User getModel() {
return user;
public Participant getModel() {
return participant;
}
public UserEntity getEntity() {
@ -94,17 +94,17 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
@Override
public void bindViewHolder(FlexibleAdapter adapter, UserItemViewHolder holder, int position, List payloads) {
if (adapter.hasSearchText()) {
FlexibleUtils.highlightText(holder.contactDisplayName, user.getName(), adapter.getSearchText());
FlexibleUtils.highlightText(holder.contactDisplayName, participant.getName(), adapter.getSearchText());
} else {
holder.contactDisplayName.setText(user.getName());
holder.contactDisplayName.setText(participant.getName());
}
// Awful hack
holder.avatarImageView.setTextAndColorSeed(String.valueOf(user.getName().
holder.avatarImageView.setTextAndColorSeed(String.valueOf(participant.getName().
toUpperCase().charAt(0)), ColorUtils.colorSeed);
GlideUrl glideUrl = new GlideUrl(ApiHelper.getUrlForAvatarWithName(userEntity.getBaseUrl(),
user.getUserId()), new LazyHeaders.Builder()
participant.getUserId()), new LazyHeaders.Builder()
.setHeader("Accept", "image/*")
.setHeader("User-Agent", ApiHelper.getUserAgent())
.build());
@ -121,7 +121,7 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
@Override
public boolean filter(String constraint) {
return user.getName() != null && user.getName().toLowerCase().trim().contains(constraint.toLowerCase());
return participant.getName() != null && participant.getName().toLowerCase().trim().contains(constraint.toLowerCase());
}

View File

@ -1,40 +0,0 @@
/*
*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017 Mario Danic (mario@lovelyhq.com)
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.api.models;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import org.parceler.Parcel;
import lombok.Data;
@Parcel
@Data
@JsonObject
public class User {
@JsonField(name = "userId")
String userId;
@JsonField(name = "type")
int type;
@JsonField(name = "name")
String name;
}

View File

@ -0,0 +1,65 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.api.models.json.converters;
import com.bluelinelabs.logansquare.typeconverters.IntBasedTypeConverter;
import com.nextcloud.talk.api.models.json.participants.Participant;
public class EnumParticipantTypeConverter extends IntBasedTypeConverter<Participant.ParticipantType> {
@Override
public Participant.ParticipantType getFromInt(int i) {
switch (i) {
case 1:
return Participant.ParticipantType.OWNER;
case 2:
return Participant.ParticipantType.MODERATOR;
case 3:
return Participant.ParticipantType.USER;
case 4:
return Participant.ParticipantType.GUEST;
case 5:
return Participant.ParticipantType.USER_FOLLOWING_LINK;
default:
return Participant.ParticipantType.DUMMY;
}
}
@Override
public int convertToInt(Participant.ParticipantType object) {
switch (object) {
case DUMMY:
return 0;
case OWNER:
return 1;
case MODERATOR:
return 2;
case USER:
return 3;
case GUEST:
return 4;
case USER_FOLLOWING_LINK:
return 5;
default:
return 0;
}
}
}

View File

@ -34,6 +34,12 @@ public class Participant {
@JsonField(name = "userId")
String userId;
@JsonField(name = "type")
ParticipantType type;
@JsonField(name = "name")
String name;
@JsonField(name = "lastPing")
long lastPing;
@ -45,4 +51,13 @@ public class Participant {
@JsonField(name = "inCall")
boolean inCall;
public enum ParticipantType {
DUMMY,
OWNER,
MODERATOR,
USER,
GUEST,
USER_FOLLOWING_LINK
}
}

View File

@ -22,8 +22,9 @@ package com.nextcloud.talk.api.models.json.rooms;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.nextcloud.talk.api.models.User;
import com.nextcloud.talk.api.models.json.converters.EnumParticipantTypeConverter;
import com.nextcloud.talk.api.models.json.converters.EnumRoomTypeConverter;
import com.nextcloud.talk.api.models.json.participants.Participant;
import org.parceler.Parcel;
@ -52,9 +53,11 @@ public class Room {
@JsonField(name = "numGuests")
public long numberOfGuests;
@JsonField(name = "guestList")
public List<User> guestList;
public List<Participant> guestList;
@JsonField(name = "participants")
public List<User> participants;
public List<Participant> participants;
@JsonField(name = "participantType", typeConverter = EnumParticipantTypeConverter.class)
public Participant.ParticipantType participantType;
@JsonField(name = "hasPassword")
public boolean hasPassword;
@JsonField(name = "sessionId")
@ -66,4 +69,22 @@ public class Room {
ROOM_GROUP_CALL,
ROOM_PUBLIC_CALL
}
public boolean isPublic() {
return (RoomType.ROOM_PUBLIC_CALL.equals(type));
}
public boolean canModerate() {
return (Participant.ParticipantType.OWNER.equals(participantType)
|| Participant.ParticipantType.MODERATOR.equals(participantType));
}
public boolean isNameEditable() {
return (canModerate() && !RoomType.ROOM_TYPE_ONE_TO_ONE_CALL.equals(type));
}
public boolean isDeletable() {
return (canModerate() && ((participants != null && participants.size() > 2) || numberOfGuests > 0));
}
}

View File

@ -49,17 +49,23 @@ import com.bluelinelabs.conductor.RouterTransaction;
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
import com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler;
import com.kennyc.bottomsheet.BottomSheet;
import com.nextcloud.talk.R;
import com.nextcloud.talk.activities.CallActivity;
import com.nextcloud.talk.adapters.items.RoomItem;
import com.nextcloud.talk.adapters.items.CallItem;
import com.nextcloud.talk.api.NcApi;
import com.nextcloud.talk.api.helpers.api.ApiHelper;
import com.nextcloud.talk.api.models.json.rooms.Room;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.controllers.base.BaseController;
import com.nextcloud.talk.events.MoreMenuClickEvent;
import com.nextcloud.talk.persistence.entities.UserEntity;
import com.nextcloud.talk.utils.bundle.BundleBuilder;
import com.nextcloud.talk.utils.database.user.UserUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.parceler.Parcels;
import java.util.ArrayList;
@ -87,6 +93,9 @@ public class CallsListController extends BaseController implements SearchView.On
@Inject
UserUtils userUtils;
@Inject
EventBus eventBus;
@Inject
NcApi ncApi;
@BindView(R.id.recycler_view)
@ -97,9 +106,10 @@ public class CallsListController extends BaseController implements SearchView.On
private UserEntity userEntity;
private Disposable roomsQueryDisposable;
private FlexibleAdapter<RoomItem> adapter;
private List<RoomItem> roomItems = new ArrayList<>();
private FlexibleAdapter<CallItem> adapter;
private List<CallItem> callItems = new ArrayList<>();
private BottomSheet bottomSheet;
private MenuItem searchItem;
private SearchView searchView;
private String searchQuery;
@ -108,13 +118,13 @@ public class CallsListController extends BaseController implements SearchView.On
new FlexibleAdapter.OnItemClickListener() {
@Override
public boolean onItemClick(int position) {
if (roomItems.size() > position) {
if (callItems.size() > position) {
overridePushHandler(new NoOpControllerChangeHandler());
overridePopHandler(new NoOpControllerChangeHandler());
RoomItem roomItem = roomItems.get(position);
CallItem callItem = callItems.get(position);
Intent callIntent = new Intent(getActivity(), CallActivity.class);
BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
bundleBuilder.putString("roomToken", roomItem.getModel().getToken());
bundleBuilder.putString("roomToken", callItem.getModel().getToken());
bundleBuilder.putParcelable("userEntity", Parcels.wrap(userEntity));
callIntent.putExtras(bundleBuilder.build());
startActivity(callIntent);
@ -142,7 +152,7 @@ public class CallsListController extends BaseController implements SearchView.On
userEntity = userUtils.getCurrentUser();
if (adapter == null) {
adapter = new FlexibleAdapter<>(roomItems, getActivity(), false);
adapter = new FlexibleAdapter<>(callItems, getActivity(), false);
if (userEntity != null) {
fetchData();
}
@ -160,6 +170,17 @@ public class CallsListController extends BaseController implements SearchView.On
}
}
@Override
protected void onAttach(@NonNull View view) {
super.onAttach(view);
eventBus.register(this);
}
@Override
protected void onDetach(@NonNull View view) {
super.onDetach(view);
eventBus.unregister(this);
}
private void initSearchView() {
if (getActivity() != null) {
@ -198,7 +219,7 @@ public class CallsListController extends BaseController implements SearchView.On
} else {
handler.postDelayed(() -> {
bottomNavigationView.setVisibility(View.VISIBLE);
searchItem.setVisible(roomItems.size() > 0);
searchItem.setVisible(callItems.size() > 0);
}, 500);
}
@ -221,7 +242,7 @@ public class CallsListController extends BaseController implements SearchView.On
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
searchItem.setVisible(roomItems.size() > 0);
searchItem.setVisible(callItems.size() > 0);
if (adapter.hasSearchText()) {
searchItem.expandActionView();
searchView.setQuery(adapter.getSearchText(), false);
@ -231,7 +252,7 @@ public class CallsListController extends BaseController implements SearchView.On
private void fetchData() {
dispose(null);
roomItems = new ArrayList<>();
callItems = new ArrayList<>();
roomsQueryDisposable = ncApi.getRooms(ApiHelper.getCredentials(userEntity.getUsername(),
userEntity.getToken()), ApiHelper.getUrlForGetRooms(userEntity.getBaseUrl()))
@ -241,18 +262,21 @@ public class CallsListController extends BaseController implements SearchView.On
if (roomsOverall != null) {
for (int i = 0; i < roomsOverall.getOcs().getData().size(); i++) {
roomItems.add(new RoomItem(roomsOverall.getOcs().getData().get(i), userEntity));
callItems.add(new CallItem(roomsOverall.getOcs().getData().get(i), userEntity));
}
adapter.updateDataSet(roomItems, true);
adapter.updateDataSet(callItems, true);
Collections.sort(roomItems, (roomItem, t1) ->
Long.compare(t1.getModel().getLastPing(), roomItem.getModel().getLastPing()));
Collections.sort(callItems, (callItem, t1) ->
Long.compare(t1.getModel().getLastPing(), callItem.getModel().getLastPing()));
if (searchItem != null) {
searchItem.setVisible(roomItems.size() > 0);
searchItem.setVisible(callItems.size() > 0);
}
}
swipeRefreshLayout.setRefreshing(false);
}, throwable -> {
if (searchItem != null) {
searchItem.setVisible(false);
@ -275,6 +299,7 @@ public class CallsListController extends BaseController implements SearchView.On
break;
}
}
swipeRefreshLayout.setRefreshing(false);
dispose(roomsQueryDisposable);
}, () -> {
dispose(roomsQueryDisposable);
@ -358,4 +383,25 @@ public class CallsListController extends BaseController implements SearchView.On
return onQueryTextChange(query);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MoreMenuClickEvent moreMenuClickEvent) {
BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
Room room = moreMenuClickEvent.getRoom();
bundleBuilder.putParcelable("room", Parcels.wrap(room));
View view = getActivity().getLayoutInflater().inflate(R.layout.bottom_sheet, null, false);
getChildRouter((ViewGroup) view).setRoot(
RouterTransaction.with(new RoomMenuController(bundleBuilder.build()))
.popChangeHandler(new HorizontalChangeHandler())
.pushChangeHandler(new HorizontalChangeHandler()));
if (bottomSheet == null) {
bottomSheet = new BottomSheet.Builder(getActivity()).setView(view).create();
}
bottomSheet.show();
}
}

View File

@ -51,7 +51,7 @@ import com.nextcloud.talk.R;
import com.nextcloud.talk.adapters.items.UserItem;
import com.nextcloud.talk.api.NcApi;
import com.nextcloud.talk.api.helpers.api.ApiHelper;
import com.nextcloud.talk.api.models.User;
import com.nextcloud.talk.api.models.json.participants.Participant;
import com.nextcloud.talk.api.models.json.sharees.Sharee;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.controllers.base.BaseController;
@ -239,13 +239,13 @@ public class ContactsController extends BaseController implements SearchView.OnQ
getExactUsers().getExactSharees());
}
User user;
Participant participant;
for (Sharee sharee : shareeHashSet) {
if (!sharee.getValue().getShareWith().equals(userEntity.getUsername())) {
user = new User();
user.setName(sharee.getLabel());
user.setUserId(sharee.getValue().getShareWith());
contactItems.add(new UserItem(user, userEntity));
participant = new Participant();
participant.setName(sharee.getLabel());
participant.setUserId(sharee.getValue().getShareWith());
contactItems.add(new UserItem(participant, userEntity));
}
}
@ -255,6 +255,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
adapter.updateDataSet(contactItems, true);
searchItem.setVisible(contactItems.size() > 0);
swipeRefreshLayout.setRefreshing(false);
}
}, throwable -> {
@ -280,6 +281,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
}
}
swipeRefreshLayout.setRefreshing(false);
dispose(contactsQueryDisposable);
}
, () -> {

View File

@ -0,0 +1,121 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.controllers;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.nextcloud.talk.R;
import com.nextcloud.talk.adapters.items.MenuItem;
import com.nextcloud.talk.api.models.json.rooms.Room;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.controllers.base.BaseController;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.List;
import autodagger.AutoInjector;
import butterknife.BindView;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager;
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem;
@AutoInjector(NextcloudTalkApplication.class)
public class RoomMenuController extends BaseController {
private Room room;
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
private List<AbstractFlexibleItem> menuItems;
private FlexibleAdapter<AbstractFlexibleItem> adapter;
public RoomMenuController(Bundle args) {
super(args);
this.room = Parcels.unwrap(args.getParcelable("room"));
}
@Override
protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
return inflater.inflate(R.layout.controller_room_menu, container, false);
}
@Override
protected void onViewBound(@NonNull View view) {
super.onViewBound(view);
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
prepareViews();
}
private void prepareViews() {
LinearLayoutManager layoutManager = new SmoothScrollLinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
prepareMenu();
if (adapter == null) {
adapter = new FlexibleAdapter<>(menuItems, getActivity(), false);
}
recyclerView.setAdapter(adapter);
recyclerView.addItemDecoration(new DividerItemDecoration(
recyclerView.getContext(),
layoutManager.getOrientation()
));
}
private void prepareMenu() {
menuItems = new ArrayList<>();
menuItems.add(new MenuItem(getResources().getString(R.string.nc_leave)));
if (room.isNameEditable()) {
menuItems.add(new MenuItem(getResources().getString(R.string.nc_rename)));
}
if (!room.isPublic()) {
menuItems.add(new MenuItem(getResources().getString(R.string.nc_make_call_public)));
} else {
if (room.isHasPassword()) {
menuItems.add(new MenuItem(getResources().getString(R.string.nc_change_password)));
} else {
menuItems.add(new MenuItem(getResources().getString(R.string.nc_set_password)));
}
menuItems.add(new MenuItem(getResources().getString(R.string.nc_share_link)));
menuItems.add(new MenuItem(getResources().getString(R.string.nc_stop_sharing)));
}
if (room.isDeletable()) {
menuItems.add(new MenuItem(getResources().getString(R.string.nc_delete_call)));
}
}
}

View File

@ -31,7 +31,7 @@ import android.view.ViewGroup;
import com.nextcloud.talk.R;
import com.nextcloud.talk.adapters.items.UserItem;
import com.nextcloud.talk.api.models.User;
import com.nextcloud.talk.api.models.json.participants.Participant;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.controllers.base.BaseController;
import com.nextcloud.talk.persistence.entities.UserEntity;
@ -115,15 +115,15 @@ public class SwitchAccountController extends BaseController {
adapter = new FlexibleAdapter<>(userItems, getActivity(), false);
UserEntity userEntity;
User user;
Participant participant;
for (Object userEntityObject : userUtils.getUsers()) {
userEntity = (UserEntity) userEntityObject;
if (!userEntity.getCurrent()) {
user = new User();
user.setName(userEntity.getDisplayName());
user.setUserId(userEntity.getUsername());
userItems.add(new UserItem(user, userEntity));
participant = new Participant();
participant.setName(userEntity.getDisplayName());
participant.setUserId(userEntity.getUsername());
userItems.add(new UserItem(participant, userEntity));
}
}

View File

@ -0,0 +1,29 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.events;
public class MenuItemClickEvent {
private String menuTitle;
public MenuItemClickEvent(String menuTitle) {
this.menuTitle = menuTitle;
}
}

View File

@ -0,0 +1,34 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.events;
import com.nextcloud.talk.api.models.json.rooms.Room;
import lombok.Data;
@Data
public class MoreMenuClickEvent {
private final Room room;
public MoreMenuClickEvent(Room room) {
this.room = room;
}
}

View File

@ -0,0 +1,25 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
~
~ 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 <http://www.gnu.org/licenses/>.
-->
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
-->
<com.bluelinelabs.conductor.ChangeHandlerFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</com.bluelinelabs.conductor.ChangeHandlerFrameLayout>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/nc_white_color">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/rv_item_call"/>
</RelativeLayout>

View File

@ -32,7 +32,7 @@
android:layout_width="@dimen/avatar_size"
android:layout_height="@dimen/avatar_size"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/margin_between_elements"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:scaleType="centerInside"
app:aiv_CornerRadius="@dimen/avatar_corner_radius"
@ -40,11 +40,12 @@
app:aiv_TextSizeRatio="0.5"/>
<LinearLayout
android:layout_width="match_parent"
android:id="@+id/linear_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toEndOf="@id/avatar_image"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_toStartOf="@+id/more_menu"
android:orientation="vertical">
<TextView
@ -66,4 +67,14 @@
</LinearLayout>
<ImageButton
android:id="@+id/more_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:layout_marginStart="@dimen/margin_between_elements"
android:background="@drawable/ic_more_horiz_black_24dp"/>
</RelativeLayout>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017 Mario Danic <mario@lovelyhq.com>
~
~ 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 <http://www.gnu.org/licenses/>.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/menu_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/activity_horizontal_margin"/>
</RelativeLayout>

View File

@ -60,4 +60,16 @@
<string name="nc_license_summary">GNU General Public License, Version 3</string>
<string name="nc_select_an_account">Select an account</string>
<!-- Room menu -->
<string name="nc_what">What would you like to do?</string>
<string name="nc_leave">Leave call</string>
<string name="nc_rename">Rename call</string>
<string name="nc_set_password">Set the password</string>
<string name="nc_change_password">Change the password</string>
<string name="nc_share_link">Share link</string>
<string name="nc_make_call_public">Make call public</string>
<string name="nc_stop_sharing">Stop sharing the call</string>
<string name="nc_delete_call">Delete call</string>
</resources>

View File

@ -12,7 +12,7 @@ buildscript {
maven { url "http://dl.bintray.com/davideas/maven" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'eu.davidea:grabver:0.6.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
classpath 'com.google.gms:google-services:3.1.0'