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 68cdeb418..7756f1425 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -30,6 +30,7 @@ import android.os.Bundle; import android.os.Handler; import android.text.InputType; import android.text.TextUtils; +import android.util.Log; import android.view.*; import android.view.inputmethod.EditorInfo; import android.widget.ProgressBar; @@ -41,6 +42,9 @@ import androidx.core.view.MenuItemCompat; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.work.Data; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; import autodagger.AutoInjector; import butterknife.BindView; import com.bluelinelabs.conductor.RouterTransaction; @@ -68,6 +72,8 @@ 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.interfaces.ConversationMenuInterface; +import com.nextcloud.talk.jobs.DeleteConversationWorker; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.rooms.Conversation; @@ -79,6 +85,8 @@ 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.preferences.AppPreferences; +import com.yarolegovich.lovelydialog.LovelySaveStateHandler; +import com.yarolegovich.lovelydialog.LovelyStandardDialog; import eu.davidea.fastscroller.FastScroller; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; @@ -101,11 +109,12 @@ import java.util.List; @AutoInjector(NextcloudTalkApplication.class) public class ConversationsListController extends BaseController implements SearchView.OnQueryTextListener, FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener, FastScroller - .OnScrollStateChangeListener { + .OnScrollStateChangeListener, ConversationMenuInterface { public static final String TAG = "ConversationsListController"; private static final String KEY_SEARCH_QUERY = "ContactsController.searchQuery"; + public static final int ID_DELETE_CONVERSATION_DIALOG = 0; @Inject UserUtils userUtils; @@ -116,6 +125,9 @@ public class ConversationsListController extends BaseController implements Searc @Inject NcApi ncApi; + @Inject + Context context; + @Inject AppPreferences appPreferences; @@ -159,6 +171,10 @@ public class ConversationsListController extends BaseController implements Searc private String lastClickedConversationToken; private int scrollTo = 0; + private LovelySaveStateHandler saveStateHandler; + + private Bundle conversationMenuBundle = null; + public ConversationsListController() { super(); setHasOptionsMenu(true); @@ -178,6 +194,10 @@ public class ConversationsListController extends BaseController implements Searc getActionBar().show(); } + if (saveStateHandler == null) { + saveStateHandler = new LovelySaveStateHandler(); + } + if (adapter == null) { adapter = new FlexibleAdapter<>(callItems, getActivity(), true); } else { @@ -505,16 +525,24 @@ public class ConversationsListController extends BaseController implements Searc @Override public void onSaveViewState(@NonNull View view, @NonNull Bundle outState) { - super.onSaveViewState(view, outState); + saveStateHandler.saveInstanceState(outState); + if (searchView != null && !TextUtils.isEmpty(searchView.getQuery())) { outState.putString(KEY_SEARCH_QUERY, searchView.getQuery().toString()); } + + super.onSaveViewState(view, outState); } @Override public void onRestoreViewState(@NonNull View view, @NonNull Bundle savedViewState) { super.onRestoreViewState(view, savedViewState); searchQuery = savedViewState.getString(KEY_SEARCH_QUERY, ""); + if (LovelySaveStateHandler.wasDialogOnScreen(savedViewState)) { + //Dialog won't be restarted automatically, so we need to call this method. + //Each dialog knows how to restore its state + showLovelyDialog(LovelySaveStateHandler.getSavedDialogId(savedViewState), savedViewState); + } } @Override @@ -584,7 +612,7 @@ public class ConversationsListController extends BaseController implements Searc if (shouldShowCallMenuController) { getChildRouter((ViewGroup) view).setRoot( - RouterTransaction.with(new CallMenuController(bundle)) + RouterTransaction.with(new CallMenuController(bundle, this)) .popChangeHandler(new VerticalChangeHandler()) .pushChangeHandler(new VerticalChangeHandler())); } else { @@ -677,7 +705,7 @@ 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()){ + if (currentUser != null && eventStatus.getUserId() == currentUser.getId()) { switch (eventStatus.getEventType()) { case CONVERSATION_UPDATE: if (eventStatus.isAllGood() && !isRefreshing) { @@ -689,4 +717,71 @@ public class ConversationsListController extends BaseController implements Searc } } } -} \ No newline at end of file + + private void showDeleteConversationDialog(Bundle savedInstanceState) { + if (getActivity() != null && conversationMenuBundle != null && currentUser != null && conversationMenuBundle.getLong(BundleKeys.KEY_INTERNAL_USER_ID) == currentUser.getId()) { + + Conversation conversation = + Parcels.unwrap(conversationMenuBundle.getParcelable(BundleKeys.KEY_ROOM)); + + if (conversation != null) { + new LovelyStandardDialog(getActivity(), LovelyStandardDialog.ButtonLayout.HORIZONTAL) + .setTopColorRes(R.color.nc_darkRed) + .setIcon(DisplayUtils.getTintedDrawable(context.getResources(), + R.drawable.ic_delete_black_24dp, R.color.white)) + .setPositiveButtonColor(context.getResources().getColor(R.color.nc_darkRed)) + .setTitle(R.string.nc_delete_call) + .setMessage(conversation.getDeleteWarningMessage()) + .setPositiveButton(R.string.nc_delete, new View.OnClickListener() { + @Override + public void onClick(View v) { + Data.Builder data = new Data.Builder(); + data.putLong(BundleKeys.KEY_INTERNAL_USER_ID, + conversationMenuBundle.getLong(BundleKeys.KEY_INTERNAL_USER_ID)); + data.putString(BundleKeys.KEY_ROOM_TOKEN, conversation.getToken()); + conversationMenuBundle = null; + deleteConversation(data.build()); + } + }) + .setNegativeButton(R.string.nc_cancel, new View.OnClickListener() { + @Override + public void onClick(View v) { + conversationMenuBundle = null; + } + }) + .setInstanceStateHandler(ID_DELETE_CONVERSATION_DIALOG, saveStateHandler) + .setSavedInstanceState(savedInstanceState) + .show(); + } + } + } + + private void deleteConversation(Data data) { + OneTimeWorkRequest deleteConversationWorker = + new OneTimeWorkRequest.Builder(DeleteConversationWorker.class).setInputData(data).build(); + WorkManager.getInstance().enqueue(deleteConversationWorker); + } + + private void showLovelyDialog(int dialogId, Bundle savedInstanceState) { + switch (dialogId) { + case ID_DELETE_CONVERSATION_DIALOG: + showDeleteConversationDialog(savedInstanceState); + break; + default: + break; + } + } + + @Override + public void openLovelyDialogWithIdAndBundle(int dialogId, Bundle bundle) { + conversationMenuBundle = bundle; + switch (dialogId) { + case ID_DELETE_CONVERSATION_DIALOG: + showLovelyDialog(dialogId, null); + break; + default: + break; + } + + } +} 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 e09922f98..2fb650978 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 @@ -28,6 +28,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.work.Data; @@ -42,8 +43,10 @@ import com.nextcloud.talk.R; import com.nextcloud.talk.adapters.items.AppItem; import com.nextcloud.talk.adapters.items.MenuItem; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.nextcloud.talk.controllers.ConversationsListController; import com.nextcloud.talk.controllers.base.BaseController; import com.nextcloud.talk.events.BottomSheetLockEvent; +import com.nextcloud.talk.interfaces.ConversationMenuInterface; import com.nextcloud.talk.jobs.DeleteConversationWorker; import com.nextcloud.talk.jobs.LeaveConversationWorker; import com.nextcloud.talk.models.database.UserEntity; @@ -81,6 +84,7 @@ public class CallMenuController extends BaseController implements FlexibleAdapte private Intent shareIntent; private UserEntity currentUser; + private ConversationMenuInterface conversationMenuInterface; public CallMenuController(Bundle args) { super(args); @@ -90,6 +94,15 @@ public class CallMenuController extends BaseController implements FlexibleAdapte } } + public CallMenuController(Bundle args, @Nullable ConversationMenuInterface conversationMenuInterface) { + super(args); + this.conversation = Parcels.unwrap(args.getParcelable(BundleKeys.KEY_ROOM)); + if (args.containsKey(BundleKeys.KEY_MENU_TYPE)) { + this.menuType = Parcels.unwrap(args.getParcelable(BundleKeys.KEY_MENU_TYPE)); + } + this.conversationMenuInterface = conversationMenuInterface; + } + @Override protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) { return inflater.inflate(R.layout.controller_call_menu, container, false); @@ -217,19 +230,20 @@ public class CallMenuController extends BaseController implements FlexibleAdapte if (tag > 0) { if (tag == 1 || tag == 9) { - Data data; - if ((data = getWorkerData()) != null) { if (tag == 1) { - OneTimeWorkRequest leaveConversationWorker = - new OneTimeWorkRequest.Builder(LeaveConversationWorker.class).setInputData(data).build(); - WorkManager.getInstance().enqueue(leaveConversationWorker); + Data data; + if ((data = getWorkerData()) != null) { + OneTimeWorkRequest leaveConversationWorker = + new OneTimeWorkRequest.Builder(LeaveConversationWorker.class).setInputData(data).build(); + WorkManager.getInstance().enqueue(leaveConversationWorker); + } } else { - OneTimeWorkRequest deleteConversationWorker = - new OneTimeWorkRequest.Builder(DeleteConversationWorker.class).setInputData(data).build(); - WorkManager.getInstance().enqueue(deleteConversationWorker); + Bundle deleteConversationBundle; + if ((deleteConversationBundle = getDeleteConversationBundle()) != null) { + conversationMenuInterface.openLovelyDialogWithIdAndBundle(ConversationsListController.ID_DELETE_CONVERSATION_DIALOG, deleteConversationBundle); + } } eventBus.post(new BottomSheetLockEvent(true, 0, false, true)); - } } else { bundle.putInt(BundleKeys.KEY_OPERATION_CODE, tag); if (tag != 2 && tag != 4 && tag != 6 && tag != 7) { @@ -243,7 +257,7 @@ public class CallMenuController extends BaseController implements FlexibleAdapte .popChangeHandler(new HorizontalChangeHandler())); } else { bundle.putParcelable(BundleKeys.KEY_MENU_TYPE, Parcels.wrap(MenuType.SHARE)); - getRouter().pushController(RouterTransaction.with(new CallMenuController(bundle)) + getRouter().pushController(RouterTransaction.with(new CallMenuController(bundle, null)) .pushChangeHandler(new HorizontalChangeHandler()) .popChangeHandler(new HorizontalChangeHandler())); } @@ -292,4 +306,15 @@ public class CallMenuController extends BaseController implements FlexibleAdapte return null; } + private Bundle getDeleteConversationBundle() { + if (!TextUtils.isEmpty(conversation.getToken())) { + Bundle bundle = new Bundle(); + bundle.putLong(BundleKeys.KEY_INTERNAL_USER_ID, currentUser.getId()); + bundle.putParcelable(BundleKeys.KEY_ROOM, Parcels.wrap(conversation)); + return bundle; + } + + return null; + + } } diff --git a/app/src/main/java/com/nextcloud/talk/interfaces/ConversationMenuInterface.java b/app/src/main/java/com/nextcloud/talk/interfaces/ConversationMenuInterface.java new file mode 100644 index 000000000..8ef3b89a3 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/interfaces/ConversationMenuInterface.java @@ -0,0 +1,27 @@ +/* + * 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.interfaces; + +import android.os.Bundle; + +public interface ConversationMenuInterface { + void openLovelyDialogWithIdAndBundle(int dialogId, Bundle bundle); +} 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 f2370639a..df2d0e201 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 @@ -160,6 +160,7 @@ public class PowerManagerUtils { } fullLock.release(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock.release(); } @@ -180,6 +181,7 @@ public class PowerManagerUtils { if (!wifiLock.isHeld()) { wifiLock.acquire(); } + fullLock.release( );