diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/UserHeaderItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java similarity index 88% rename from app/src/main/java/com/nextcloud/talk/adapters/items/UserHeaderItem.java rename to app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java index 2cd9ee419..a722efd76 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/UserHeaderItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java @@ -38,12 +38,12 @@ import eu.davidea.flexibleadapter.items.IFilterable; import eu.davidea.flexibleadapter.items.IFlexible; import eu.davidea.viewholders.FlexibleViewHolder; -public class UserHeaderItem extends AbstractHeaderItem implements IFilterable { - private static final String TAG = "UserHeaderItem"; +public class GenericTextHeaderItem extends AbstractHeaderItem implements IFilterable { + private static final String TAG = "GenericTextHeaderItem"; private String title; - public UserHeaderItem(String title) { + public GenericTextHeaderItem(String title) { super(); setHidden(false); setSelectable(false); @@ -61,8 +61,8 @@ public class UserHeaderItem extends AbstractHeaderItem implements - ISectionable, IFilterable { + ISectionable, IFilterable { private Participant participant; private UserEntity userEntity; - private UserHeaderItem header; + private GenericTextHeaderItem header; private FlipView flipView; - public UserItem(Participant participant, UserEntity userEntity, UserHeaderItem userHeaderItem) { + public UserItem(Participant participant, UserEntity userEntity, GenericTextHeaderItem genericTextHeaderItem) { this.participant = participant; this.userEntity = userEntity; - this.header = userHeaderItem; + this.header = genericTextHeaderItem; } @Override @@ -168,12 +168,12 @@ public class UserItem extends AbstractFlexibleItem } @Override - public UserHeaderItem getHeader() { + public GenericTextHeaderItem getHeader() { return header; } @Override - public void setHeader(UserHeaderItem header) { + public void setHeader(GenericTextHeaderItem header) { this.header = header; } diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index d0400baea..40d6c8a67 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -308,4 +308,8 @@ public interface NcApi { @GET Observable getNotification(@Header("Authorization") String authorization, @Url String url); + + @FormUrlEncoded + @POST + Observable setNotificationLevel(@Header("Authorization") String authorization, @Url String url, @Field("level") int level); } diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index 0ed02644e..067e55ef7 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java @@ -32,7 +32,6 @@ import com.nextcloud.talk.jobs.AccountRemovalWorker; import com.nextcloud.talk.jobs.CapabilitiesWorker; import com.nextcloud.talk.jobs.PushRegistrationWorker; import com.nextcloud.talk.jobs.SignalingSettingsJob; -import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.utils.ClosedInterfaceImpl; import com.nextcloud.talk.utils.DeviceUtils; import com.nextcloud.talk.utils.DisplayUtils; diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java index 4b68486df..2f5084ef9 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java @@ -365,7 +365,7 @@ public class AccountVerificationController extends BaseController { fetchAndStoreExternalSignalingSettings(); } } else if (eventStatus.getEventType().equals(EventStatus.EventType.SIGNALING_SETTINGS)) { - if (eventStatus.isAllGood()) { + if (internalAccountId == eventStatus.getUserId() && !eventStatus.isAllGood()) { if (getActivity() != null) { getActivity().runOnUiThread(() -> progressText.setText(progressText.getText().toString() + "\n" + getResources().getString(R.string.nc_external_server_failed))); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java index a43dcc0ae..9bba7914b 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -133,7 +133,6 @@ import butterknife.OnLongClick; import eu.davidea.flipview.FlipView; import io.reactivex.Observable; import io.reactivex.Observer; -import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java index baaae146c..479241d1a 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -49,6 +49,8 @@ import android.widget.RelativeLayout; import android.widget.TextView; import com.amulyakhare.textdrawable.TextDrawable; +import com.bluelinelabs.conductor.RouterTransaction; +import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; @@ -229,6 +231,7 @@ public class ChatController extends BaseController implements MessagesListAdapte @Override public void onNext(RoomOverall roomOverall) { + conversationName = roomOverall.getOcs().getData().getDisplayName(); setTitle(); @@ -966,6 +969,12 @@ public class ChatController extends BaseController implements MessagesListAdapte public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_conversation, menu); + + if (!conversationUser.hasSpreedCapabilityWithName("notification-levels")) { + menu.findItem(R.id.nc_conversation_info).setVisible(true); + } else { + menu.findItem(R.id.nc_conversation_info).setVisible(false); + } } @@ -981,7 +990,15 @@ public class ChatController extends BaseController implements MessagesListAdapte case R.id.conversation_voice_call: startACall(true); return true; - + case R.id.nc_conversation_info: + Bundle bundle = new Bundle(); + bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, Parcels.wrap(conversationUser)); + bundle.putString(BundleKeys.KEY_BASE_URL, baseUrl); + bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomToken); + /*getRouter().pushController((RouterTransaction.with(new ConversationInfoController(bundle)) + .pushChangeHandler(new VerticalChangeHandler()) + .popChangeHandler(new VerticalChangeHandler())));*/ + return true; default: return super.onOptionsItemSelected(item); } 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 9f434ac87..6cc996858 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java @@ -46,8 +46,8 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import com.kennyc.bottomsheet.BottomSheet; import com.nextcloud.talk.R; import com.nextcloud.talk.activities.MagicCallActivity; +import com.nextcloud.talk.adapters.items.GenericTextHeaderItem; import com.nextcloud.talk.adapters.items.ProgressItem; -import com.nextcloud.talk.adapters.items.UserHeaderItem; import com.nextcloud.talk.adapters.items.UserItem; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; @@ -154,7 +154,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ private boolean isNewConversationView; private boolean isPublicCall; - private HashMap userHeaderItems = new HashMap<>(); + private HashMap userHeaderItems = new HashMap<>(); private boolean alreadyFetching = false; private boolean canFetchFurther = true; @@ -473,6 +473,9 @@ public class ContactsController extends BaseController implements SearchView.OnQ shareTypesList.add("0"); // groups shareTypesList.add("1"); + // mails + //shareTypesList.add("4"); + modifiedQueryMap.put("shareTypes[]", shareTypesList); } @@ -520,10 +523,10 @@ public class ContactsController extends BaseController implements SearchView.OnQ headerTitle = sharee.getLabel().substring(0, 1).toUpperCase(); - UserHeaderItem userHeaderItem; + GenericTextHeaderItem genericTextHeaderItem; if (!userHeaderItems.containsKey(headerTitle)) { - userHeaderItem = new UserHeaderItem(headerTitle); - userHeaderItems.put(headerTitle, userHeaderItem); + genericTextHeaderItem = new GenericTextHeaderItem(headerTitle); + userHeaderItems.put(headerTitle, genericTextHeaderItem); } participant.setUserId(sharee.getValue().getShareWith()); @@ -554,10 +557,10 @@ public class ContactsController extends BaseController implements SearchView.OnQ headerTitle = participant.getName().substring(0, 1).toUpperCase(); - UserHeaderItem userHeaderItem; + GenericTextHeaderItem genericTextHeaderItem; if (!userHeaderItems.containsKey(headerTitle)) { - userHeaderItem = new UserHeaderItem(headerTitle); - userHeaderItems.put(headerTitle, userHeaderItem); + genericTextHeaderItem = new GenericTextHeaderItem(headerTitle); + userHeaderItems.put(headerTitle, genericTextHeaderItem); } participant.setUserId(participant.getUserId()); @@ -600,13 +603,13 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (o1 instanceof UserItem) { firstName = ((UserItem) o1).getModel().getName(); } else { - firstName = ((UserHeaderItem) o1).getModel(); + firstName = ((GenericTextHeaderItem) o1).getModel(); } if (o2 instanceof UserItem) { secondName = ((UserItem) o2).getModel().getName(); } else { - secondName = ((UserHeaderItem) o2).getModel(); + secondName = ((GenericTextHeaderItem) o2).getModel(); } return firstName.compareToIgnoreCase(secondName); @@ -695,8 +698,8 @@ public class ContactsController extends BaseController implements SearchView.OnQ IFlexible abstractFlexibleItem = adapter.getItem(position); if (abstractFlexibleItem instanceof UserItem) { return ((UserItem) adapter.getItem(position)).getHeader().getModel(); - } else if (abstractFlexibleItem instanceof UserHeaderItem) { - return ((UserHeaderItem) adapter.getItem(position)).getModel(); + } else if (abstractFlexibleItem instanceof GenericTextHeaderItem) { + return ((GenericTextHeaderItem) adapter.getItem(position)).getModel(); } else { return ""; } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java index 779d4aab4..c772fd759 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java @@ -26,7 +26,6 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java index d3a637813..64e185228 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java @@ -134,6 +134,8 @@ public class SignalingSettingsJob extends Worker { } catch (IOException e) { Log.e(TAG, "Failed to serialize external signaling server"); } + } else { + eventBus.post(new EventStatus(finalUserEntity.getId(), EventStatus.EventType.SIGNALING_SETTINGS, true)); } } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumNotificationLevelConverter.java b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumNotificationLevelConverter.java new file mode 100644 index 000000000..6f41f9bc9 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumNotificationLevelConverter.java @@ -0,0 +1,59 @@ +/* + * 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.models.json.converters; + +import com.bluelinelabs.logansquare.typeconverters.IntBasedTypeConverter; +import com.nextcloud.talk.models.json.rooms.Conversation; + +public class EnumNotificationLevelConverter extends IntBasedTypeConverter { + @Override + public Conversation.NotificationLevel getFromInt(int i) { + switch (i) { + case 0: + return Conversation.NotificationLevel.DEFAULT; + case 1: + return Conversation.NotificationLevel.ALWAYS; + case 2: + return Conversation.NotificationLevel.MENTION; + case 3: + return Conversation.NotificationLevel.NEVER; + default: + return Conversation.NotificationLevel.DEFAULT; + } + } + + @Override + public int convertToInt(Conversation.NotificationLevel object) { + switch (object) { + case DEFAULT: + return 0; + case ALWAYS: + return 1; + case MENTION: + return 2; + case NEVER: + return 3; + default: + return 0; + } + } + +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/rooms/Conversation.java b/app/src/main/java/com/nextcloud/talk/models/json/rooms/Conversation.java index 28ab6c276..2c88809f0 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/rooms/Conversation.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/rooms/Conversation.java @@ -23,6 +23,7 @@ package com.nextcloud.talk.models.json.rooms; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; import com.nextcloud.talk.models.json.chat.ChatMessage; +import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter; import com.nextcloud.talk.models.json.converters.EnumParticipantTypeConverter; import com.nextcloud.talk.models.json.converters.EnumRoomTypeConverter; import com.nextcloud.talk.models.json.participants.Participant; @@ -76,6 +77,15 @@ public class Conversation { public ChatMessage lastMessage; @JsonField(name = "objectType") String objectType; + @JsonField(name = "notificationLevel", typeConverter = EnumNotificationLevelConverter.class) + NotificationLevel notificationLevel; + + public enum NotificationLevel { + DEFAULT, + ALWAYS, + MENTION, + NEVER + } public boolean isPublic() { return (RoomType.ROOM_PUBLIC_CALL.equals(type)); diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java index cf3d802bd..044bfc4d0 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -66,11 +66,16 @@ public class ApiUtils { retrofitBucket.setUrl(baseUrl + ocsApiVersion + "/core/autocomplete/get"); retrofitBucket.getQueryMap().put("itemId", "new"); + retrofitBucket.getQueryMap().put("limit", "10000"); return retrofitBucket; } + public static String getUrlForSettingNotificationlevel(String baseUrl, String token) { + return getRoom(baseUrl, token) + "/notify"; + } + public static String getUrlForSettingMyselfAsActiveParticipant(String baseUrl, String token) { return getRoom(baseUrl, token) + "/participants/active"; } diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java index 14529ee5f..e7f124dd2 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java @@ -24,6 +24,7 @@ import android.text.TextUtils; import android.util.Log; import com.bluelinelabs.logansquare.LoganSquare; +import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.events.WebSocketCommunicationEvent; import com.nextcloud.talk.models.database.UserEntity; @@ -37,8 +38,6 @@ import com.nextcloud.talk.models.json.websocket.HelloResponseOverallWebSocketMes import com.nextcloud.talk.models.json.websocket.JoinedRoomOverallWebSocketMessage; import com.nextcloud.talk.utils.MagicMap; -import com.nextcloud.talk.R; - import org.greenrobot.eventbus.EventBus; import java.io.IOException; diff --git a/app/src/main/res/drawable/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_black_24dp.xml new file mode 100644 index 000000000..feb198567 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_black_24dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/layout/notification_settings_item.xml b/app/src/main/res/layout/notification_settings_item.xml new file mode 100644 index 000000000..7966b9b8e --- /dev/null +++ b/app/src/main/res/layout/notification_settings_item.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_conversation.xml b/app/src/main/res/menu/menu_conversation.xml index 25e4ee8d4..8117685bd 100644 --- a/app/src/main/res/menu/menu_conversation.xml +++ b/app/src/main/res/menu/menu_conversation.xml @@ -32,5 +32,12 @@ android:id="@+id/conversation_video_call" android:icon="@drawable/ic_videocam_white_24px" android:title="@string/nc_conversation_menu_video_call" - app:showAsAction="always"/> + app:showAsAction="ifRoom"/> + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index d5abe5d16..ebb463d31 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -26,4 +26,10 @@ DIRECT SOCKS + + + @string/nc_notify_me_never + @string/nc_notify_me_mention + @string/nc_notify_me_always + \ 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 bacbbcb24..80191bd32 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,12 @@ Messages notification channel Shows incoming calls Shows incoming messages + Notification settings + Messages + Always + When mentioned + Never + Mute calls Sorry, something went wrong! @@ -208,6 +214,7 @@ Find Nextcloud on https://nextcloud.com Today Voice call Video call + Conversation info New messages No messages yet You