From 183c7afd5d3c06dc8aee66b2808b175ba90311dd Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 27 Feb 2019 12:56:45 +0100 Subject: [PATCH 1/5] Implement leave & delete in conversation info Signed-off-by: Mario Danic --- app/build.gradle | 2 +- .../talk/adapters/items/AdvancedUserItem.java | 2 +- .../application/NextcloudTalkApplication.java | 4 +- .../AccountVerificationController.java | 4 +- .../talk/controllers/ChatController.java | 2 +- .../ConversationInfoController.java | 65 ++++++++++ .../ConversationsListController.java | 23 +++- .../bottomsheet/CallMenuController.java | 8 +- .../bottomsheet/OperationsMenuController.java | 6 +- .../nextcloud/talk/events/EventStatus.java | 2 +- .../talk/jobs/DeleteConversationWorker.java | 115 ++++++++++++++++++ .../talk/jobs/LeaveConversationWorker.java | 115 ++++++++++++++++++ ...sJob.java => SignalingSettingsWorker.java} | 4 +- .../com/nextcloud/talk/utils/ApiUtils.java | 2 + ...y600_24dp.xml => ic_delete_black_24dp.xml} | 2 +- ...24dp.xml => ic_exit_to_app_black_24dp.xml} | 2 +- .../main/res/drawable/ic_star_black_24dp.xml | 25 ++++ .../drawable/ic_star_border_black_24dp.xml | 25 ++++ .../res/drawable/shape_favorite_bubble.xml | 2 +- .../layout/controller_conversation_info.xml | 46 ++++++- 20 files changed, 434 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/jobs/DeleteConversationWorker.java create mode 100644 app/src/main/java/com/nextcloud/talk/jobs/LeaveConversationWorker.java rename app/src/main/java/com/nextcloud/talk/jobs/{SignalingSettingsJob.java => SignalingSettingsWorker.java} (97%) rename app/src/main/res/drawable/{ic_star_grey600_24dp.xml => ic_delete_black_24dp.xml} (86%) rename app/src/main/res/drawable/{ic_star_border_grey600_24dp.xml => ic_exit_to_app_black_24dp.xml} (79%) create mode 100644 app/src/main/res/drawable/ic_star_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_star_border_black_24dp.xml diff --git a/app/build.gradle b/app/build.gradle index 2348c7195..e4ce9062d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,7 +17,7 @@ android { targetSdkVersion 28 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - versionCode 85 + versionCode 155 versionName "3.2.6" flavorDimensions "default" diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java index 848a3602f..c80514c7b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java @@ -114,7 +114,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem showConversationInfoScreen()); } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java index 7c7da2e17..769333873 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java @@ -23,6 +23,7 @@ package com.nextcloud.talk.controllers; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -30,8 +31,15 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import androidx.room.Delete; +import androidx.work.Data; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; import autodagger.AutoInjector; import butterknife.BindView; +import butterknife.OnClick; +import com.bluelinelabs.conductor.RouterTransaction; +import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; @@ -40,6 +48,9 @@ import com.nextcloud.talk.adapters.items.UserItem; import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; +import com.nextcloud.talk.jobs.DeleteConversationWorker; +import com.nextcloud.talk.jobs.LeaveConversationWorker; +import com.nextcloud.talk.jobs.PushRegistrationWorker; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter; import com.nextcloud.talk.models.json.participants.Participant; @@ -54,6 +65,7 @@ import com.vanniktech.emoji.EmojiTextView; import com.yarolegovich.mp.MaterialChoicePreference; import com.yarolegovich.mp.MaterialPreferenceCategory; import com.yarolegovich.mp.MaterialPreferenceScreen; +import com.yarolegovich.mp.MaterialStandardPreference; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; @@ -87,6 +99,11 @@ public class ConversationInfoController extends BaseController { MaterialPreferenceCategory participantsListCategory; @BindView(R.id.recycler_view) RecyclerView recyclerView; + @BindView(R.id.deleteConversationAction) + MaterialStandardPreference deleteConversationAction; + @BindView(R.id.ownOptions) + MaterialPreferenceCategory ownOptionsCategory; + @Inject NcApi ncApi; private String baseUrl; @@ -228,6 +245,46 @@ public class ConversationInfoController extends BaseController { } + @OnClick(R.id.leaveConversationAction) + void leaveConversation() { + Data data; + if ((data = getWorkerData()) != null) { + OneTimeWorkRequest leaveConversationWorker = + new OneTimeWorkRequest.Builder(LeaveConversationWorker.class).setInputData(data).build(); + WorkManager.getInstance().enqueue(leaveConversationWorker); + popTwoLastControllers(); + } + } + + @OnClick(R.id.deleteConversationAction) + void deleteConversation() { + Data data; + if ((data = getWorkerData()) != null) { + OneTimeWorkRequest deleteConversationWorker = + new OneTimeWorkRequest.Builder(DeleteConversationWorker.class).setInputData(data).build(); + WorkManager.getInstance().enqueue(deleteConversationWorker); + popTwoLastControllers(); + } + } + + private Data getWorkerData() { + if (!TextUtils.isEmpty(conversationToken) && conversationUser != null) { + Data.Builder data = new Data.Builder(); + data.putString(BundleKeys.KEY_ROOM_TOKEN, conversationToken); + data.putLong(BundleKeys.KEY_INTERNAL_USER_ID, conversationUser.getId()); + return data.build(); + } + + return null; + } + + private void popTwoLastControllers() { + List backstack = getRouter().getBackstack(); + backstack.remove(backstack.size() - 2); + getRouter().setBackstack(backstack, new HorizontalChangeHandler()); + getRouter().popCurrentController(); + } + private void fetchRoomInfo() { ncApi.getRoom(credentials, ApiUtils.getRoom(conversationUser.getBaseUrl(), conversationToken)) .subscribeOn(Schedulers.newThread()) @@ -241,6 +298,14 @@ public class ConversationInfoController extends BaseController { @Override public void onNext(RoomOverall roomOverall) { conversation = roomOverall.getOcs().getData(); + + ownOptionsCategory.setVisibility(View.VISIBLE); + if (!conversation.isDeletable()) { + deleteConversationAction.setVisibility(View.GONE); + } else { + deleteConversationAction.setVisibility(View.VISIBLE); + } + getListOfParticipants(); if (progressBar != null) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 088e91579..68cdeb418 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -66,6 +66,7 @@ import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.controllers.bottomsheet.CallMenuController; import com.nextcloud.talk.controllers.bottomsheet.EntryMenuController; import com.nextcloud.talk.events.BottomSheetLockEvent; +import com.nextcloud.talk.events.EventStatus; import com.nextcloud.talk.events.MoreMenuClickEvent; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.participants.Participant; @@ -153,6 +154,8 @@ public class ConversationsListController extends BaseController implements Searc private boolean adapterWasNull = true; + private boolean isRefreshing; + private String lastClickedConversationToken; private int scrollTo = 0; @@ -292,6 +295,8 @@ public class ConversationsListController extends BaseController implements Searc private void fetchData(boolean fromBottomSheet) { dispose(null); + isRefreshing = true; + callItems = new ArrayList<>(); roomsQueryDisposable = ncApi.getRooms(credentials, ApiUtils.getUrlForGetRooms(currentUser.getBaseUrl())) @@ -412,6 +417,7 @@ public class ConversationsListController extends BaseController implements Searc }, 2500); } + isRefreshing = false; }); } @@ -668,4 +674,19 @@ public class ConversationsListController extends BaseController implements Searc } } } -} + + @Subscribe(sticky = true, threadMode = ThreadMode.BACKGROUND) + public void onMessageEvent(EventStatus eventStatus) { + if (currentUser != null && eventStatus.getUserId() == currentUser.getId()){ + switch (eventStatus.getEventType()) { + case CONVERSATION_UPDATE: + if (eventStatus.isAllGood() && !isRefreshing) { + fetchData(false); + } + break; + default: + break; + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java index a62477be9..dd10340ab 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java @@ -43,6 +43,7 @@ import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.events.BottomSheetLockEvent; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.rooms.Conversation; +import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.ShareUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; @@ -130,12 +131,11 @@ public class CallMenuController extends BaseController implements FlexibleAdapte UserEntity currentUser; if (conversation.isFavorite()) { - menuItems.add(new MenuItem(getResources().getString(R.string.nc_remove_from_favorites), 97, getResources() - .getDrawable(R.drawable.ic_star_border_grey600_24dp))); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_remove_from_favorites), 97, DisplayUtils.getTintedDrawable(getResources(), R.drawable.ic_star_border_black_24dp, R.color.grey_600))); } else if ((currentUser = userUtils.getCurrentUser()) != null && currentUser.hasSpreedCapabilityWithName("favorites")) { - menuItems.add(new MenuItem(getResources().getString(R.string.nc_add_to_favorites), 98, getResources() - .getDrawable(R.drawable.ic_star_grey600_24dp))); + menuItems.add(new MenuItem(getResources().getString(R.string.nc_add_to_favorites) + , 98, DisplayUtils.getTintedDrawable(getResources(), R.drawable.ic_star_black_24dp, R.color.grey_600))); } if (conversation.isNameEditable()) { 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 8077f0584..b0efb053a 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 @@ -185,8 +185,7 @@ public class OperationsMenuController extends BaseController { switch (operationCode) { case 1: - ncApi.removeSelfFromRoom(credentials, ApiUtils.getUrlForRemoveSelfFromRoom(currentUser.getBaseUrl - (), conversation.getToken())) + ncApi.leaveRoom(credentials, ApiUtils.getUrlForSettingMyselfAsActiveParticipant(currentUser.getBaseUrl(), conversation.getToken())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .retry(1) @@ -234,7 +233,8 @@ public class OperationsMenuController extends BaseController { .subscribe(operationsObserver); break; case 9: - ncApi.deleteRoom(credentials, ApiUtils.getUrlForSettingMyselfAsActiveParticipant(currentUser.getBaseUrl(), conversation.getToken())) + ncApi.deleteRoom(credentials, ApiUtils.getRoom(currentUser.getBaseUrl(), + conversation.getToken())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .retry(1) diff --git a/app/src/main/java/com/nextcloud/talk/events/EventStatus.java b/app/src/main/java/com/nextcloud/talk/events/EventStatus.java index b125c61bf..c84ba1b54 100644 --- a/app/src/main/java/com/nextcloud/talk/events/EventStatus.java +++ b/app/src/main/java/com/nextcloud/talk/events/EventStatus.java @@ -35,7 +35,7 @@ public class EventStatus { } public enum EventType { - PUSH_REGISTRATION, CAPABILITIES_FETCH, SIGNALING_SETTINGS + PUSH_REGISTRATION, CAPABILITIES_FETCH, SIGNALING_SETTINGS, CONVERSATION_UPDATE } } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/DeleteConversationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/DeleteConversationWorker.java new file mode 100644 index 000000000..27821ce45 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/jobs/DeleteConversationWorker.java @@ -0,0 +1,115 @@ +/* + * 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.jobs; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.work.Data; +import androidx.work.Worker; +import androidx.work.WorkerParameters; +import autodagger.AutoInjector; +import com.nextcloud.talk.api.NcApi; +import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.events.EventStatus; +import com.nextcloud.talk.models.database.UserEntity; +import com.nextcloud.talk.models.json.generic.GenericOverall; +import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.bundle.BundleKeys; +import com.nextcloud.talk.utils.database.user.UserUtils; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.JavaNetCookieJar; +import okhttp3.OkHttpClient; +import org.greenrobot.eventbus.EventBus; +import retrofit2.Retrofit; + +import javax.inject.Inject; +import java.net.CookieManager; + +@AutoInjector(NextcloudTalkApplication.class) +public class DeleteConversationWorker extends Worker { + @Inject + Retrofit retrofit; + + @Inject + OkHttpClient okHttpClient; + + @Inject + UserUtils userUtils; + + @Inject + EventBus eventBus; + + NcApi ncApi; + + public DeleteConversationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); + } + + @NonNull + @Override + public Result doWork() { + Data data = getInputData(); + long operationUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1); + String conversationToken = data.getString(BundleKeys.KEY_ROOM_TOKEN); + UserEntity operationUser = userUtils.getUserWithId(operationUserId); + + if (operationUser != null) { + String credentials = ApiUtils.getCredentials(operationUser.getUsername(), operationUser.getToken()); + ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new + JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class); + + EventStatus eventStatus = new EventStatus(operationUser.getId(), + EventStatus.EventType.CONVERSATION_UPDATE, true); + + ncApi.deleteRoom(credentials, ApiUtils.getRoom(operationUser.getBaseUrl(), conversationToken)) + .subscribeOn(Schedulers.newThread()) + .blockingSubscribe(new Observer() { + Disposable disposable; + @Override + public void onSubscribe(Disposable d) { + disposable = d; + + } + + @Override + public void onNext(GenericOverall genericOverall) { + eventBus.postSticky(eventStatus); + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + disposable.dispose(); + } + }); + } + + return Result.success(); + } +} diff --git a/app/src/main/java/com/nextcloud/talk/jobs/LeaveConversationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/LeaveConversationWorker.java new file mode 100644 index 000000000..a9c19fd9e --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/jobs/LeaveConversationWorker.java @@ -0,0 +1,115 @@ +/* + * 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.jobs; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.work.Data; +import androidx.work.Worker; +import androidx.work.WorkerParameters; +import autodagger.AutoInjector; +import com.nextcloud.talk.api.NcApi; +import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.events.EventStatus; +import com.nextcloud.talk.models.database.UserEntity; +import com.nextcloud.talk.models.json.generic.GenericOverall; +import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.bundle.BundleKeys; +import com.nextcloud.talk.utils.database.user.UserUtils; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.JavaNetCookieJar; +import okhttp3.OkHttpClient; +import org.greenrobot.eventbus.EventBus; +import retrofit2.Retrofit; + +import javax.inject.Inject; +import java.net.CookieManager; + +@AutoInjector(NextcloudTalkApplication.class) +public class LeaveConversationWorker extends Worker { + @Inject + Retrofit retrofit; + + @Inject + OkHttpClient okHttpClient; + + @Inject + UserUtils userUtils; + + @Inject + EventBus eventBus; + + NcApi ncApi; + + public LeaveConversationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); + } + + @NonNull + @Override + public Result doWork() { + Data data = getInputData(); + long operationUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1); + String conversationToken = data.getString(BundleKeys.KEY_ROOM_TOKEN); + UserEntity operationUser = userUtils.getUserWithId(operationUserId); + + if (operationUser != null) { + String credentials = ApiUtils.getCredentials(operationUser.getUsername(), operationUser.getToken()); + ncApi = retrofit.newBuilder().client(okHttpClient.newBuilder().cookieJar(new + JavaNetCookieJar(new CookieManager())).build()).build().create(NcApi.class); + + EventStatus eventStatus = new EventStatus(operationUser.getId(), + EventStatus.EventType.CONVERSATION_UPDATE, true); + + ncApi.leaveRoom(credentials, ApiUtils.getUrlForSettingMyselfAsActiveParticipant(operationUser.getBaseUrl(), conversationToken)) + .subscribeOn(Schedulers.newThread()) + .blockingSubscribe(new Observer() { + Disposable disposable; + @Override + public void onSubscribe(Disposable d) { + disposable = d; + + } + + @Override + public void onNext(GenericOverall genericOverall) { + eventBus.postSticky(eventStatus); + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + disposable.dispose(); + } + }); + } + + return Result.success(); + } +} diff --git a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java similarity index 97% rename from app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java rename to app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java index 04acf328b..348d2a5cc 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsJob.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java @@ -46,7 +46,7 @@ import java.util.ArrayList; import java.util.List; @AutoInjector(NextcloudTalkApplication.class) -public class SignalingSettingsJob extends Worker { +public class SignalingSettingsWorker extends Worker { private static final String TAG = "SignalingSettingsJob"; @Inject @@ -58,7 +58,7 @@ public class SignalingSettingsJob extends Worker { @Inject EventBus eventBus; - public SignalingSettingsJob(@NonNull Context context, @NonNull WorkerParameters workerParams) { + public SignalingSettingsWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } 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 4512e4880..14eaed3a6 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -22,12 +22,14 @@ package com.nextcloud.talk.utils; import android.net.Uri; import android.text.TextUtils; +import androidx.annotation.DimenRes; import com.nextcloud.talk.BuildConfig; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.models.RetrofitBucket; import okhttp3.Credentials; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; diff --git a/app/src/main/res/drawable/ic_star_grey600_24dp.xml b/app/src/main/res/drawable/ic_delete_black_24dp.xml similarity index 86% rename from app/src/main/res/drawable/ic_star_grey600_24dp.xml rename to app/src/main/res/drawable/ic_delete_black_24dp.xml index 5538185bc..ebbf4d604 100644 --- a/app/src/main/res/drawable/ic_star_grey600_24dp.xml +++ b/app/src/main/res/drawable/ic_delete_black_24dp.xml @@ -21,5 +21,5 @@ - + diff --git a/app/src/main/res/drawable/ic_star_border_grey600_24dp.xml b/app/src/main/res/drawable/ic_exit_to_app_black_24dp.xml similarity index 79% rename from app/src/main/res/drawable/ic_star_border_grey600_24dp.xml rename to app/src/main/res/drawable/ic_exit_to_app_black_24dp.xml index 5d27ad5ab..ac4fbac98 100644 --- a/app/src/main/res/drawable/ic_star_border_grey600_24dp.xml +++ b/app/src/main/res/drawable/ic_exit_to_app_black_24dp.xml @@ -21,5 +21,5 @@ - + diff --git a/app/src/main/res/drawable/ic_star_black_24dp.xml b/app/src/main/res/drawable/ic_star_black_24dp.xml new file mode 100644 index 000000000..dd6e8eb46 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_black_24dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_star_border_black_24dp.xml b/app/src/main/res/drawable/ic_star_border_black_24dp.xml new file mode 100644 index 000000000..9f531c8ee --- /dev/null +++ b/app/src/main/res/drawable/ic_star_border_black_24dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/shape_favorite_bubble.xml b/app/src/main/res/drawable/shape_favorite_bubble.xml index 3d0df3a8d..70e102dbd 100644 --- a/app/src/main/res/drawable/shape_favorite_bubble.xml +++ b/app/src/main/res/drawable/shape_favorite_bubble.xml @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/controller_conversation_info.xml b/app/src/main/res/layout/controller_conversation_info.xml index 9b350208a..9c9c24ad0 100644 --- a/app/src/main/res/layout/controller_conversation_info.xml +++ b/app/src/main/res/layout/controller_conversation_info.xml @@ -76,11 +76,30 @@ + + + + + + + + + + + + + + + + From 171ea65fdeadfcc14f254e6c1c649c297c8d1461 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 27 Feb 2019 13:19:58 +0100 Subject: [PATCH 2/5] Fix bugs Signed-off-by: Mario Danic --- .../com/nextcloud/talk/adapters/items/AdvancedUserItem.java | 2 +- .../talk/controllers/bottomsheet/OperationsMenuController.java | 2 +- .../java/com/nextcloud/talk/jobs/LeaveConversationWorker.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java index c80514c7b..40a502e53 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java @@ -114,7 +114,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem() { Disposable disposable; From 90a099b04e1004e3462cfd90dbb3668715c6afa1 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 27 Feb 2019 18:03:06 +0100 Subject: [PATCH 3/5] Fix #480, Fix #188 Signed-off-by: Mario Danic --- .../talk/controllers/CallController.java | 1 - .../ConversationInfoController.java | 4 - .../com/nextcloud/talk/utils/ApiUtils.java | 1 - .../talk/utils/NotificationUtils.java | 1 - .../talk/utils/power/PowerManagerUtils.java | 163 ++++++++++++++++++ .../talk/utils/power/ProximityLock.java | 65 +++++++ .../talk/webrtc/MagicAudioManager.java | 8 + 7 files changed, 236 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java create mode 100644 app/src/main/java/com/nextcloud/talk/utils/power/ProximityLock.java 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 4c6b7be0e..34e0d19d6 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -92,7 +92,6 @@ import org.apache.commons.lang3.StringEscapeUtils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import org.parceler.Parcels; import org.webrtc.*; import pub.devrel.easypermissions.AfterPermissionGranted; diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java index 769333873..7ef774d28 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java @@ -23,7 +23,6 @@ package com.nextcloud.talk.controllers; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; -import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -31,7 +30,6 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import androidx.room.Delete; import androidx.work.Data; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; @@ -50,7 +48,6 @@ import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.jobs.DeleteConversationWorker; import com.nextcloud.talk.jobs.LeaveConversationWorker; -import com.nextcloud.talk.jobs.PushRegistrationWorker; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.converters.EnumNotificationLevelConverter; import com.nextcloud.talk.models.json.participants.Participant; @@ -73,7 +70,6 @@ import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.parceler.Parcels; import javax.inject.Inject; import java.util.ArrayList; 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 14eaed3a6..62c52294a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -20,7 +20,6 @@ package com.nextcloud.talk.utils; import android.net.Uri; - import android.text.TextUtils; import androidx.annotation.DimenRes; import com.nextcloud.talk.BuildConfig; diff --git a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.java b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.java index 178d16ba7..f01ace1d3 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.java @@ -107,5 +107,4 @@ public class NotificationUtils { } } } - } diff --git a/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java b/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java new file mode 100644 index 000000000..2e4f71c89 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java @@ -0,0 +1,163 @@ +/* + * 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 . + * + * This class is in part based on the code from the great people that wrote Signal + * https://github.com/signalapp/Signal-Android/raw/f9adb4e4554a44fd65b77320e34bf4bccf7924ce/src/org/thoughtcrime/securesms/webrtc/locks/LockManager.java + */ + +package com.nextcloud.talk.utils.power; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.os.PowerManager; +import android.provider.Settings; +import autodagger.AutoInjector; +import com.nextcloud.talk.application.NextcloudTalkApplication; + +import javax.inject.Inject; + +@AutoInjector(NextcloudTalkApplication.class) + +public class PowerManagerUtils { + private static final String TAG = "PowerManagerUtils"; + + @Inject + Context context; + + private final PowerManager.WakeLock fullLock; + private final PowerManager.WakeLock partialLock; + private final WifiManager.WifiLock wifiLock; + private ProximityLock proximityLock; + + private final boolean wifiLockEnforced; + private boolean proximityDisabled = false; + + public enum PhoneState { + IDLE, + PROCESSING, //used when the phone is active but before the user should be alerted. + INTERACTIVE, + WITHOUT_PROXIMITY_SENSOR_LOCK, + WITH_PROXIMITY_SENSOR_LOCK + } + + public enum WakeLockState { + FULL, + PARTIAL, + SLEEP, + PROXIMITY + } + + public PowerManagerUtils() { + NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); + + PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + fullLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "nctalk:fullwakelock"); + partialLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "nctalk:partialwakelock"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + proximityLock = new ProximityLock(pm); + } + + // we suppress a possible leak because this is indeed application context + @SuppressLint("WifiManagerPotentialLeak") WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "nctalk:wifiwakelock"); + + fullLock.setReferenceCounted(false); + partialLock.setReferenceCounted(false); + wifiLock.setReferenceCounted(false); + + wifiLockEnforced = isWifiPowerActiveModeEnabled(context); + } + + public void updatePhoneState(PhoneState state) { + switch(state) { + case IDLE: + setWakeLockState(WakeLockState.SLEEP); + break; + case PROCESSING: + setWakeLockState(WakeLockState.PARTIAL); + break; + case INTERACTIVE: + setWakeLockState(WakeLockState.FULL); + break; + case WITH_PROXIMITY_SENSOR_LOCK: + proximityDisabled = false; + updateInCallWakeLockState(); + break; + case WITHOUT_PROXIMITY_SENSOR_LOCK: + proximityDisabled = true; + updateInCallWakeLockState(); + break; + } + } + + private void updateInCallWakeLockState() { + if (wifiLockEnforced && !proximityDisabled) { + setWakeLockState(WakeLockState.PROXIMITY); + } else { + setWakeLockState(WakeLockState.FULL); + } + } + + private boolean isWifiPowerActiveModeEnabled(Context context) { + int wifi_pwr_active_mode = Settings.Secure.getInt(context.getContentResolver(), "wifi_pwr_active_mode", -1); + return (wifi_pwr_active_mode != 0); + } + + @SuppressLint("WakelockTimeout") + private synchronized void setWakeLockState(WakeLockState newState) { + switch(newState) { + case FULL: + fullLock.acquire(); + partialLock.acquire(); + wifiLock.acquire(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + proximityLock.release(); + } + break; + case PARTIAL: + partialLock.acquire(); + wifiLock.acquire(); + fullLock.release(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + proximityLock.release(); + } + break; + case SLEEP: + fullLock.release(); + partialLock.release(); + wifiLock.release(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + proximityLock.release(); + } + break; + case PROXIMITY: + partialLock.acquire(); + wifiLock.acquire(); + fullLock.release(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + proximityLock.acquire(); + } + break; + default: + // something went very very wrong + } + } +} diff --git a/app/src/main/java/com/nextcloud/talk/utils/power/ProximityLock.java b/app/src/main/java/com/nextcloud/talk/utils/power/ProximityLock.java new file mode 100644 index 000000000..425f8eb30 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/power/ProximityLock.java @@ -0,0 +1,65 @@ +/* + * 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.utils.power; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.os.PowerManager; +import androidx.annotation.RequiresApi; + +import java.util.Optional; + +class ProximityLock { + private final Optional proximityLock; + + @RequiresApi(api = Build.VERSION_CODES.N) + ProximityLock(PowerManager pm) { + proximityLock = getProximityLock(pm); + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private Optional getProximityLock(PowerManager powerManager) { + if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) { + return Optional.ofNullable(powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "nctalk:proximitylock")); + } else { + return Optional.empty(); + } + } + + @SuppressLint("WakelockTimeout") + @RequiresApi(api = Build.VERSION_CODES.N) + void acquire() { + if (!proximityLock.isPresent() || proximityLock.get().isHeld()) { + return; + } + + proximityLock.get().acquire(); + } + + @RequiresApi(api = Build.VERSION_CODES.N) + void release() { + if (!proximityLock.isPresent() || !proximityLock.get().isHeld()) { + return; + } + + proximityLock.get().release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY); + } +} diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java index 6dcfd06ef..a631d7d05 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java @@ -41,6 +41,7 @@ import android.media.AudioManager; import android.os.Build; import android.util.Log; import com.nextcloud.talk.events.PeerConnectionEvent; +import com.nextcloud.talk.utils.power.PowerManagerUtils; import org.greenrobot.eventbus.EventBus; import org.webrtc.ThreadUtils; @@ -94,6 +95,8 @@ public class MagicAudioManager { // Callback method for changes in audio focus. private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener; + private PowerManagerUtils powerManagerUtils; + private MagicAudioManager(Context context, boolean useProximitySensor) { Log.d(TAG, "ctor"); ThreadUtils.checkIsOnMainThread(); @@ -103,6 +106,9 @@ public class MagicAudioManager { wiredHeadsetReceiver = new WiredHeadsetReceiver(); amState = AudioManagerState.UNINITIALIZED; + powerManagerUtils = new PowerManagerUtils(); + powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.WITH_PROXIMITY_SENSOR_LOCK); + if (useProximitySensor) { useSpeakerphone = SPEAKERPHONE_AUTO; } else { @@ -313,6 +319,8 @@ public class MagicAudioManager { proximitySensor = null; } + powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.IDLE); + audioManagerEvents = null; Log.d(TAG, "AudioManager stopped"); } From 2fb58e8cabbed67c9674240d0d099e101af71577 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 27 Feb 2019 18:24:19 +0100 Subject: [PATCH 4/5] Improve orientation detection for Power management Signed-off-by: Mario Danic --- .../nextcloud/talk/controllers/CallController.java | 7 ++++++- .../nextcloud/talk/utils/power/PowerManagerUtils.java | 11 ++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) 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 34e0d19d6..3f266cc2c 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -74,6 +74,7 @@ import com.nextcloud.talk.utils.animations.PulseAnimation; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.glide.GlideApp; +import com.nextcloud.talk.utils.power.PowerManagerUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder; import com.nextcloud.talk.webrtc.*; @@ -209,6 +210,8 @@ public class CallController extends BaseController { private boolean hasExternalSignalingServer; private String conversationPassword; + private PowerManagerUtils powerManagerUtils; + public CallController(Bundle args) { super(args); NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); @@ -228,6 +231,7 @@ public class CallController extends BaseController { } isFromNotification = TextUtils.isEmpty(roomToken); + powerManagerUtils = new PowerManagerUtils(); } @Override @@ -717,7 +721,6 @@ public class CallController extends BaseController { if (localMediaStream != null && localMediaStream.videoTracks.size() > 0) { localMediaStream.videoTracks.get(0).setEnabled(enable); } - if (enable) { pipVideoView.setVisibility(View.VISIBLE); } else { @@ -1592,6 +1595,8 @@ public class CallController extends BaseController { @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(ConfigurationChangeEvent configurationChangeEvent) { + powerManagerUtils.setOrientation(Objects.requireNonNull(getResources()).getConfiguration().orientation); + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { remoteRenderersLayout.setOrientation(LinearLayout.HORIZONTAL); } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { diff --git a/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java b/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java index 2e4f71c89..0d7c10ef4 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java @@ -25,6 +25,7 @@ package com.nextcloud.talk.utils.power; import android.annotation.SuppressLint; import android.content.Context; +import android.content.res.Configuration; import android.net.wifi.WifiManager; import android.os.Build; import android.os.PowerManager; @@ -50,6 +51,8 @@ public class PowerManagerUtils { private final boolean wifiLockEnforced; private boolean proximityDisabled = false; + private int orientation; + public enum PhoneState { IDLE, PROCESSING, //used when the phone is active but before the user should be alerted. @@ -65,6 +68,11 @@ public class PowerManagerUtils { PROXIMITY } + public void setOrientation(int newOrientation) { + orientation = newOrientation; + updateInCallWakeLockState(); + } + public PowerManagerUtils() { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); @@ -84,6 +92,7 @@ public class PowerManagerUtils { wifiLock.setReferenceCounted(false); wifiLockEnforced = isWifiPowerActiveModeEnabled(context); + orientation = context.getResources().getConfiguration().orientation; } public void updatePhoneState(PhoneState state) { @@ -109,7 +118,7 @@ public class PowerManagerUtils { } private void updateInCallWakeLockState() { - if (wifiLockEnforced && !proximityDisabled) { + if (orientation != Configuration.ORIENTATION_LANDSCAPE && wifiLockEnforced && !proximityDisabled) { setWakeLockState(WakeLockState.PROXIMITY); } else { setWakeLockState(WakeLockState.FULL); From 52d522ed375fc2f078428ef1bb69d0f4055d7035 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 27 Feb 2019 18:47:28 +0100 Subject: [PATCH 5/5] Improve code further with some conditionals & audio handling Signed-off-by: Mario Danic --- .../talk/controllers/CallController.java | 11 ++++++ .../talk/utils/power/PowerManagerUtils.java | 38 +++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) 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 3f266cc2c..968046319 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -496,8 +496,19 @@ public class CallController extends BaseController { final MagicAudioManager.AudioDevice device, final Set availableDevices) { Log.d(TAG, "onAudioManagerDevicesChanged: " + availableDevices + ", " + "selected: " + device); + + final boolean shouldDisableProximityLock = (device.equals(MagicAudioManager.AudioDevice.WIRED_HEADSET) + || device.equals(MagicAudioManager.AudioDevice.SPEAKER_PHONE) + || device.equals(MagicAudioManager.AudioDevice.BLUETOOTH)); + + if (shouldDisableProximityLock) { + powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.WITHOUT_PROXIMITY_SENSOR_LOCK); + } else { + powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.WITH_PROXIMITY_SENSOR_LOCK); + } } + private void cameraInitialization() { videoCapturer = createCameraCapturer(cameraEnumerator); diff --git a/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java b/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java index 0d7c10ef4..f2370639a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/power/PowerManagerUtils.java @@ -134,16 +134,31 @@ public class PowerManagerUtils { private synchronized void setWakeLockState(WakeLockState newState) { switch(newState) { case FULL: - fullLock.acquire(); - partialLock.acquire(); - wifiLock.acquire(); + if (!fullLock.isHeld()) { + fullLock.acquire(); + } + + if (!partialLock.isHeld()) { + partialLock.acquire(); + } + + if (!wifiLock.isHeld()) { + wifiLock.acquire(); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock.release(); } break; case PARTIAL: - partialLock.acquire(); - wifiLock.acquire(); + if (!partialLock.isHeld()) { + partialLock.acquire(); + } + + if (!wifiLock.isHeld()) { + wifiLock.acquire(); + } + fullLock.release(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock.release(); @@ -158,9 +173,16 @@ public class PowerManagerUtils { } break; case PROXIMITY: - partialLock.acquire(); - wifiLock.acquire(); - fullLock.release(); + if (!partialLock.isHeld()) { + partialLock.acquire(); + } + + if (!wifiLock.isHeld()) { + wifiLock.acquire(); + } + fullLock.release( + + ); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock.acquire(); }