From f767a0f4e347a597a84196cebcd06f67986c2c30 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Wed, 22 Apr 2020 11:15:15 +0200 Subject: [PATCH 001/100] Design Report #15261-Change behaviour for message multislection inside a chatroom --- .../megachat/ChatActivityLollipop.java | 267 ++++++++++++------ .../chatAdapters/MegaChatLollipopAdapter.java | 56 +--- ...ctAttachmentBottomSheetDialogFragment.java | 30 +- .../GeneralChatMessageBottomSheet.java | 220 +++++++++++++++ ...deAttachmentBottomSheetDialogFragment.java | 32 ++- .../privacy/android/app/utils/Constants.java | 5 + .../main/res/drawable-hdpi/ic_copy_grey.png | Bin 0 -> 605 bytes .../main/res/drawable-hdpi/ic_delete_msg.png | Bin 0 -> 493 bytes .../main/res/drawable-hdpi/ic_edit_msg.png | Bin 0 -> 465 bytes .../res/drawable-hdpi/ic_select_modal.png | Bin 0 -> 1095 bytes .../main/res/drawable-mdpi/ic_copy_grey.png | Bin 0 -> 414 bytes .../main/res/drawable-mdpi/ic_delete_msg.png | Bin 0 -> 371 bytes .../main/res/drawable-mdpi/ic_edit_msg.png | Bin 0 -> 356 bytes .../res/drawable-mdpi/ic_select_modal.png | Bin 0 -> 723 bytes .../main/res/drawable-xhdpi/ic_copy_grey.png | Bin 0 -> 628 bytes .../main/res/drawable-xhdpi/ic_delete_msg.png | Bin 0 -> 600 bytes .../main/res/drawable-xhdpi/ic_edit_msg.png | Bin 0 -> 525 bytes .../res/drawable-xhdpi/ic_select_modal.png | Bin 0 -> 1457 bytes .../main/res/drawable-xxhdpi/ic_copy_grey.png | Bin 0 -> 821 bytes .../res/drawable-xxhdpi/ic_delete_msg.png | Bin 0 -> 833 bytes .../main/res/drawable-xxhdpi/ic_edit_msg.png | Bin 0 -> 691 bytes .../res/drawable-xxhdpi/ic_select_modal.png | Bin 0 -> 2249 bytes .../res/drawable-xxxhdpi/ic_copy_grey.png | Bin 0 -> 1146 bytes .../res/drawable-xxxhdpi/ic_delete_msg.png | Bin 0 -> 1196 bytes .../main/res/drawable-xxxhdpi/ic_edit_msg.png | Bin 0 -> 897 bytes .../res/drawable-xxxhdpi/ic_select_modal.png | Bin 0 -> 2994 bytes .../bottom_sheet_contact_attachment_item.xml | 37 +++ .../bottom_sheet_general_chat_messages.xml | 207 ++++++++++++++ .../bottom_sheet_node_attachment_item.xml | 37 +++ app/src/main/res/menu/chat_action.xml | 8 +- app/src/main/res/values/strings.xml | 2 + 31 files changed, 744 insertions(+), 157 deletions(-) create mode 100644 app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java create mode 100644 app/src/main/res/drawable-hdpi/ic_copy_grey.png create mode 100644 app/src/main/res/drawable-hdpi/ic_delete_msg.png create mode 100644 app/src/main/res/drawable-hdpi/ic_edit_msg.png create mode 100644 app/src/main/res/drawable-hdpi/ic_select_modal.png create mode 100644 app/src/main/res/drawable-mdpi/ic_copy_grey.png create mode 100644 app/src/main/res/drawable-mdpi/ic_delete_msg.png create mode 100644 app/src/main/res/drawable-mdpi/ic_edit_msg.png create mode 100644 app/src/main/res/drawable-mdpi/ic_select_modal.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_copy_grey.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_msg.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_edit_msg.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_select_modal.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_copy_grey.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_msg.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_edit_msg.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_select_modal.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_copy_grey.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_msg.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_edit_msg.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_select_modal.png create mode 100644 app/src/main/res/layout/bottom_sheet_general_chat_messages.xml diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index a8842e6a62c..6513f5eb3ea 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -126,6 +126,7 @@ import mega.privacy.android.app.lollipop.tasks.FilePrepareTask; import mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet.AttachmentUploadBottomSheetDialogFragment; import mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet.ContactAttachmentBottomSheetDialogFragment; +import mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet.GeneralChatMessageBottomSheet; import mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet.MessageNotSentBottomSheetDialogFragment; import mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet.NodeAttachmentBottomSheetDialogFragment; import mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet.PendingMessageBottomSheetDialogFragment; @@ -286,7 +287,7 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh boolean isOpeningChat = true; - int selectedPosition; + public int selectedPosition = INVALID_POSITION; public long selectedMessageId = -1; MegaChatRoom chatRoom; @@ -370,6 +371,7 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh MenuItem importIcon; MenuItem callMenuItem; MenuItem videoMenuItem; + MenuItem selectMenuItem; MenuItem inviteMenuItem; MenuItem clearHistoryMenuItem; MenuItem contactInfoMenuItem; @@ -1967,6 +1969,7 @@ public boolean onCreateOptionsMenu(Menu menu) { callMenuItem = menu.findItem(R.id.cab_menu_call_chat); videoMenuItem = menu.findItem(R.id.cab_menu_video_chat); + selectMenuItem = menu.findItem(R.id.cab_menu_select_messages); inviteMenuItem = menu.findItem(R.id.cab_menu_invite_chat); clearHistoryMenuItem = menu.findItem(R.id.cab_menu_clear_history_chat); contactInfoMenuItem = menu.findItem(R.id.cab_menu_contact_info_chat); @@ -1981,6 +1984,7 @@ public boolean onPrepareOptionsMenu(Menu menu){ logDebug("onPrepareOptionsMenu"); if(chatRoom!=null){ + selectMenuItem.setVisible(true); callMenuItem.setEnabled(false); callMenuItem.setIcon(mutateIcon(this, R.drawable.ic_phone_white, R.color.white_50_opacity)); if (chatRoom.isGroup()) { @@ -2099,6 +2103,7 @@ public boolean onPrepareOptionsMenu(Menu menu){ leaveMenuItem.setVisible(false); callMenuItem.setVisible(false); videoMenuItem.setVisible(false); + selectMenuItem.setVisible(false); clearHistoryMenuItem.setVisible(false); inviteMenuItem.setVisible(false); contactInfoMenuItem.setVisible(false); @@ -2165,6 +2170,9 @@ public boolean onOptionsItemSelected(MenuItem item) { } break; } + case R.id.cab_menu_select_messages: + activateActionMode(); + break; case R.id.cab_menu_invite_chat:{ if(recordView.isRecordingNow()) break; @@ -3394,9 +3402,7 @@ public void onClick(View v) { if(text.trim().isEmpty()) break; if (editingMessage) { editMessage(text); - clearSelections(); - hideMultipleSelect(); - actionMode.invalidate(); + finishMultiselectionMode(); } else { sendMessage(text); } @@ -3732,6 +3738,40 @@ public void sendMessagesToUI(ArrayList messages) { } } + public void copyMessage(AndroidMegaChatMessage message) { + String text = chatC.createSingleManagementString(message, chatRoom); + + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { + android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + clipboard.setText(text); + } else { + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); + clipboard.setPrimaryClip(clip); + } + showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); + } + + public void editMessage(ArrayList messagesSelected) { + if (messagesSelected.isEmpty() || messagesSelected.get(0) == null) + return; + + editingMessage = true; + MegaChatMessage msg = messagesSelected.get(0).getMessage(); + MegaChatContainsMeta meta = msg.getContainsMeta(); + messageToEdit = msg; + textChat.setText(messageToEdit.getContent()); + textChat.setSelection(textChat.getText().length()); + if (msg.getType() == MegaChatMessage.TYPE_CONTAINS_META && meta != null && meta.getType() == MegaChatContainsMeta.CONTAINS_META_GEOLOCATION) { + sendLocation(); + finishMultiselectionMode(); + + } else { + textChat.setText(messageToEdit.getContent()); + textChat.setSelection(textChat.getText().length()); + } + } + public void editMessage(String text){ logDebug("editMessage: "); MegaChatMessage msgEdited = null; @@ -3783,13 +3823,20 @@ public void showUploadPanel(){ bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); } - public void activateActionMode(){ + private void activateActionMode(){ if (!adapter.isMultipleSelect()){ adapter.setMultipleSelect(true); actionMode = startSupportActionMode(new ActionBarCallBack()); + updateActionModeTitle(); } } + public void activateActionModeWithItem(int positionInAdapter){ + activateActionMode(); + if (adapter.isMultipleSelect()) { + itemClick((positionInAdapter + 1), null); + } + } //Multiselect private class ActionBarCallBack implements ActionMode.Callback { @@ -3801,24 +3848,7 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch(item.getItemId()){ case R.id.chat_cab_menu_edit:{ logDebug("Edit text"); - if (!messagesSelected.isEmpty() && messagesSelected.get(0) != null) { - editingMessage = true; - MegaChatMessage msg = messagesSelected.get(0).getMessage(); - MegaChatContainsMeta meta = msg.getContainsMeta(); - messageToEdit = msg; - textChat.setText(messageToEdit.getContent()); - textChat.setSelection(textChat.getText().length()); - if (msg.getType() == MegaChatMessage.TYPE_CONTAINS_META && meta != null && meta.getType() == MegaChatContainsMeta.CONTAINS_META_GEOLOCATION) { - sendLocation(); - clearSelections(); - hideMultipleSelect(); - actionMode.invalidate(); - } - else { - textChat.setText(messageToEdit.getContent()); - textChat.setSelection(textChat.getText().length()); - } - } + editMessage(messagesSelected); break; } case R.id.chat_cab_menu_forward:{ @@ -3827,32 +3857,31 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { break; } case R.id.chat_cab_menu_copy:{ - clearSelections(); - hideMultipleSelect(); + finishMultiselectionMode(); String text = ""; - if(messagesSelected.size()==1){ - AndroidMegaChatMessage message = messagesSelected.get(0); - text = chatC.createSingleManagementString(message, chatRoom); - }else{ - text = copyMessages(messagesSelected); - } + if (messagesSelected.size() == 1) { + copyMessage(messagesSelected.get(0)); - if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setText(text); } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); - clipboard.setPrimaryClip(clip); + text = copyMessages(messagesSelected); + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { + android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + clipboard.setText(text); + + } else { + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); + clipboard.setPrimaryClip(clip); + } + showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); + } - showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); break; } case R.id.chat_cab_menu_delete:{ - clearSelections(); - hideMultipleSelect(); + finishMultiselectionMode(); //Delete showConfirmationDeleteMessages(messagesSelected, chatRoom); break; @@ -3874,14 +3903,12 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { break; } case R.id.chat_cab_menu_import:{ - clearSelections(); - hideMultipleSelect(); + finishMultiselectionMode(); chatC.importNodesFromAndroidMessages(messagesSelected); break; } case R.id.chat_cab_menu_offline:{ - clearSelections(); - hideMultipleSelect(); + finishMultiselectionMode(); if (!checkPermissionWriteStorage(REQUEST_WRITE_STORAGE_OFFLINE)) { preservedMessagesSelected = messagesSelected; return false; @@ -3933,23 +3960,22 @@ public void onDestroyActionMode(ActionMode arg0) { changeStatusBarColorActionMode(chatActivity, getWindow(), handler, 0); } - private boolean hasMessagesRemoved(MegaChatMessage messageSelected){ - if(removedMessages != null && !removedMessages.isEmpty()){ - for(int i=0; i selected = adapter.getSelectedMessages(); - if (selected.size() !=0) { -// MenuItem unselect = menu.findItem(R.id.cab_menu_unselect_all); + if(selected.size() == 0){ + menu.findItem(R.id.chat_cab_menu_edit).setVisible(false); + menu.findItem(R.id.chat_cab_menu_copy).setVisible(false); + menu.findItem(R.id.chat_cab_menu_delete).setVisible(false); + menu.findItem(R.id.chat_cab_menu_forward).setVisible(false); + menu.findItem(R.id.chat_cab_menu_download).setVisible(false); + menu.findItem(R.id.chat_cab_menu_offline).setVisible(false); + importIcon.setVisible(false); + + + }else { + if((chatRoom.getOwnPrivilege()==MegaChatRoom.PRIV_RM||chatRoom.getOwnPrivilege()==MegaChatRoom.PRIV_RO) && !chatRoom.isPreview()){ logDebug("Chat without permissions || without preview"); @@ -4298,10 +4324,16 @@ private void clearSelections() { updateActionModeTitle(); } - private void updateActionModeTitle() { + public void updateActionModeTitle() { try { - actionMode.setTitle(adapter.getSelectedItemCount()+""); - actionMode.invalidate(); + if (actionMode != null) { + if(adapter.getSelectedItemCount() == 0){ + actionMode.setTitle(getString(R.string.select_message_title).toUpperCase()); + }else{ + actionMode.setTitle(adapter.getSelectedItemCount() + ""); + } + actionMode.invalidate(); + } } catch (Exception e) { e.printStackTrace(); logError("Invalidate error", e); @@ -4312,13 +4344,19 @@ private void updateActionModeTitle() { * Disable selection */ public void hideMultipleSelect() { - adapter.setMultipleSelect(false); + if (adapter != null) { + adapter.setMultipleSelect(false); + } if (actionMode != null) { actionMode.finish(); } - } + } + public void finishMultiselectionMode() { + clearSelections(); + hideMultipleSelect(); + } public void selectAll() { if (adapter != null) { @@ -4335,6 +4373,38 @@ public void selectAll() { } } + public void itemLongClick(int positionInAdapter){ + int positionInMessages = positionInAdapter - 1; + if (positionInMessages >= messages.size()) + return; + + AndroidMegaChatMessage m = messages.get(positionInMessages); + if (adapter.isMultipleSelect() || m == null || m.isUploading() || m.getMessage().getStatus() == MegaChatMessage.STATUS_SERVER_REJECTED || m.getMessage().getStatus() == MegaChatMessage.STATUS_SENDING_MANUAL) + return; + + int type = m.getMessage().getType(); + switch (type) { + case MegaChatMessage.TYPE_NODE_ATTACHMENT: + showNodeAttachmentBottomSheet(m, positionInMessages); + break; + case MegaChatMessage.TYPE_CONTACT_ATTACHMENT: + showContactAttachmentBottomSheet(m, positionInMessages); + break; + case MegaChatMessage.TYPE_VOICE_CLIP: + case MegaChatMessage.TYPE_NORMAL: + showGeneralChatMessageBottomSheet(m, positionInMessages); + break; + case MegaChatMessage.TYPE_CONTAINS_META: + MegaChatContainsMeta meta = m.getMessage().getContainsMeta(); + if (meta == null || meta.getType() == MegaChatContainsMeta.CONTAINS_META_INVALID) + return; + if (meta.getType() == MegaChatContainsMeta.CONTAINS_META_RICH_PREVIEW || meta.getType() == MegaChatContainsMeta.CONTAINS_META_GEOLOCATION) { + showGeneralChatMessageBottomSheet(m, positionInMessages); + } + break; + } + } + public void itemClick(int positionInAdapter, int [] screenPosition) { int positionInMessages = positionInAdapter-1; @@ -4359,17 +4429,6 @@ public void itemClick(int positionInAdapter, int [] screenPosition) { } } } - -// adapter.toggleSelection(positionInAdapter); - -// List messages = adapter.getSelectedMessages(); -// if (messages.size() > 0) { -// updateActionModeTitle(); -//// adapter.notifyDataSetChanged(); -// } -//// else { -//// hideMultipleSelect(); -//// } } }else{ if(m!=null){ @@ -4673,32 +4732,38 @@ else if(m.getMessage().getType()==MegaChatMessage.TYPE_CONTACT_ATTACHMENT){ Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(browserIntent); - } else if(m.getMessage().getType() == MegaChatMessage.TYPE_NORMAL && m.getRichLinkMessage()!=null){ + } else if(m.getMessage().getType() == MegaChatMessage.TYPE_NORMAL ){ logDebug("TYPE_NORMAL"); AndroidMegaRichLinkMessage richLinkMessage = m.getRichLinkMessage(); - String url = richLinkMessage.getUrl(); - if(richLinkMessage.isChat()){ - loadChatLink(url); - } - else{ - if(richLinkMessage.getNode()!=null){ - if(richLinkMessage.getNode().isFile()){ - openMegaLink(url, true); - } - else{ - openMegaLink(url, false); - } + if(richLinkMessage == null){ + showGeneralChatMessageBottomSheet(m, positionInMessages); + }else{ + String url = richLinkMessage.getUrl(); + + if(richLinkMessage.isChat()){ + loadChatLink(url); } else{ - if(richLinkMessage.isFile()){ - openMegaLink(url, true); + if(richLinkMessage.getNode()!=null){ + if(richLinkMessage.getNode().isFile()){ + openMegaLink(url, true); + } + else{ + openMegaLink(url, false); + } } else{ - openMegaLink(url, false); + if(richLinkMessage.isFile()){ + openMegaLink(url, true); + } + else{ + openMegaLink(url, false); + } } } } + } } } @@ -5773,8 +5838,7 @@ else if(msg.getStatus()==MegaChatMessage.STATUS_SERVER_REJECTED){ private void disableMultiselection(){ if(adapter == null || !adapter.isMultipleSelect()) return; - clearSelections(); - hideMultipleSelect(); + finishMultiselectionMode(); } @Override @@ -6847,6 +6911,16 @@ public void showContactAttachmentBottomSheet(AndroidMegaChatMessage message, int bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); } + public void showGeneralChatMessageBottomSheet(AndroidMegaChatMessage message, int position){ + selectedPosition = position; + + if (message == null || isBottomSheetDialogShown(bottomSheetDialogFragment)) return; + + selectedMessageId = message.getMessage().getMsgId(); + bottomSheetDialogFragment = new GeneralChatMessageBottomSheet(); + bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); + } + public void removeMsgNotSent(){ logDebug("Selected position: " + selectedPosition); messages.remove(selectedPosition); @@ -7624,6 +7698,17 @@ public void onClick(DialogInterface dialog, int whichButton) { downloadConfirmationDialog.show(); } + public boolean hasMessagesRemoved(MegaChatMessage messageSelected) { + if(removedMessages != null && !removedMessages.isEmpty()){ + for(int i=0; i messagesSelected = new ArrayList<>(); + messagesSelected.add(message); + switch (view.getId()) { + case R.id.forward_layout: + ((ChatActivityLollipop) context).forwardMessages(messagesSelected); + dismissAllowingStateLoss(); + break; + + case R.id.option_select_layout: + ((ChatActivityLollipop) context).activateActionModeWithItem(positionMessage); + dismissAllowingStateLoss(); + break; + + case R.id.edit_layout: + ((ChatActivityLollipop) context).editMessage(messagesSelected); + dismissAllowingStateLoss(); + break; + + case R.id.copy_layout: + ((ChatActivityLollipop) context).copyMessage(message); + dismissAllowingStateLoss(); + break; + + case R.id.delete_layout: + ((ChatActivityLollipop) context).showConfirmationDeleteMessages(messagesSelected, chatRoom); + dismissAllowingStateLoss(); + break; + } + + mBehavior = BottomSheetBehavior.from((View) mainLayout.getParent()); + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + this.context = context; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putLong(CHAT_ID, chatId); + outState.putLong(MESSAGE_ID, messageId); + outState.putLong(POSITION_SELECTED_MESSAGE, positionMessage); + } +} diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java index 20681e1bd0e..4985be406cb 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java @@ -72,6 +72,7 @@ public class NodeAttachmentBottomSheetDialogFragment extends BottomSheetDialogFr LinearLayout optionSaveOffline; LinearLayout optionRemove; LinearLayout optionForwardLayout; + private LinearLayout optionSelect; DisplayMetrics outMetrics; @@ -83,6 +84,7 @@ public class NodeAttachmentBottomSheetDialogFragment extends BottomSheetDialogFr DatabaseHandler dbH; private int heightDisplay; + private int positionMessage; @Override public void onCreate(Bundle savedInstanceState) { @@ -103,6 +105,8 @@ public void onCreate(Bundle savedInstanceState) { messageId = savedInstanceState.getLong("messageId", -1); logDebug("Chat ID: " + chatId + ", Message ID: " + messageId); handle = savedInstanceState.getLong("handle", -1); + positionMessage = savedInstanceState.getInt(POSITION_SELECTED_MESSAGE, INVALID_POSITION); + } else{ logWarning("Bundle NULL"); @@ -110,6 +114,7 @@ public void onCreate(Bundle savedInstanceState) { if(context instanceof ChatActivityLollipop){ chatId = ((ChatActivityLollipop) context).idChat; messageId = ((ChatActivityLollipop) context).selectedMessageId; + positionMessage = ((ChatActivityLollipop) context).selectedPosition; } else if(context instanceof NodeAttachmentHistoryActivity){ chatId = ((NodeAttachmentHistoryActivity) context).chatId; @@ -156,6 +161,7 @@ public void setupDialog(final Dialog dialog, int style) { optionSaveOffline = (LinearLayout) contentView.findViewById(R.id.option_save_offline_layout); optionRemove = (LinearLayout) contentView.findViewById(R.id.option_remove_layout); optionForwardLayout = (LinearLayout) contentView.findViewById(R.id.option_forward_layout); + optionSelect = contentView.findViewById(R.id.option_select_layout); LinearLayout separatorInfo = (LinearLayout) contentView.findViewById(R.id.separator_info); LinearLayout separatorRemove = (LinearLayout) contentView.findViewById(R.id.separator_remove); @@ -181,6 +187,7 @@ public void setupDialog(final Dialog dialog, int style) { optionRemove.setOnClickListener(this); optionImport.setOnClickListener(this); optionForwardLayout.setOnClickListener(this); + optionSelect.setOnClickListener(this); if (chatC.isInAnonymousMode()) { optionSaveOffline.setVisibility(View.GONE); @@ -272,18 +279,15 @@ public void setupDialog(final Dialog dialog, int style) { separatorRemove.setVisibility(View.VISIBLE); } + if(context instanceof ChatActivityLollipop) { + optionSelect.setVisibility(View.VISIBLE); + }else{ + optionSelect.setVisibility(View.GONE); + } + dialog.setContentView(contentView); mBehavior = BottomSheetBehavior.from((View) contentView.getParent()); -// mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); -// -// if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { -// mBehavior.setPeekHeight((heightDisplay / 4) * 2); -// } -// else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){ -// mBehavior.setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO); -// } - mBehavior.setPeekHeight(UtilsModalBottomSheet.getPeekHeight(items_layout, heightDisplay, context, 81)); mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); } @@ -347,6 +351,12 @@ public void onClick(View v) { chatC.prepareMessageToForward(messageId, chatId); break; } + case R.id.option_select_layout: + if(context instanceof ChatActivityLollipop){ + ((ChatActivityLollipop)context).activateActionModeWithItem(positionMessage); + } + dismissAllowingStateLoss(); + break; case R.id.option_download_layout:{ logDebug("Download option"); if(node==null){ @@ -431,5 +441,9 @@ public void onSaveInstanceState(Bundle outState){ outState.putLong("chatId", chatId); outState.putLong("messageId", messageId); outState.putLong("handle", handle); + + if (context instanceof ChatActivityLollipop) { + outState.putLong(POSITION_SELECTED_MESSAGE, positionMessage); + } } } diff --git a/app/src/main/java/mega/privacy/android/app/utils/Constants.java b/app/src/main/java/mega/privacy/android/app/utils/Constants.java index 8dbc9ee699a..1f195c89f76 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/Constants.java +++ b/app/src/main/java/mega/privacy/android/app/utils/Constants.java @@ -442,6 +442,11 @@ public class Constants { public static final String URL_FILE_LINK = "URL_FILE_LINK"; public static final String OPEN_SCAN_QR = "OPEN_SCAN_QR"; + public static final int INVALID_POSITION = -1; + public static final int INVALID_ID = -1; + public static final String POSITION_SELECTED_MESSAGE = "POSITION_SELECTED_MESSAGE"; + public static final String MESSAGE_ID = "messageId"; + public static final String SHOW_MESSAGE_UPLOAD_STARTED = "SHOW_MESSAGE_UPLOAD_STARTED"; public static final String NUMBER_UPLOADS = "NUMBER_UPLOADS"; diff --git a/app/src/main/res/drawable-hdpi/ic_copy_grey.png b/app/src/main/res/drawable-hdpi/ic_copy_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..caa8ab90e024839711b40f8680a5a9281f293f26 GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`*>O)7$B+ol zw-LMjju;5=@N=$fY;tF{DpbAC!0S=+fqlv!-uT0%92preRtPR~2v7`kXll)jeTi>rqxjExxOY?c28t;H@Vm}#PaQ@0*yq;*XFqB2cA^kOz z?BnMjzRLb{Tc_E2&%HkI=bF2E4YDt$njUDK9d=IiqP<|5aIxfrb~Q$!)to1LWW5t~ zs*SEWT`MhVb1E#Bh-u%n^@O#<_6ynEI}Su}x?0y>oAmY}Z{4Th1LF5vjP9vi<2iY` zylrM=pVdo7how1Be9OMvt&-MOto-F?czbpEv4;ov&NK<^RSUW{iFf+XxvoJ6KOI#& za-DOMm*WbBt=`VwT24<6Uf#ZdGtzu(-{vp*HVfqbgq*V3Qj(iFdqVdVo7!K$CNI^w z8Q%3pnRTI8n953#mM6bNf6ot4RXsIP$+^CofA2~jxA(6m-E~i2AaV5O;vm{oW zNme~_`FKC)l(l;#PfotQSmoNJt%bkz4lXINRNnl6O*`mdKI;Vst0OAPsfB*mh literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_delete_msg.png b/app/src/main/res/drawable-hdpi/ic_delete_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..285930e70ea05fd1ccea70f42c01c539836eed89 GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`S-7W*V@L$& z+c3wzLk2uK-?((d7w|t)->^UG!Kv#4ccvXOtym@D)o`UuTi0o2i&Ii{n$gxvBCd6t zm~S?|Ik1>{pHBL{>hBU0*Der~*z{)Fnyi>}s~>)e>0OrHt#M_+wqpuw#CDZP>}I-9 zXz}q!rt8KT*|v#WEx%5kvgNicS9p$PJBQfv_cy&Bi4-}#YkHlnlTcRqDAsGvrYkE< zvN%k3Y6%u@YSDPIW=Fb8-Z7h1m0lt7NmtUjJ07Q%p3BWh7y0CUPw^UC{cm|G+x4Dq zTNN7Ygs-Y>?#fJB@!whG+|soDUoINIEcVddtQW9%(TqbX8hbXyOXau6IV{_%`c)!n zSy_NMtD(i(^+~^SUftOEL?-FczK8FlwWhIbWm9dLB%}R5c5a);AGj*k$p+poE4`ZZ?9UsAvIogBI~c^5J}P{FDi|2V O3=E#GelF{r5}E+MmAq~M literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_edit_msg.png b/app/src/main/res/drawable-hdpi/ic_edit_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..7c477d498d8901810efa22b62eaf752692eab76f GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`nYE{jV@L$& z+iBKZOojq&*V*F^cx@D}nRo2evFn;P6T?4fOfys3X11;CzrOUu3Clgjj_~|RF`qfJ z#(HMzc8yI>xt?(SDPw(gApf_G)8XScFHhe&{Q}P}$Mh3fD;s8%Gx~Zr8M>*j5OG*! z#I!6$i=(tvFUiUDQ%~}&hM5_Y%1l4MfBEdU)}N-G6+Tuon6G`?mYZe9e!NtChHTN@ z+@DDdf^GT2)h?-PdW3nJof{V&YGHD1=VbI^`m8IE7rIrbNB;_ zB;*%(CB!sxY;J4g35W= z5Hnr(q+xB|A-h6T$u|4w;uVi)Iefb9^?iMGaPW6~rXTXfO>$3TxRd#fj!s{9>*0#n hliWL*b~61BX;gRSwG-`qA^s5*oSv?JF6*2UngCkjqG$jB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_select_modal.png b/app/src/main/res/drawable-hdpi/ic_select_modal.png new file mode 100644 index 0000000000000000000000000000000000000000..aead82d12dc357652da14bbfc2bf7290c4ec30a4 GIT binary patch literal 1095 zcmV-N1i1T&P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91B%lKT1ONa40RR91Bme*a04fgS`~Uz0u}MThR9Fe^m)XlrQ5c6m^AwUH z8TwE{U#1d?e5J&NaEVOGKjngwqDbM+ka9s8Zjd3FzLF`*JY;;HW3SV@_u1#1eaHp* z)pORn=6A34uC@2+>iVz0Yz6xLg1`Og(+xc^1x96%biK}aNO~Rm;2Ts{Ck_o_)Md~M zBP!1Dj&^6^9DJ_Qr>aA98EhSlt}15&G! zbPZ)oL-|eY-S7ZP2cta7HU_uOPlWNHw4L{knWCCGWXx;`jn88rf=YoI`e}ZFtKdPH z3Tiq$foEo-T-KsIO$Kn1D`P;m+oIIIEVb`3aI7TfaIT!n9P((V(`3vXgx_%{P3Rbo z<(SGjoGYiIL*{!!i<8(NL%ymxhK4&~NTGvcIcAb`<$TCxsO*Mx>3NhdL8lr{hh5;& z_mmdpn2xQS%Q@>RI@D9I`FZtsx>d%+4oD~JMi?)dj_Dni6z9w@7cG1@CB*}|(ye`ybh_O;D3_srPNpa4W4yAog9ZhFJ z!^xm*1uO@38;;bh=09=loI?Yf_i3n^M9Ee#PCU9-LCphKM?Hf5@YPHU#aGt%*sd7V zO+Ba6TX+u+W~_MI&VWszUcz4ZWTuTqhWd0b)rwjByG#8 z$}!{J6X&cgcO1y&^OIvRcqerqMCAdq7&;xsejM^Ov&U2 z7Pj}yS@1M{Zqcq@)rmu?ld;ha-nLV~Z4%|yiI=Hc+6SK6|N3`V;0Fm$t_G-hxMu(W N002ovPDHLkV1iN(^c?^I literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_copy_grey.png b/app/src/main/res/drawable-mdpi/ic_copy_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0dafc6efa014596c28097c7c09ba0b8d516072 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfjKkB#F~oy6 zIbnfef{Rf+^9eq-q&gMDl4srv4pb@ZYu9V+KHsA>Xble<%vd;%i zF_W#Ul+jRIK%McUjlw?eBN`0z`2$3R9vsj)_cxNMgJbkaBDV{{&}dZE4F6yQEOZg+RsGjcI{NoCiZn zm@^!;TltP%=zGJ=F4DsMi zPLN<#HfGt!?RB#Dq3F#o^WB}M1aLH5X}Hq#MIeZKI(z1iGs>U-bN8PRt(n%q%f5`UEEr-_dostnUj-Os6 z^~A^Ral6)j=2$kPhvF{P1Va_>kCJ>r-WQlQG>4EgmCNf)`d@5p-KZq>V%2H|!-5pyiIN-J1WptLxE-GM@WaVOQ=Zrf63iWe&3Srr n{68;hde$m?M|*Kkq97B)4b_z|($C~NfjsQ#>gTe~DWM4ff8BWv literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_edit_msg.png b/app/src/main/res/drawable-mdpi/ic_edit_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..470ace10c9c9d08c8926aad6ceac02e9e496ac6d GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfUo%3{Y4DsMi zPLN=Awq^OzD0kuDbI!DyNi0uT8a~Z*$YDHU-}pmOAeo^^mqBtK;}NF-;j0Z_iWTZu zpB~m!v*@m1+x1Xk?)!!xhGxnhTN$Q5G;V0CKa$3%Z00DF^n>SrgEK$#MllX1UJv%9 zh#Adim|3|`Jhk9u*Hk*jG~wX_4%UkX4pSZ~9Bt8AaH7CTEFj0ij(bItg&y~cG>a2V zIX@fTaIi{t@NI}>_{7K~FgGee>O!Vi38RYLriWDy9~~5)xlKBLROhg&p_ZMGGXq1B WpvFp(|H*bBA9}j_xvX#WBQ# z_wJOv*`kgj?(^p>cwER3IHJ}X_k<=FakO=gyQ_{ol1M=L6&I7xrw&9}0YF zjB1gb(cl@;==Rks;ez0c{5dvHLv(?UD7wx(ZQ zvRph}{La}MbqslFlaum}teSeFzFR8F^ySaa=gJZ%Zd|*rmcP9#BKx`M^7-XLF-NsK zxSwUM{c2sooV!WNJi&ZV!l!GkIP;ID6vK9hTJ}Bv#pK2|w`vKVj|-#}D^6v1}H2x+rpTYT;A1?Y3->12Suw ztnCi*8JrBXV3bS$o@lxKd$R6wVA!m?^I+btTS;#+CSR{*`E{EuWq+znYv;1Uy+RiE u^uHWWHOeoP*Eqk^{o;bj51#(^|0@2%Iwv*w`PXbvg7S3rb6Mw<&;$VC@G@)w literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_copy_grey.png b/app/src/main/res/drawable-xhdpi/ic_copy_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f0f20416648de7852275bb42ad5e9dd5490a9f GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?oyXWcR7?Q#I zHqzFc#ZbW3-r>)Yb8gbPN3PW?-uR)uCU=ca?v|amqCW6*{Nr=H;8krM`0>ao^9PQ3 zl{?R#OZ$HBA>SV5nJSYjPoCl1ef@Q*(M{nQojLpY{xWXhUE}&}%1ZVbA2{wX#ivf* z`?#mUvYtt&s#omV-bMASHDX^PcNHHwC0G*e@;-EJ!b80e41X$mk6b%DsZn;(>eaUz z8j}y4NSRuhl)H6-weFXtyWX%Zk~+lr3M6w^2_?u&yV?GKy;5kwIipnfhPhs|t*%PHC|Yn^B;@aCV?uk585|b-5&6*W6gB0F2&*1?oJLKu&7?Q#I zHsZA3VFQ7ZsJ`AETgv}+G5=xzBOvrgbk0Mjw-Xa=1iND<`u>sdc8QALmihMP%$vQB zk6B7TYp_h*4g6c7F_-2Q#}-G7rclT`S9653_b zJtM^ze^z9iWZ-(_N&QA+t&N_dFRcGxvNS(Y^Zw2@=|9fCsvE>44hY3O`5^sW=eoCH zq{IJ@-(GCL%j@0ZW%uO8{rLIQI!?cD^uL#&l9s^nI)^bL!g)d3+6jHh6B~jAb3Q!? z)KLg`;r?`$Dadt;lE2^vl_Vddt)Xe}%nr1&eBUhH@|kCi`)$pMuyo!jqg)i zQkdtdTK?X%=BiRC!=wzQs0r@-o~RqD{Xg!ww&B@6j{HE@Sq++>6nH-A<|lb^XFfT+ z^3$|RhACdhJ}T|g_-W%Vryh~eW~paq=I&k?zFRqTYXDcJq3hh}oomIo12|i^2|jP# z<5KF|+M&d#HBs`@T9=gjN3<$;{J8wtsZ49p^O@#lVXSE<)Bo_c7>I>!VhB65LyPCk z6R}tO?uh6gB0F2&*1?oEBAD949Q@9 zJKfuh#ZaK_IQxzZlQk+B9o=Q`D^)S&8>$!UbI7@FKb({H_P;*U++}Y=tX8Ucv39Ac zto*glD`CdXGi{{@tP*55@I|oyD_}3v+B|>3KkcOEAM*|c1wRlu;NM|;L@=rMhm%Wh z6jMw6n~8Esa=L-e4{{jp?F>k26|i5PTfXVS^bh=vQQI3!^LH+3V3}9&UM?{q$jgE2 zKij?Y44b#_d3v@)t$4{^@g-`1+7sq)ca2Wy%gXv-a#19p{kn*S`zLELjvmkR%Vq~Z zX6rf_tg_u9@W&k{aSx53f?joIEal4Ac|#hPyYMx7KiOF*EBQ0+?Vi<>wE{%v328E2 zeHhFlW>IsNrE%e>oL#2N?>HEL5a|@n;Ia#Qz{M`HaN)n4T@06`Glb?T2{ooY)KvKC ze(la?#U0W@jN89&&%bDXzuiN01(*NKyZZu<)NuS`cs^h7xL~DI^z>xuWn4T5g@3Vb qv=6&*Z4L7^#@7wtp!(r2`-5@vC(G`DSqpE1qQcYF&t;ucLK6VkZ@yvx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_select_modal.png b/app/src/main/res/drawable-xhdpi/ic_select_modal.png new file mode 100644 index 0000000000000000000000000000000000000000..0000a13de5eb363d1f377f7a39ca1aa3b087b852 GIT binary patch literal 1457 zcmV;i1y1^jP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NH8%ab#RA>e5ncIuiRTRf(x>$lq z6c&UJV*^8y6-osqDv0`0y-Y;;kO)eDQ!gV#p!v{1uUWwaf<`FbFoa_cS$4sYDKKxN z-_M!f`mxUX?ejaon@^oDeBEoWz4yB8y?=Y}Gfqs5F`j|{_Y6#SnEtb}^|H8LTX5;~My(_-ZtuIx~mE)8b9B3RbJrW|0X=t>jthkBWE1QaoDPy3$CJd&L<1 zJ?Xv`4~tjCyJA()_ZRVmh@C0XuLvu(PCO@;qDlg6nYV)#X8n+ON+f`$VC-eFCvFt| zfj|;~_MsS+fPJvu0Q>t>@prFmDc{ieGvbWsx74)i*Tg@?B>b|)4$KCpjR!M7C*rVc zU=!Q;@E``iGQMr1Yz20zC(CMJx!E>d&b-;S@;?cS;ug^+m*DZ8+)CC-?E_#Lxu`t8 zQ{{?RJR}((`0^kYzqRtVVF~a&@XN-sexHwOFT5)g@l^9x@#VJ?u@F-M!xGpOdUDR+ z3c9A%Z5p^;{79SJBX4a7uj z14t#nRqxSLg^#N(Hpl?8ZeWWXu}Y%6DILB&Vr==B?mMmb70JA9+TuAG*e^2cfG5Hs z@oy?6h`wWN$pqF0gIru~z(ek!xH>b!w)kAUn$^pS=sU(%DS@Rj4{EbnO?7)h$^+ul zu5n)SPp)1jM&F$$z&mN5n7Rguu6rpQ3BEKWK?AJ*Hx0hOX6&%^TqqB z%s9o5lD~HKDq{3q_>GV{g<{t1;S^qR$~PpFjA4%i5;RKoE9fHhR{h8>u2r{~O zj!RV;+#C4zh_NLTxULc2F*CZwTS>^5rSs1MWOQx7kA7QC><|;N4S=&c1wNh^T?1G6 z3DM88Ywn9UV6SuH)H&<>gTp^ufcwN%PJdEz&(-_lumlL^Ez#OBMDU|#by0m_TkMp9 zjn2qz$*d~n0Q?g9240E_ULhHyQ$hDIs`$W{2eA-S0mBlYV;sb4u&n-FL%%M8ZG70u zV>>mO==<;;O=l%rhL7eoQ>bJs&4?GpE`B4(Ob&uSAU>08R)jB9TnoCqT9yEv?C&wt z`G}Pt*PIZGA{SK`n39oC#2EZB={P)wVpIYQ{8{8iga%fEqm?cAt5|kAsd*?kZP@Q0 zi1DsDE8SOODXJuZ0k+IK(I-LhtPJlTeqsG3-W98WU>V1L=d_96BEcUOM^4P7I#mUI zd8GMQrysklN>Ajr<_tUlM?mKO8(<(C00000 LNkvXXu0mjfW@oFy literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_copy_grey.png b/app/src/main/res/drawable-xxhdpi/ic_copy_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..e6460677cae751f5cb8f3546d73870ff14d23269 GIT binary patch literal 821 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(<^v49!D1}U6i==Pq0foZ;{i(^Oy za~oeMab3Z|6R{_ zdCSwcSEuEtRjvA0o>!f|?0LEE=Ig%`Q;u{A8Za?(_Ec@@t-ZE;*7EO~{Z^&rKNoSW zUm|_U`R*yj@6Q>0gP;FiGIfIAmo2s4^VfUY+un};Y4Prb=m$Oz!-ogvs$SB0DJXwS zPtQU6$(=B7KE0s*&WtBnGp5g(lgTNtOP0$cnU8^+FIwlaROuG?N7qgz{PVGhnzv?y zY*^0uqRrY(n`8>^I!Y?E&0sWg;9)$LBY1?NNcQNARa2j>DKgJ>*jQw)a^`d_>)E>| z%O#Z5%aXbc?y0c;HeAWcvD_s|eH%lI&>QjXW()duzum*uxP(*V^c~;giR(_??bBFb zH?{fIm5XvpoKGjI*u7jP=~y4fd$Rjh$!Sr6ed?kfmdrtoQ>+yXmk2R*DokZsVYp-x zgK1NU)Pi~s>mP@gPvPK*nebqpl!AFfE*y}xbN2N8 zw;F;xy&o(WSGfNFUB)IAn?Th&x6H0DDOzIHQ0(_9s@bLeKo{deUz=KvhmxCC9ba-n uWUWGbjk02v!pG#GD{Z362`o=o>KIQ>aJXhVH82U3WIbK|T-G@yGywox3`em5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_msg.png b/app/src/main/res/drawable-xxhdpi/ic_delete_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..67dcd72032859a0c03f00ebba3ddd23c4002d47e GIT binary patch literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(<^v49!D1}U6i==Pq0foZj;i(^Oy z(*EB(b>e&`?VdMxe@N#fJ}o!7tEJc|;gIQaN%7eF zrP=F`<((_P|2_7~zG+(4>uT>;`|E|hxs!09l}Tg)1FMDuBUeBJg1Nvq!L+t=Q;pr< zn0fR1ZvD&O$iH(T2UKR)CZ7H%y3ZF2oUAuqmtyj8=rIjQzU)<`7%wPY%?u&cheYSgNf5nFGQM=pSY;bkOy}0%EKX(4gQ)l!| z)4!Lvq(tA}z3OFE-B)Yn zyt-=nKYiMs*Ve~1r{?*(Jr`%G@_Ef>To}P2)b~1SP2q&YA{?yA6N?_CFm^efYMsox zf3 zIrHVakbN(gu)MWmW7TkA z#^-@XZ!8&=%Xm(|4fQ+mD)041L7u()wYM@n*V(9c=B?7lS@z4L*_rrug=+Dsbxr%< zBwuvMC_wL=Pr|;Uf&$%ZtBz_kehy4Z5^Fp(uh=T7DI%<*sOv#OO}4|bf;EgY4{v1I zqJDHi^vsB`2F}F9&Y4FUgK`xfJeYn!SY)!qQS&GNkFDq2qR*Nb36zP@RS>t>+HmK= z6^5c#W77%Nb2J+pn)6C~9EFo7<%zD&?DD;(%XeW*BVP*7mZEZhz5;<+4hIfyvO46@ z8CV+mcU>s=3Qie^Oa{~D#f(=({4y6jEAV2HJ$3fN+L-(k3@_a~Z8DN@gNhvqmXHza-U+WTIN zUHB4PQSV~jCvxl#vnv8SQVZ6l+^Ig9+xk)b?x)I&?SIdk07Lb||F-f;3`X)x8`}!9 oY)zl-=MeKijXp?BstNsI)IMD!$M)jgJWzu1boFyt=akR{02hePx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS@Gf6~2RCodHn%i#`RTRd#;|08e zBGlTJOQS)B1T`@VeSsIm7&Iy+DxwMgOKLD665@lHNHC`HflH#%5Wt8C=WyTdL?LzB3dZU7n{ZLVl}v;M!n(z zai4fzEEQ!Zs7>B45!=Oa1xIpK_700X#p4Cr9x_)}f@Z6SWn$}4Pvzd6kohk0Skc`S zogmhd72<-T9gVcNUwYd_)~-TOWP+GRtHqlN@vM3ym(+B#$n>ijMI~slJXtQr+Pf^> zBjQn!UFuiyFOl5~u%q29P7~Sb=7@8}31SScNol*dD@Hk_6C03c1BX|Ni#&ytoF{uw zWC!XN^KRE159W#Ngb#@^BXy7Twu(HEs!&UUZdH$K#0M($jB~ri9U`No2r#-j#HYnd zqw1t|Hi#F*+^9A|IJHg;C5K_o6J&QeE0%%VWt82L5gdwzB)u)>9!b?6*j`X)408|c zBJYY{ipjd->DD60Hq(|V`=H3$W#JA9N#=J}Wk^;{f>@9{0!B}%?j7-TK&R*`M(8(U zn|PaJe5T|il+hH8ya{TT<(EWnIOF6-@uFC75d2yp z3kL65@VX6o8KS#nbggIw@S)_#a&(H%)?!VJEuNiFf_QQkj!4*NRTM0{MfTnhtwoft zg?xX`1ANAJ3tp@@4BK?$>FGl1{%GpHtXtmq)`*r5Ur4@FtOlO%RzLmrLnFv*RQ6{K ze0o`I>GyE>AJ&mihKq8QJm0-ogCmGt!b0??0;_R^>>24iZ0MboY>QaS3$f?B7i%y< zlMN>k<=Ni(?7+b;7K^3$l%dQo9~(qoLTiENyBBNlgSXcx_7f^kg+-RnofpMQpBEmH z4x=ZF^AfBVFJvpKD0{wpu?9y_75xu2VOwT<=A=7TTqU-M9@NbzC~jv%iQze!cX_l5%P zm~!a_kuQG8ESn!oen>15RzKMHVhtw9`x>SO8L8i%JL!K3NNkH(6G8HpbesxfGU#5=Y9+9?Xz&q~{tBKGW!Hw> z7i%y1=~2l&GV00%zT&e5 zFUEe|N(tI0t*eGrw&)H+UP*LZ3R_Z2+#@R+9qPdPhbv+uMi=AVnt=+2-uHC#4VTfoIhT57Poi zir=k@L}q0*sY|X*ffGp~b0u-j8QEwm;+yqw@sXH_Er^%|VW7*gGFEb4G#SRD4fup_ z_-Mh4X_#)z6r%ydkacJVg$#JFY7_U0S2J}ZRh+1f-xRI26QA~rySS-@*b#)CZQ>=z zV3Xu8I&~u<#ut3DKn%nZh1d~$&MNUy(ZV$e-xrA^ z3V9NQ!80O>@?JGaQoBf!@^1fXQWIEnm{y)|7~d|k6htF$f-ubX%y*rc6b$eYj8WDj zo)zl>cB^%wx8~pjXSPqd$%ASVg#E+f9Fgxm7Ff6+6G`NcVp*e!QNuasIgvg+@K8Sx zb5H$h6GTS`#a7Wv66+M-rJochi6rW>SOhqrE)_dP4uSOLf#hrut9nQw!(NAJ`2-bK zir!%?t$RrYl6pYw7W>3JAjzyRyp{9fX}w!XJPb^$tzy*=rq%={-YnM5axvB(4j&PZ zil;>ue?EI8Pnqe$DB=4zJ0sJ1uE+z40lO6oa@1KTWH2_Mkd36ST{o-6m?xXGDdWmW z-7K~$hevjxX0h7i#TB*f71;^*iRZ;q zQLhB0gJ8RE5t~F#zL2$xoeKhXGss%PZ&vV>*dyjW9;itJjSMt0(8xd|1C0#)A2aYT XXMkES#rmqq00000NkvXXu0mjf5oZ2o literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_copy_grey.png b/app/src/main/res/drawable-xxxhdpi/ic_copy_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..08e09c7d5a35f80e33f6e1802ac27993c72783b7 GIT binary patch literal 1146 zcmV-=1cm#FP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91V4wp41ONa40RR91U;qFB0I4%yP5=M{Nj8pkg2>27+dqi;;n$+;=cEFw+lVEEou4ZYUUCC}?0L1_pv6h>E@kE_dfTv;BH& zx_fqBL!q}*T~qyj)7`UEce}Hhn-#DER=^5ORe^mO13!U2S72vh8?eK$lI;gh_5t=D z_7e6DHrl2DIDk>!gk6Ox{e~3h3xYp|y&3W(L&m14DUE(xu#2!(#An`|eV1ULU>{+l zYpDQkVPq7)#l{Qb0&J8JQUGwxzYS~Y%11hT+Gru90Jwpnp58OuHh&l;g#8Ixo=fm) z#f1>=z_>4rqNM;hHj0t#BsnSw2Y2%B{NJ+s{Ck}}ePF2qDKlVc5If{6U;z2rh4eIl z5E=7>7(l*uAw3NsM8^Ce29U2^NKXR@kug6=%KL!)=>PBOdcrPUN&?_>rxxl7hmZ%K zZP6~ns@4-qEkP823w900M+L34qe$c~tlG1qQUG}6pJ_$)fAXmM?5G3)uK6ruw%n>g zC;@;4{FauTt_z_Ggc1N;Pv}C9*Gm9!J)s9ciQCX+^@In=?`uzv(T5%-1e`BNblpzy z&vq#>1G1B=+;I+J&|6dk=%+k51Ow;?z@vjgFo5L%28Cb%X#fU;U;ya=27zDz8h~&J z2A~57gqEgJOd=T;%nOm zpaBT?Hh^$RwSWeo=@ss60Gg!SghQJFgvzN0GXPz)&>jX5DyJUI05r|K2WWb=@9h~- znUMh)KxGBA(|Zrl^lIPROHgG-24Db{70^!aJwVf|eQz&8l^Gd;0aR8%JH7V+O|SO7 zy##5Ds?31zT8{Qs6iAr?pOt|2)f7kp@Ky_HZ$*I=0Iw17w-R)XeXHyN{AP+*Yboj%m`Xi?4=FiTsg(dQ zm3ji76mzUnOZh%wDPV^)r{*T?c*pUvzsy?66PWy{z7zl^whiMaN}Ym*-_9XsjmB~D z%BT3hauTQ^MD4G!%F$_eAKq&6Zilm)YreefppTmsumV=V3Rr>JAAl%Uy)4)YF#rGn M07*qoM6N<$f|o4Yt^fc4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_msg.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9e591cbb6573767530a40ffd729ab5f2855681 GIT binary patch literal 1196 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(;}uz(rC1}R)=9Ph`#z#``9;uuoF z_;!x}v`Y>G?bb)8<{#j-d#==HKH>BWC;mm;d(WKVz0&>S@==C;k(?W~0}Kr~mw1Gi zZ+$=Acd~<3=>6#>v;Jg0H)v$wXdn_D;9z=v^RqesX7TlIA%dl$T~m|#b_K5O{X6gM z{k7|#U9GZ;f2Odo&3^9v;4>n-#ina~HT&S{z$SF-!|MuV4~;E80)Mhz+u5wzU$A~7)a__yrVon5DFt@#$u*zrAlb-aB4^!6Fyf)}{wE1Ri36#1i;qRM%Y z^@{rX+^?O??{#}UB$)P}ObpsHcU@gw-ZSQ!87wOvFX+1DyU&vUdqU!MpQma6ChS*c zh>brUq1F_?BlYE}^$QM zm>~S;36qoe3Eq92j0;tsaNO@{*eF!gn(uXBsZfpmqD?>er+<<(Qhm+(l~vu=@cLJY z-Fq%fkG@`1%%tHlv1Q$wzUi)ewiWMrS^QazHQ>TQ6^ShHb#-#*&C{7~tnKX?8JD*T#!)h%NCe=C2Z zE#}7GHfJ)5A5Pbj^f1s)F!|%7GDAdwr;bhN45z@?iW=cy<8wcPT2{tg$UFbO&Sg&d zvt@TmO~seir(F0ySLDvUJ^M0W8GJZ+Mo=NEtnb&)L#2O>?aQj%)mS(f%l17`Tywam zE1FMI{-b!mux3nx_YEi#4`GfxS1>beFj+djXGlD>>OLsaOSkMKudjG--KMj9xr=+~svSm0pB>+}`gnJ@Y0AtbtKF-lIqeKj xe~@&EW;%NA^kzN7oYZT-1Z;@Uo~du{Yh*p z`-eL}{{D6TIGOwYlGFe4mK1kypU0f=r#orl?)eA)YlmdUF<&^6{^PaQuadxi#*D}D z6EFL&WeCfT-Ep}z`@#QJmg4@5HtH*iU3K<-Uj3+eZ5)$?(0y-)!;h*t9QP^G zWtNWhrfUy zT{*M%=g&Plx{eP&Sn_Bywj9|mbU;z`)5Pw;tY_0@EzjRu-{7pJrenu`(YWEm4_oF6 z-{$%UOjB+JobH=b+#k;H!Ifz(GsC_E&+krSl(|^(e)GrYGJLz=obcSv#qc92_RV&V z2fV%IO2_8xe*Ng2KgU*PhPp{{8`erPd=Ou7I{rG>gBfg<>g=<2zR$WjQOuNyVV_9c zruDK6AEq}v=g(&QFir1V?CPDdWhxWG7!FKd#rj){kzqfBjeY22=c-`r)8dISoUc5{?}J89d5;)){qn9fh`B>8FY)K TK8N^h040AW(Z|k>y6RPa~9R8AB9UW{$g=B;P0DvgY z7VEt0#61b_-(6WH(WqSmUUs&z05pxtzTe$o1Kn{!_Vxgc-C7U;q?`kQ_aeKJ*%bgF zPz3}C>^g9-R|Wd_lvpM3zj`ltPv6%801%eNVa;7)fFH}*Ij&O@g9n^G-JTbhY5?iG zYx#GzT4fDO1t338-t-Sr)BD;0$$zyU|W1~6jsw&7HTqbC6_^jeMwkq9h zuVMO7Fzaqt-*TXD4@zrrIMM`d?ftOgItTBaB(v<~U3ug}dbbKw&+6Xka-}G$e!uZ} z!%49WO1}WB!(Yph0w(q$!e}VpnrKPLV$lK%$uZ$vY0+~jO~$Wm`nTZA5w2I4&wmXJ zyThw+N7vf|`bM0?x=<|Jp;~^JFT!w)v{i22Pm7WO`3G&RJ3MkY69J! zD}a(tdt?WO1UEm=r^2M!x|zkaKH0G&c^_;16?vjlo4BMyAT8;5muqFi9uO%)rrJmJaFT_9avwDxwYpwii8%bc zHk8+fx8f@uzC5sxWv43|=kg9m8_m_suw_WJUV0o8SyfBN_(<+(LBA@R=_SIEhdr)e zV+O!YkvB!)r1z^80H0qrSXFOdomWpZHtLHbNest<@t6iFJtJMXsj8m%YKk$;Y%Iw| z1hReO?<9w}{5qjaO%WZPI#pqLUk>ON8~KsU`jCV{{!*r0GKRSP02gn?x26lVz0jcG zZpJ=clS(yO-On-gU$s9Y45<<>S`3VfxjMb+b%{&FeN1*V_ zi_THcxVDVuDFEdxhQWNHxSY7am}BG)brp=k5tdrykskl^BzwROx`ce=gRFS-dDWnG zUHQ;Jr(VM}<+LKPi87_;LWgEvdWnz+R0pS}_f-enW%i}=h=-4uq%7?gcr$3?B!~+n zN7Z+r@gUa*r%JcNo2KO{+LwPax+@pR!8@TWUo=yk^ARgbIUWi^O+9+)L{`2Xtn)#{ zO_uiNv{gfO%g&bL+Y)8LV(_`|n!a^8h4L$y+)-cSuj@@4ZqiikBUDHW#G(w0AP8se zAhB$|h1h*BQOV;07K_TPeBu7o*I)$$U{>_7iRWv@iu$My`PF?5Oks@2al`(hqqiXL z^s>h0!yb4p`;SafUMd-R=&1kO>$%|jvTVKcLGZyD2f3@i=<`9rI$}#-CaxhNjkRpz zRxWtN86K66e5B#$O_7iKAUv>?;g)_bnaq0!(p7Zz5yUYRtF2WVV&*4}BAwAM|9i9oLTGcKz7X)rrj z1NpnlqsA9%z?VM^@^@s5sQNo-rjNAlw4ZG=DM@_nL`1w5FY7bXy=7Ph82SEJv<9>( zAUQwJRN-cr6~ZxS%jYBrBWlns7?~InNvZZvdE%rDiG8|ZQVg~;K!|NapWfAW;h&ap zUs3PB^uVJnuAw>uOIzvbn)_BNV69@fq>Tz4^7c2h{c!SS%8SWAZV%^};uF2L6SJzyTG z*B^#joi)J40|(z{>%ovQac^E+=w3*CQ$7FrB+l%UYlB7NC(aG`0e)Utfd6!hdCjQ8 zGmSBVe>^UDjNHDz(rxqo zOg~p^EVHvcO-eJ$$1<0Y9*AvN&iaWnNq9nPwE2s(p&6mCyW z%-#zw3p}olPFzvHe1mjfVt6w-RtYlM<<#b?id%VU+z~&f0*n`3d+JhrNpL32B*12U zz4mLwVw#}o^ggl!^lm2lUXPvo?oHe{ftW_`OZI8F6-)sWKJlAFGp#%pxTvjq6}_7p zPFv}b=;?1keWDVceeDcqY+~MTd%p#Qs%K61wF`in^3CKX3HuOBjjvZW_K#b7Yf8Ei zc^5ZTC{LxH5uxgMIRc=PvvAD|dTDYhg%pxOzsam;SwW(^#i68vTOkBSaC~%cM#c0| zM*Z#SsSMI((Jqzk8{%|w2`jP+U#j7^Wj8V+F{5%*Ue@625vg!|yn~Qk&0mNCpj-s} zvL&4@`8si^ncI!UMQP1pU2nb66H*bPovb`CE99(rVKprC72y0!jl4sRXw z&vcnt^<>SWYQ2Kq@iGqLX-b)bUR=5u!zMnmH)D$EF}*+7@f_2$S;^TgA-bkGI0VmEHS`2$Pff@#C`mpQEDAG|$j35rMnV`1#?ygjyPI!)`8g^1C z&|Q+Ar(mj^6>A>;Ie?a{K#h98@JhMU5q;V5$x!ks-YTdCGV7A2nruYu8BPJt$Rup2 zdLbB+@vUYdRGN_m%xqwRC21`TQ}Na89z0o{F-zt6HBwI@55fFlsWkK1U(eSzIbCNz zf}3+kNxIEjW&}dYT$d958Bx_9`k0fbRB)*m&2K3J(B_o~mP{|yx>ozO#hbETG> zM_D}R^0#VohI<9yqAjgd?ESbt<}d}eI{ccz66|}YpJxi+kj_Fts?0}w$hw{bz;eHE zw4&I7h-bEy%;jNy)=#e*^CIxL{Np%!jFypDZmI+Av*Y*l5v52lSw8^Nmp#R8NuuzC zB+t=)1GZhUC6#pL9TgaXlvn?$wAymUuuK^GU@{*2we-@xP8$;I#boJ*Enq+2jYKgv zZ)2=eB_^F{wP)mXY^>>$%^L=3CqC+O=ywutd&)zq!d=mHuoU|*>Je+aUkl2rMvbs( zIL?-4yHQ`i6&UR|r21~DpFzi}BuBjy&H8K#OUOIk{v;{24O>~=pM!;Z>_<6o7j}BK zjYhG)9g2_J=J5Iu(-@fj*?p`^j%o1SW{G59S-(XhDXxy6wjV?00C(TR^gW!KYBnD}tl62$V+F^ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml b/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml index 5c11f54cc25..b55dfe5c19a 100644 --- a/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml +++ b/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml @@ -138,6 +138,43 @@ android:orientation="vertical" android:background="@color/divider_upgrade_account"/> + + + + + + + + + + Always save to this location? Attach from… + Select Message + From f73a39622a146e74476d99c81ae77061aa19435a Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Wed, 22 Apr 2020 13:05:59 +0200 Subject: [PATCH 002/100] Added new elements to show multi-selection --- .../chatAdapters/MegaChatLollipopAdapter.java | 819 +++--------------- .../res/drawable-hdpi/ic_select_chatroom.png | Bin 0 -> 840 bytes .../drawable-hdpi/ic_unselect_chatroom.png | Bin 0 -> 1041 bytes .../res/drawable-mdpi/ic_select_chatroom.png | Bin 0 -> 606 bytes .../drawable-mdpi/ic_unselect_chatroom.png | Bin 0 -> 699 bytes .../res/drawable-xhdpi/ic_select_chatroom.png | Bin 0 -> 1071 bytes .../drawable-xhdpi/ic_unselect_chatroom.png | Bin 0 -> 1362 bytes .../drawable-xxhdpi/ic_select_chatroom.png | Bin 0 -> 1558 bytes .../drawable-xxhdpi/ic_unselect_chatroom.png | Bin 0 -> 2272 bytes .../drawable-xxxhdpi/ic_select_chatroom.png | Bin 0 -> 2097 bytes .../drawable-xxxhdpi/ic_unselect_chatroom.png | Bin 0 -> 2970 bytes app/src/main/res/layout/item_message_chat.xml | 47 +- 12 files changed, 173 insertions(+), 693 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_select_chatroom.png create mode 100644 app/src/main/res/drawable-hdpi/ic_unselect_chatroom.png create mode 100644 app/src/main/res/drawable-mdpi/ic_select_chatroom.png create mode 100644 app/src/main/res/drawable-mdpi/ic_unselect_chatroom.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_select_chatroom.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_unselect_chatroom.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_select_chatroom.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_unselect_chatroom.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_select_chatroom.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_unselect_chatroom.png diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index ea2b7a89a61..2e018d62978 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -578,6 +578,8 @@ public ViewHolderMessageChat(View view) { // TextView meText; TextView timeOwnText; RelativeLayout contentOwnMessageLayout; + private RelativeLayout ownMessageSelectLayout; + private ImageView ownMessageSelectIcon; private EmojiTextView contentOwnMessageText; //Own rich links @@ -704,6 +706,8 @@ public ViewHolderMessageChat(View view) { RoundedImageView contactImageView; RelativeLayout contentContactMessageLayout; + private RelativeLayout contactMessageSelectLayout; + private ImageView contactMessageSelectIcon; private EmojiTextView contentContactMessageText; RoundedImageView contentContactMessageThumbLand; @@ -848,6 +852,10 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType holder.previewFrameLand = v.findViewById(R.id.preview_frame_landscape); holder.contentOwnMessageLayout = v.findViewById(R.id.content_own_message_layout); + holder.ownMessageSelectLayout = v.findViewById(R.id.own_message_select_layout); + holder.ownMessageSelectIcon = v.findViewById(R.id.own_message_select_icon); + holder.ownMessageSelectLayout.setVisibility(View.GONE); + holder.contentOwnMessageText = v.findViewById(R.id.content_own_message_text); holder.contentOwnMessageText.setNeccessaryShortCode(false); @@ -1034,6 +1042,10 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType holder.nameContactText = v.findViewById(R.id.contact_message_chat_name_text); holder.contentContactMessageLayout = v.findViewById(R.id.content_contact_message_layout); + holder.contactMessageSelectLayout = v.findViewById(R.id.contact_message_select_layout); + holder.contactMessageSelectIcon = v.findViewById(R.id.contact_message_select_icon); + holder.contactMessageSelectLayout.setVisibility(View.GONE); + holder.contentContactMessageText = v.findViewById(R.id.content_contact_message_text); holder.contentContactMessageText.setNeccessaryShortCode(false); holder.contentContactMessageThumbLand = v.findViewById(R.id.content_contact_message_thumb_landscape); @@ -1281,6 +1293,9 @@ public void onBindViewHolderUploading(RecyclerView.ViewHolder holder, int positi ((ViewHolderMessageChat) holder).itemLayout.setVisibility(View.VISIBLE); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); ((ViewHolderMessageChat) holder).itemLayout.setLayoutParams(params); + ((ViewHolderMessageChat) holder).currentPosition = position; + + ((ViewHolderMessageChat) holder).ownMessageSelectLayout.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).forwardOwnRichLinks.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).forwardOwnPortrait.setVisibility(View.GONE); @@ -1293,7 +1308,6 @@ public void onBindViewHolderUploading(RecyclerView.ViewHolder holder, int positi ((ViewHolderMessageChat) holder).forwardContactFile.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).forwardContactContact.setVisibility(View.GONE); - ((ViewHolderMessageChat) holder).currentPosition = position; ((ViewHolderMessageChat) holder).triangleIcon.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).errorUploadingContact.setVisibility(View.GONE); @@ -1502,6 +1516,9 @@ public void onBindViewHolderMessage(RecyclerView.ViewHolder holder, int position ((ViewHolderMessageChat) holder).itemLayout.setLayoutParams(paramsDefault); ((ViewHolderMessageChat) holder).currentPosition = position; + ((ViewHolderMessageChat) holder).ownMessageSelectLayout.setVisibility(View.GONE); + ((ViewHolderMessageChat) holder).contactMessageSelectLayout.setVisibility(View.GONE); + ((ViewHolderMessageChat) holder).triangleIcon.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).errorUploadingContact.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).errorUploadingFile.setVisibility(View.GONE); @@ -1889,26 +1906,6 @@ public void bindCallMessage(ViewHolderMessageChat holder, AndroidMegaChatMessage holder.ownManagementMessageText.setLayoutParams(paramsOwnManagement); ((ViewHolderMessageChat) holder).ownManagementMessageText.setText(result); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -1943,28 +1940,6 @@ public void bindCallMessage(ViewHolderMessageChat holder, AndroidMegaChatMessage paramsContactManagement.leftMargin = scaleWidthPx(MANAGEMENT_MESSAGE_CALL_PORT, outMetrics); } holder.contactManagementMessageText.setLayoutParams(paramsContactManagement); -// ((ViewHolderMessageChat) holder).nameContactText.setVisibility(View.GONE); - - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } String textToShow = ""; @@ -2178,26 +2153,6 @@ public void bindAlterParticipantsMessage(ViewHolderMessageChat holder, AndroidMe } holder.ownManagementMessageText.setLayoutParams(paramsOwnManagement); ((ViewHolderMessageChat) holder).ownManagementMessageText.setText(result); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } } else { logDebug("CONTACT Message type ALTER PARTICIPANTS"); int privilege = message.getPrivilege(); @@ -2230,27 +2185,6 @@ public void bindAlterParticipantsMessage(ViewHolderMessageChat holder, AndroidMe ((ViewHolderMessageChat) holder).nameContactText.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } - setContactMessageName(position, holder, message.getHandleOfAction(), false); String textToShow = ""; @@ -2454,27 +2388,6 @@ public void bindPrivChangeMessage(ViewHolderMessageChat holder, AndroidMegaChatM logDebug("Visible own management message!"); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - - } else { - logDebug("NOT selected"); - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } } else { logDebug("Participant privilege change!"); @@ -2505,28 +2418,6 @@ public void bindPrivChangeMessage(ViewHolderMessageChat holder, AndroidMegaChatM holder.contactManagementMessageText.setLayoutParams(paramsContactManagement); ((ViewHolderMessageChat) holder).nameContactText.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - - } else { - logDebug("NOT selected"); - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } - setContactMessageName(position, holder, message.getHandleOfAction(), false); int privilege = message.getPrivilege(); @@ -2637,10 +2528,11 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha } //Forwards element (own messages): - holder.forwardOwnRichLinks.setVisibility(View.VISIBLE); - if(isMultipleSelect()){ - holder.forwardOwnRichLinks.setOnClickListener(null); - }else{ + if (cC.isInAnonymousMode() || isMultipleSelect()) { + holder.forwardOwnRichLinks.setVisibility(View.GONE); + } + else { + holder.forwardOwnRichLinks.setVisibility(View.VISIBLE); holder.forwardOwnRichLinks.setOnClickListener(this); } @@ -2662,7 +2554,6 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha ((ViewHolderMessageChat) holder).urlOwnMessageTextrl.setBackground(ContextCompat.getDrawable(context, R.drawable.dark_background_text_rich_link)); ((ViewHolderMessageChat)holder).errorUploadingRichLink.setVisibility(View.GONE); ((ViewHolderMessageChat)holder).retryAlert.setVisibility(View.GONE); - ((ViewHolderMessageChat)holder).forwardOwnRichLinks.setVisibility(View.VISIBLE); } @@ -2675,19 +2566,6 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha holder.contentOwnMessageText.setVisibility(View.GONE); holder.urlOwnMessageLayout.setVisibility(View.VISIBLE); - //Forwards element (own messages): - if (cC.isInAnonymousMode()) { - holder.forwardOwnRichLinks.setVisibility(View.GONE); - } - else { - holder.forwardOwnRichLinks.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnRichLinks.setOnClickListener(null); - }else{ - holder.forwardOwnRichLinks.setOnClickListener(this); - } - holder.forwardOwnPortrait.setVisibility(View.GONE); holder.forwardOwnLandscape.setVisibility(View.GONE); holder.forwardOwnFile.setVisibility(View.GONE); @@ -2752,30 +2630,16 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha holder.urlOwnMessageText.setLinksClickable(false); } + checkMultiselectionMode(position, holder, true); + if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - holder.forwardOwnRichLinks.setEnabled(false); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnRichLinks.setEnabled(true); - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnRichLinks.setEnabled(true); - } - } else { - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (positionClicked != -1 && positionClicked == position) { holder.forwardOwnRichLinks.setEnabled(false); } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); holder.forwardOwnRichLinks.setEnabled(true); } } + } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -2813,17 +2677,14 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha holder.contentContactMessageVoiceClipLayout.setVisibility(View.GONE); //Forwards element (contact messages): - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardContactRichLinks.setVisibility(View.GONE); } else { holder.forwardContactRichLinks.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardContactRichLinks.setOnClickListener(null); - }else{ holder.forwardContactRichLinks.setOnClickListener(this); } + holder.forwardContactPreviewPortrait.setVisibility(View.GONE); holder.forwardContactPreviewLandscape.setVisibility(View.GONE); holder.forwardContactFile.setVisibility(View.GONE); @@ -2832,30 +2693,6 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha holder.contentContactMessageAttachLayout.setVisibility(View.GONE); holder.contentContactMessageContactLayout.setVisibility(View.GONE); - -// ((ViewHolderMessageChat)holder).contentOwnMessageLayout.setVisibility(View.GONE); -// ((ViewHolderMessageChat)holder).urlOwnMessageLayout.setVisibility(View.GONE); -// ((ViewHolderMessageChat)holder).urlOwnMessageIconAndLinkLayout.setVisibility(View.GONE); - -// ((ViewHolderMessageChat)holder).contentOwnMessageText.setVisibility(View.GONE); -// ((ViewHolderMessageChat)holder).previewFrameLand.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).contentOwnMessageThumbLand.setVisibility(View.GONE); -// ((ViewHolderMessageChat)holder).previewFramePort.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).contentOwnMessageThumbPort.setVisibility(View.GONE); - -// ((ViewHolderMessageChat) holder).gradientOwnMessageThumbPort.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).videoIconOwnMessageThumbPort.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).videoTimecontentOwnMessageThumbPort.setVisibility(View.GONE); -// -// ((ViewHolderMessageChat) holder).gradientOwnMessageThumbLand.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).videoIconOwnMessageThumbLand.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).videoTimecontentOwnMessageThumbLand.setVisibility(View.GONE); -// -// ((ViewHolderMessageChat) holder).contentOwnMessageFileLayout.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).contentOwnMessageContactLayout.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).contentContactMessageContactLayout.setVisibility(View.GONE); -// ((ViewHolderMessageChat) holder).contentContactMessageFile.setVisibility(View.GONE); - //Rick link holder.urlOwnMessageWarningButtonsLayout.setVisibility(View.GONE); holder.urlOwnMessageDisableButtonsLayout.setVisibility(View.GONE); @@ -2908,33 +2745,13 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha ((ViewHolderMessageChat) holder).urlContactMessageText.setLinksClickable(false); } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - holder.forwardContactRichLinks.setEnabled(false); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactRichLinks.setEnabled(true); + checkMultiselectionMode(position, holder, false); - } - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactRichLinks.setEnabled(true); - - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (!multipleSelect) { + if (positionClicked != -1 && positionClicked == position) { holder.forwardContactRichLinks.setEnabled(false); - } else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); holder.forwardContactRichLinks.setEnabled(true); - } } } @@ -3198,15 +3015,11 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat ((ViewHolderMessageChat) holder).pinnedLocationTitleText.setTextColor(ContextCompat.getColor(context, R.color.name_my_account)); //Forwards element (own messages): - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardOwnMessageLocation.setVisibility(View.GONE); } else { holder.forwardOwnMessageLocation.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnMessageLocation.setOnClickListener(null); - }else{ holder.forwardOwnMessageLocation.setOnClickListener(this); } } @@ -3248,30 +3061,16 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat holder.urlOwnMessageWarningButtonsLayout.setVisibility(View.GONE); holder.urlOwnMessageDisableButtonsLayout.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - holder.forwardOwnMessageLocation.setEnabled(false); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnMessageLocation.setEnabled(true); - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnMessageLocation.setEnabled(true); - } - } else { - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + checkMultiselectionMode(position, holder, true); + + if(!multipleSelect){ + if(positionClicked != -1 && positionClicked == position){ holder.forwardOwnMessageLocation.setEnabled(false); - } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); + }else{ holder.forwardOwnMessageLocation.setEnabled(true); } } + } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -3352,40 +3151,20 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat logWarning("Error getting bitmap"); } - holder.forwardContactMessageLocation.setVisibility(View.VISIBLE); - if(isMultipleSelect()){ - holder.forwardContactMessageLocation.setOnClickListener(null); - }else{ + //Forwards element (own messages): + if (cC.isInAnonymousMode() || isMultipleSelect()) { + holder.forwardContactMessageLocation.setVisibility(View.GONE); + } else { + holder.forwardContactMessageLocation.setVisibility(View.VISIBLE); holder.forwardContactMessageLocation.setOnClickListener(this); } + checkMultiselectionMode(position, holder, false); + if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - holder.forwardContactMessageLocation.setEnabled(false); - listFragment.smoothScrollToPosition(positionClicked); - } - else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactMessageLocation.setEnabled(true); - } - } - else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactMessageLocation.setEnabled(true); - } - } - else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (positionClicked != -1 && positionClicked == position) { holder.forwardContactMessageLocation.setEnabled(false); - - } - else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); + } else { holder.forwardContactMessageLocation.setEnabled(true); } } @@ -3444,17 +3223,14 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes holder.urlOwnMessageLayout.setVisibility(View.VISIBLE); //Forward element (own messages): - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardOwnRichLinks.setVisibility(View.GONE); } else { holder.forwardOwnRichLinks.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnRichLinks.setOnClickListener(null); - }else{ holder.forwardOwnRichLinks.setOnClickListener(this); } + holder.forwardOwnPortrait.setVisibility(View.GONE); holder.forwardOwnLandscape.setVisibility(View.GONE); holder.forwardOwnFile.setVisibility(View.GONE); @@ -3502,7 +3278,6 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes holder.urlOwnMessageTextrl.setBackground(ContextCompat.getDrawable(context, R.drawable.dark_background_text_rich_link)); holder.errorUploadingRichLink.setVisibility(View.GONE); holder.retryAlert.setVisibility(View.GONE); - holder.forwardOwnRichLinks.setVisibility(View.VISIBLE); } SimpleSpanBuilder ssb = formatText(context, messageContent); @@ -3547,7 +3322,6 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes ((ViewHolderMessageChat) holder).urlOwnMessageTextrl.setBackground(ContextCompat.getDrawable(context, R.drawable.dark_background_text_rich_link)); ((ViewHolderMessageChat) holder).errorUploadingRichLink.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).retryAlert.setVisibility(View.GONE); - ((ViewHolderMessageChat) holder).forwardOwnRichLinks.setVisibility(View.VISIBLE); } checkEmojiSize(messageContent, holder.urlOwnMessageText); @@ -3645,35 +3419,16 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes } } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - holder.forwardOwnRichLinks.setEnabled(false); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnRichLinks.setEnabled(true); - - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnRichLinks.setEnabled(true); + checkMultiselectionMode(position, holder, true); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if(!multipleSelect){ + if(positionClicked != -1 && positionClicked == position){ holder.forwardOwnRichLinks.setEnabled(false); - - } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); + }else{ holder.forwardOwnRichLinks.setEnabled(true); - } } + } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -3749,15 +3504,11 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes holder.urlContactMessageLayout.setVisibility(View.VISIBLE); //Forward element (contact messages): - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardContactRichLinks.setVisibility(View.GONE); } else { holder.forwardContactRichLinks.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardContactRichLinks.setOnClickListener(null); - }else{ holder.forwardContactRichLinks.setOnClickListener(this); } @@ -3865,38 +3616,16 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes } } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - holder.forwardContactRichLinks.setEnabled(false); + checkMultiselectionMode(position, holder, false); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactRichLinks.setEnabled(true); - - } - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactRichLinks.setEnabled(true); - - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if(!multipleSelect){ + if(positionClicked != -1 && positionClicked == position){ holder.forwardContactRichLinks.setEnabled(false); - - } else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); + }else{ holder.forwardContactRichLinks.setEnabled(true); - } } } - } @@ -4102,26 +3831,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa holder.contentOwnMessageText.setLinksClickable(false); } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } + checkMultiselectionMode(position, holder, true); }else if (message.isDeleted()) { logDebug("MY Message is deleted"); @@ -4205,26 +3915,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa holder.contentOwnMessageText.setLinksClickable(false); } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } + checkMultiselectionMode(position, holder, true); } } else { long userHandle = message.getUserHandle(); @@ -4312,28 +4003,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa ((ViewHolderMessageChat) holder).contentContactMessageText.setLinksClickable(false); } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - - } else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } + checkMultiselectionMode(position, holder, false); }else if (message.isDeleted()) { logDebug("Message is deleted"); @@ -4424,28 +4094,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa ((ViewHolderMessageChat) holder).contentContactMessageText.setLinksClickable(false); } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - - } else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } + checkMultiselectionMode(position, holder, false); } } } @@ -4516,17 +4165,14 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.urlOwnMessageLayout.setVisibility(View.GONE); //Forward element(own message): - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardOwnFile.setVisibility(View.GONE); } else { holder.forwardOwnFile.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnFile.setOnClickListener(null); - }else{ holder.forwardOwnFile.setOnClickListener(this); } + holder.forwardOwnPortrait.setVisibility(View.GONE); holder.forwardOwnLandscape.setVisibility(View.GONE); holder.forwardOwnRichLinks.setVisibility(View.GONE); @@ -4555,38 +4201,14 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentOwnMessageFileName.setVisibility(View.VISIBLE); holder.contentOwnMessageFileSize.setVisibility(View.VISIBLE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - holder.forwardOwnFile.setEnabled(false); - holder.forwardOwnPortrait.setEnabled(false); - holder.forwardOwnLandscape.setEnabled(false); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnFile.setEnabled(true); - holder.forwardOwnPortrait.setEnabled(true); - holder.forwardOwnLandscape.setEnabled(true); - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnFile.setEnabled(true); - holder.forwardOwnPortrait.setEnabled(true); - holder.forwardOwnLandscape.setEnabled(true); - - } - } else { - logDebug("Multiselect ON"); + checkMultiselectionMode(position, holder, true); - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (!multipleSelect) { + if (positionClicked != -1 && positionClicked == position) { holder.forwardOwnFile.setEnabled(false); holder.forwardOwnPortrait.setEnabled(false); holder.forwardOwnLandscape.setEnabled(false); } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); holder.forwardOwnFile.setEnabled(true); holder.forwardOwnPortrait.setEnabled(true); holder.forwardOwnLandscape.setEnabled(true); @@ -4702,15 +4324,11 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.transparentCoatingPortrait.setVisibility(View.GONE); holder.retryAlert.setVisibility(View.GONE); - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardOwnPortrait.setVisibility(View.GONE); } else { holder.forwardOwnPortrait.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnPortrait.setOnClickListener(null); - }else{ holder.forwardOwnPortrait.setOnClickListener(this); } holder.forwardOwnFile.setVisibility(View.GONE); @@ -4772,15 +4390,11 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.transparentCoatingLandscape.setVisibility(View.GONE); holder.retryAlert.setVisibility(View.GONE); - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardOwnLandscape.setVisibility(View.GONE); } else { holder.forwardOwnLandscape.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnLandscape.setOnClickListener(null); - }else{ holder.forwardOwnLandscape.setOnClickListener(this); } @@ -4824,7 +4438,6 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentOwnMessageFileSize.setText(getSizeString(totalSize)); - MegaNode node = nodeList.get(0); holder.contentOwnMessageFileThumb.setImageResource(MimeTypeList.typeForName(node.getName()).getIconResourceId()); if (count == 1) { @@ -4884,17 +4497,14 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentContactMessageFile.setVisibility(View.VISIBLE); //Forward element (contact messages): - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardContactFile.setVisibility(View.GONE); } else { holder.forwardContactFile.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardContactFile.setOnClickListener(null); - }else{ holder.forwardContactFile.setOnClickListener(this); } + holder.forwardContactPreviewPortrait.setVisibility(View.GONE); holder.forwardContactPreviewLandscape.setVisibility(View.GONE); holder.forwardContactRichLinks.setVisibility(View.GONE); @@ -4905,40 +4515,14 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentContactMessageFileSize.setVisibility(View.VISIBLE); holder.contentContactMessageContactLayout.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - holder.forwardContactFile.setEnabled(false); - holder.forwardContactPreviewPortrait.setEnabled(false); - holder.forwardContactPreviewLandscape.setEnabled(false); + checkMultiselectionMode(position, holder, false); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactFile.setEnabled(true); - holder.forwardContactPreviewPortrait.setEnabled(true); - holder.forwardContactPreviewLandscape.setEnabled(true); - } - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactFile.setEnabled(true); - holder.forwardContactPreviewPortrait.setEnabled(true); - holder.forwardContactPreviewLandscape.setEnabled(true); - - } - } else { - logDebug("Multiselect ON"); - - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (!multipleSelect) { + if (positionClicked != -1 && positionClicked == position) { holder.forwardContactFile.setEnabled(false); holder.forwardContactPreviewPortrait.setEnabled(false); holder.forwardContactPreviewLandscape.setEnabled(false); - } else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); holder.forwardContactFile.setEnabled(true); holder.forwardContactPreviewPortrait.setEnabled(true); holder.forwardContactPreviewLandscape.setEnabled(true); @@ -5006,17 +4590,14 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentContactMessageThumbPort.setVisibility(View.VISIBLE); - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardContactPreviewPortrait.setVisibility(View.GONE); } else { holder.forwardContactPreviewPortrait.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardContactPreviewPortrait.setOnClickListener(null); - }else{ holder.forwardContactPreviewPortrait.setOnClickListener(this); } + holder.forwardContactPreviewLandscape.setVisibility(View.GONE); holder.forwardContactFile.setVisibility(View.GONE); @@ -5062,12 +4643,14 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentContactMessageThumbLand.setVisibility(View.VISIBLE); - holder.forwardContactPreviewLandscape.setVisibility(View.VISIBLE); - if(isMultipleSelect()){ - holder.forwardContactPreviewLandscape.setOnClickListener(null); - }else{ + if (cC.isInAnonymousMode() || isMultipleSelect()) { + holder.forwardContactPreviewLandscape.setVisibility(View.GONE); + } + else { + holder.forwardContactPreviewLandscape.setVisibility(View.VISIBLE); holder.forwardContactPreviewLandscape.setOnClickListener(this); } + holder.forwardContactPreviewPortrait.setVisibility(View.GONE); holder.forwardContactFile.setVisibility(View.GONE); @@ -5347,18 +4930,9 @@ public void onStopTrackingTouch(SeekBar seekBar) { } holder.retryAlert.setVisibility(View.GONE); } - if(!multipleSelect){ - logDebug("Multiselect OFF"); - holder.contentOwnMessageVoiceClipPlay.setOnClickListener(this); - if ((positionClicked != -1) && (positionClicked == positionInAdapter)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - }else{ - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } + checkMultiselectionMode(positionInAdapter, holder, true); - }else{ - logDebug("Multiselect ON"); + if (multipleSelect) { holder.contentOwnMessageVoiceClipPlay.setOnClickListener(null); holder.contentOwnMessageVoiceClipSeekBar.setOnSeekBarChangeListener(null); holder.contentOwnMessageVoiceClipSeekBar.setEnabled(false); @@ -5369,12 +4943,8 @@ public void onStopTrackingTouch(SeekBar seekBar) { } currentMessagePlaying.setPaused(true); removeCallBacks(); } - - if (this.isItemChecked(positionInAdapter)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } + } else { + holder.contentOwnMessageVoiceClipPlay.setOnClickListener(this); } } else { @@ -5516,18 +5086,9 @@ public void onStopTrackingTouch(SeekBar seekBar) { } holder.contentContactMessageVoiceClipDuration.setVisibility(View.VISIBLE); holder.contentContactMessageVoiceClipSeekBar.setVisibility(View.VISIBLE); + checkMultiselectionMode(positionInAdapter, holder, false); - if (!multipleSelect) { - logDebug("Multiselect OFF"); - holder.contentContactMessageVoiceClipPlay.setOnClickListener(this); - if ((positionClicked != -1) && (positionClicked == positionInAdapter) ) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - - } else { - logDebug("Multiselect ON"); + if (multipleSelect) { holder.contentContactMessageVoiceClipPlay.setOnClickListener(null); holder.contentContactMessageVoiceClipSeekBar.setOnSeekBarChangeListener(null); holder.contentContactMessageVoiceClipSeekBar.setEnabled(false); @@ -5539,12 +5100,8 @@ public void onStopTrackingTouch(SeekBar seekBar) { } currentMessagePlaying.setPaused(true); removeCallBacks(); } - - if (this.isItemChecked(positionInAdapter)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } + } else { + holder.contentContactMessageVoiceClipPlay.setOnClickListener(this); } } } @@ -5610,15 +5167,11 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.retryAlert.setVisibility(View.GONE); holder.errorUploadingContact.setVisibility(View.GONE); - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardOwnContact.setVisibility(View.GONE); } else { holder.forwardOwnContact.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardOwnContact.setOnClickListener(null); - }else{ holder.forwardOwnContact.setOnClickListener(this); } } @@ -5659,31 +5212,16 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.contentOwnMessageContactThumb.setImageBitmap(bitmapDefaultAvatar); } + checkMultiselectionMode(position, holder, true); + if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - holder.forwardOwnContact.setEnabled(false); - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnContact.setEnabled(true); - } - } else { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardOwnContact.setEnabled(true); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (positionClicked != -1 && positionClicked == position) { holder.forwardOwnContact.setEnabled(false); } else { - logDebug("NOT selected"); - holder.contentOwnMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); holder.forwardOwnContact.setEnabled(true); } } + } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -5725,17 +5263,14 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.forwardContactPreviewPortrait.setVisibility(View.GONE); holder.forwardContactPreviewLandscape.setVisibility(View.GONE); - if (cC.isInAnonymousMode()) { + if (cC.isInAnonymousMode() || isMultipleSelect()) { holder.forwardContactContact.setVisibility(View.GONE); } else { holder.forwardContactContact.setVisibility(View.VISIBLE); - } - if(isMultipleSelect()){ - holder.forwardContactContact.setOnClickListener(null); - }else{ holder.forwardContactContact.setOnClickListener(this); } + holder.contentContactMessageContactThumb.setVisibility(View.VISIBLE); holder.contentContactMessageContactName.setVisibility(View.VISIBLE); holder.contentContactMessageContactEmail.setVisibility(View.VISIBLE); @@ -5775,33 +5310,13 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.contentContactMessageContactThumb.setImageBitmap(bitmap); } - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - holder.forwardContactContact.setEnabled(false); + checkMultiselectionMode(position, holder, false); - } else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactContact.setEnabled(true); - } - }else { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - holder.forwardContactContact.setEnabled(true); - - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); + if (!multipleSelect) { + if (positionClicked != -1 && positionClicked == position) { holder.forwardContactContact.setEnabled(false); - } else { - logDebug("NOT selected"); - holder.contentContactMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); holder.forwardContactContact.setEnabled(true); - } } } @@ -5866,26 +5381,6 @@ public void bindChangeTitleMessage(ViewHolderMessageChat holder, AndroidMegaChat ((ViewHolderMessageChat) holder).ownManagementMessageText.setText(result); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -5922,27 +5417,6 @@ public void bindChangeTitleMessage(ViewHolderMessageChat holder, AndroidMegaChat ((ViewHolderMessageChat) holder).nameContactText.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } - String messageContent = message.getContent(); String textToShow = String.format(context.getString(R.string.change_title_messages), toCDATA(holder.fullNameTitle), toCDATA(messageContent)); @@ -6002,26 +5476,7 @@ public void bindChatLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes ((ViewHolderMessageChat) holder).contactManagementMessageLayout.setVisibility(View.VISIBLE); ((ViewHolderMessageChat) holder).contactManagementMessageIcon.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } + checkMultiselectionMode(position, holder, false); String textToShow = ""; int messageType = message.getType(); @@ -6125,26 +5580,6 @@ public void bindTruncateMessage(ViewHolderMessageChat holder, AndroidMegaChatMes } holder.ownManagementMessageText.setLayoutParams(paramsOwnManagement); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.ownManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } } else { long userHandle = message.getUserHandle(); logDebug("Contact message!!: " + userHandle); @@ -6180,27 +5615,6 @@ public void bindTruncateMessage(ViewHolderMessageChat holder, AndroidMegaChatMes ((ViewHolderMessageChat) holder).nameContactText.setVisibility(View.GONE); - if (!multipleSelect) { - if (positionClicked != -1) { - if (positionClicked == position) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - listFragment.smoothScrollToPosition(positionClicked); - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } else { - logDebug("Multiselect ON"); - if (this.isItemChecked(position)) { - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.new_multiselect_color)); - } else { - logDebug("NOT selected"); - holder.contactManagementMessageLayout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); - } - } - String textToShow = String.format(context.getString(R.string.history_cleared_by), toCDATA(holder.fullNameTitle)); try { textToShow = textToShow.replace("[A]", ""); @@ -8267,7 +7681,7 @@ public ViewHolderMessageChat queryIfHolderNull(int pos) { return holder; } - void setInfoToShow (int position, final ViewHolderMessageChat holder, boolean ownMessage, int infotToShow, String dateText, String timeText) { + private void setInfoToShow (int position, final ViewHolderMessageChat holder, boolean ownMessage, int infotToShow, String dateText, String timeText) { if (isHolderNull(position, holder)) { return; @@ -8327,6 +7741,31 @@ void setInfoToShow (int position, final ViewHolderMessageChat holder, boolean ow } } + private void checkMultiselectionMode(int position, final ViewHolderMessageChat holder, boolean ownMessage) { + if (isHolderNull(position, holder)) + return; + + if (multipleSelect) { + if (ownMessage) { + holder.ownMessageSelectLayout.setVisibility(View.VISIBLE); + if (this.isItemChecked(position)) { + holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_select_chatroom)); + } else { + holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_unselect_chatroom)); + } + } else { + holder.contactMessageSelectLayout.setVisibility(View.VISIBLE); + if (this.isItemChecked(position)) { + holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_select_chatroom)); + } else { + holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_unselect_chatroom)); + } + } + + } else if (!multipleSelect && positionClicked != -1 && positionClicked == position) { + listFragment.smoothScrollToPosition(positionClicked); + } + } private int getAdapterItemPosition(long id) { for (int position = 0; position < messages.size(); position++) { diff --git a/app/src/main/res/drawable-hdpi/ic_select_chatroom.png b/app/src/main/res/drawable-hdpi/ic_select_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..c67aa5b8a345e26c93b7fce90088b33b924fc549 GIT binary patch literal 840 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM31Jfo?7srqY z&bKr6XNx$B9N)kBdEyg+AeM(sP7XX`SzQUq3(Lc%F|wZg%bcX#v2}sd8yC;y>{3Sq zfok7Ht-V}L5gAh#JUMVmO{)IMv7hJCzL%Ayn-}lie$hcr$9lK%=X>e*_s*<*-(Y() zRZgJxv)9YS%6C1p%vl>fOXctGT9M@&FO+|^ma+F`xWJ;*eBp)cQBhJ&FJhRV@OsD; z87X`a75J|3dUJ-EdCapNjC*t9UBtgDJ{1&S+G*%i)7Jjl;`S{6FGu4lHl}|L^jcUq zPcr9}`p(1^6Xl&`uei>YoOEwx;;rJWcTanMR_>Bpd~sITM%CQO+S{i8iv9ef=hv3i zEC2qq_DlHcEZYA}JXhTTP5jqj?JD=-l&*^r93#qj>`+iMwJiBym zx#`XZmgEfQeC31O|MQp%FF&^1oP5Z(*Q`3p=7sEy(#x-3ZrCQlU4G0jDQ896+w1z7 zr|*9~Y^WyC-^|F7DAzatm@lh|X;FoBZ=0|13H#aGf+yURKM*5n+jd*~{l^EVkDvJ% z{XEg)7|SRAQyVtlcawQGjj2dL?%YBi9u0LKN25lkpy=c!yX4QSpL-mVd*g*3!{RR< zk2yN4JAV4Cy0V9>PtGF4L9}_H=EY8_H{2OtpO>55vprl@9_;L^;a_OV%J@dYIPiCl zw4XuaA0K_YgB5W%Bls7_`NwH+EtXNa@4`F7!N*!wr6KC~S7-gVbLM^2Ej@a9g=d?C z|Bl}M8Rap-S02`e*8Kjw+kF3hvEVz!YpYD&o7pZAE}F`0?WHJ@>wL3Ilu=E9-B2+- zD`4A?m&bGN_y~1eWfcCjsntwps)taA!WzDo^6e&Sul!azoLSH(^k=ck{dbB@8?`Q6 zJ;-3|dOjsY=2p%X&6RIubwn=LZ?d>sAL`})(Cgo3#jLFLd$nyoh~Js>pHb>bjXx+A Nd%F6$taD0e0sysGUOxZ; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_unselect_chatroom.png b/app/src/main/res/drawable-hdpi/ic_unselect_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..58b13ac92740c9ef2b5db3acacf2c0767fb60381 GIT binary patch literal 1041 zcmV+s1n&EZP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91B%lKT1ONa40RR91Bme*a04fgS`~Uz0dr3q=R9Fe^SU+e}K^#tA0%~wC z$z%%-f^Heqc1jA4m5SBPbZH=kVNRD~s9bbWFoAzM*bqv)TH;;o*Nr5)_Ze=K#Hg8U^tgh-t&_!56i@s8+bPe<7Fy|J0 zlW2eP`Fu|hvCryUyY_ztAu7)R`~skiLMj@KuIVD|fH_8S<#IWO=5t^$dMk+5OZxhi zzJk)}^x3_=y)^*c0nl0?5J+S)ncw|@28}0^$#acHBMYn;us#HX!5HxW*j?kd8{`

zsQTINSu#Gr&1Q2OV%|Z_qJDuBecbR{h`Q(Z`)BkA-Ovg6HbIQZXGZrq)h9MN$faX; z34(IIs?(U18utO#3GDg;J4G&Xs&l#o!LbD8yL`3PNp7^sK`wHt_?94U2XI7D*N6Si zs6eB(1;;u$1@|F@C5U?yLdfl4V^r{Q=YwyPoaB}msvvHZ?MNi@MLONK+$BSc~Aa6~y$R=R@hXI-OIE5Tg@xTYwEdIjxnk z1VO2Z@J%pfu(`;UA?)~ma*|sTSb~^#!eKDEl1{g+X_{BbNp8ud3fh9&1Jtfhxt!>R zB^NoFe@lEzkVwdx1J57FvXKMPVTxN8+=rShK|)~xlcq%4DTdrJf@2cs1(l)aHOKC| zjR_Z!B3yK9#}_H>ckui`&NZV7(j(;I=>Sm*F$Y#BI@uQab%K7fQj}=%3_ES8}E4f_my^hr*h!dFWLd+#JAHvq15=AkjGkPG)+zd*(7SpE>g1F*?_2Uys0F%4y(8j2vFl00000 LNkvXXu0mjfiLlys literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_select_chatroom.png b/app/src/main/res/drawable-mdpi/ic_select_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d7435ea0441e51f566eadebba1e52df2fbda0e GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf?1ZO_V~7Xu z)zFPz%#H$cZF#)}HVUvtAH2aSq|Lp!wYT@y(f=F~TxMQ%hxDeZ?d1^Uo?UY6kduKx z%L-Q(Zp8`3>EFJUnQbqx3hd@lu{O5;eedqOH`Wb-<`aJ~^}4ay$(5z{{^{H!Bi{5Y zongP?Un!rbSrg8GZ>mY@P+t-L?ZEfbLK%jePI+~>3oK%3O}gsE?l|SZciSE7=6HOV zl;CU)+ezU8vNY+H2ya>q@$C4SHDzMekI z0p_K){KkhZI~pSzC7E7Ld(Ri5ADn!x`<;Pl>nj^ABbF;&W)49nvu8HkzM89X=FHAh z8@8U5VEnrCoO&Ne-PTR4SGSv8*{$Cf)qIrWkoS{_gdmweFJ7MWxiN3wgae#!ge1?V ztG)CT6nWeJAY}D_i^e_wwv|@RFZle=OXc*PNIQkJ|kKp>gTe~DWM4f^bPIf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_unselect_chatroom.png b/app/src/main/res/drawable-mdpi/ic_unselect_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..65d8960913a0730d7f82363acbff648913d65765 GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfl1ZV#WBQ# zck5JJzrzj!t&dyg&693marBy~kfEW$uypBCr7}H17d=7iI}Dvd8X6f6TtX9nXlght zTD)A{@P2fqxUkG8b)B{8Wo6Iy-u(E^V*2mr$E924k8c!bIjB^0_46LqpNsb|zTcks zqo?QpAqlU5)mNW!+A*AQKc{GY;(JR1AT-U;7j^pML&n`^T!eZa;^{ajOT{S>Cz@me@&5Fiqb+`^S8vRa4%o zz5U#*aPrTboNXtT%`TH!Djc0;UjC*+cdxMfge!kKH@yiyzdEoX^7VwA&DFJ&Q-Aw@ zx;F9c%jUA>tm1q#<2jro#I6e@e34*0))qS>>{UR+Q|`-&KlbfEQc>I{DVoR`Y_QG6 z^~-I^!dQ!&1=xK54J-_+wZ+g2s^XzW1B+{&tZ!z#Z9cCEs0u5 zefW_ZCh&{b;7t^iqj%Ew&HAi8t()M7S^L+@-)L zZL-EYRr$6>|ExJynk-jK)I;Bt@Aps?d{AdGLptTll&G?-B8^#E-A3{()05R2#W=R@ zKf}<#v@H5m`Z=@WyEBbG%T=wIwfyv=ir+k{8~9je&$s)mv}b%7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_select_chatroom.png b/app/src/main/res/drawable-xhdpi/ic_select_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..cd39b66d3f2e8133662e42eace6f9f92559e1222 GIT binary patch literal 1071 zcmV+~1kn45P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFnMp)JRA>e5S-)=+F%*8jHvCe> zR22znafF&buL;nT#Q6~`FpRwuWS&xC`y3TZ->mNSIk!jP z`N9x+zi$Z8H^njJi)a6nu{C1s4z&jE(wV6>+W__i8nqI&TK7b+@3Bo5@6W!H=Ut(R z%3{1<@TwPV#cwjLv zF$#GYW1N_GG48>R28L2e8y`FKz}obNs7^F^D5}IpKLe=q&P$~YaOEqilf=Ugp7DUckCS zz!7)=PeXw70L7R_fibF$7YP8P%prJ@LdRwp0rn*dO!)uO@O~(v}6O)M|x9ba9S)#AW{DCO5UvMynU&R z%dKNG5D>Zz@oHR{@U<`rT*s)m1&^q}7BqbdL3C=vKtfHY&VU!74A{)u=@;|M?e2%v z-bRf|8+~EE1wz>As4*VY-VA4&WLhymyhnI+6G5JCxFd58D z09qyFzFsk4iO^5Y1OOabCE9G$S_5?uvzy8Fe#tvslkW$4HLYS?VlPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGyh%hsRA>e5na@fbSrmt>TTEx+ zb_TiyC97ayCYxktq1ogC44BOj0|Qyuia2=!2N|D0M6_K50x@J`ApHm#vq;QlX28H~ zL?PXfY$Mna+kC&`o}{X}+U~Z~-6dFXxwop$z32PgKUKF*dEUiw(F1MuK&q|Ufyz@; zQ$MBC>G5i{dM%Yo`{wxkS079Ge|%itFp^{{^a_x!9HfK?C*xusaZ3X^~== zx-Y2vs2wq95&-xR&KCi`4?x<1m&uFt@ZaR``}+F)9v>JONF5v;WRH)JH5!BT{w?xx zQkLY=PL=El?aU)&U)NeWS`x6ZuyCnVDhd1#(q)`ia9p7Lv`{F#;ryf-=hR8%^Z8$} zy+@rq=NZa}l$WyE?4S7g+)O*NXeUtCo;G7t)SRE_2E0Mamwd`MX{=l>|7G{0dF&c+&-wo`?kD~F zy%%g0qTaa{HuqjLo%C3}8uy-v9RbuYQYk~)=oP#~$+s9N>YbzaPt8#yK-&YX?o*+n z=X_0#E?*FXSj6PmLIgDeFxK8CO)9kek_ve`xSM=>ezf^jU` z%6I`roq8bwC>`;ydfrQyCnj^-bWI~;^w~lJP^vw<=6@+MNC*FNy+Omg+{KisG;KpH0#%R|=0vH~D z>bMVZvq?m5OvY$XAprq(gJzJR+-C|f`e-2msC%cYF7%Ng_HRr);&*~zApxj+;ckvo zPRv4fEdDNm&h_8OCL$!jMaXu!nRRg+v+HT@SoC1ojYjc80z}C)vQfC#Q|hpDpC!Qd z^=^#-hU*cARZ?C-r>~YhDu_WWViH>vqeg%mBE>2*ikL+!bo*QkV!`i|==2dwjR0Mw zg8vzZ>Ph!ut;=0MtZT||1D%393Nx)GfdJVCX``1_5t zN2L1ZX_4wv1<-(Zu7kT0pbuzX-=h>2-WcUgxZR0`tv1!Re8`u420z}#5_dEl0jqSb ze{h%xH$U|^q3IrT_o{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_select_chatroom.png b/app/src/main/res/drawable-xxhdpi/ic_select_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..a57281e5f710de461e77513d6e63ce03f5c04763 GIT binary patch literal 1558 zcmV+x2I={UP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=fJsC_RCodHoX=|=RTRh1o&2OR zG@^-$RoqCi>PkVRA<5gRD5VvQ$wqhn0j=)TYIpwl1KjE6B@rx$qArB|Aff>UK~cno z3W}l&E3w+N$s5o2J||3H-?{hBo!?;&JTh-)&Yko9yfb(1+&L4X#u@?*frdaspdnCK z0;=%9KY#BKUA#C=Vdp*y=_sl2D3Q9E!f>3F8rSiJ;WjUC6NSG~sJ_S<5x=V^GfO~+6D?$u5Lr+fjeugp-m z`z&Y3LkwjwL0tA-mD=SD`-s%wt28^mVR!J`BOgF(D=nhEml?{mUswsfl-lG|@p)=3 ztR?ic?w&26jdyOL&d%!$X2E*oJa$lOiGq>SH1qhcSv8*>pta?Px#L~pv_G6xaDMHm zzqmtRpt&bM^z*;kE4ccr=ePCtX+EXiFCPx##}CA@=$Jh9#N5(l(DxsV(9aj%;Gmw0 zwOOG>^%fnOc!utLWXCrse?S{=Pf}<1UG8rl^gVbXeoB2x!Qcs+dEyVB(dVR#nfOI1I$9yMp*ix8>x3bmv#qKF1`QWA^B{ll4Kkl;a8!QgX1S z*o)exs6#aHXp$j-J0J`K_jbOm#-%(BQ647^jNIiqm~_tsjF3wo1f~HK`SLhPYl*&_ z|GH(+>e3uhXVu(P-L?iTmwPw23{v5_y2-c3>!`^NXrn#Lm-J%p%B`w0+yR=P&0=;y zo$!pMjrwkO&}Qy~FcWy?(l4Ar*-my<1t})ohDL8S%}kmz2-Bn$g)^iS%}?H*4mGqv zqruF8x^u_|_i{D?&dRZATE2Ul&falvx*#kXn#AO7C{lQYO~f<0Z>qIU%6S84w-^mu!W=(Hdo~G9WxFFVTvF z!y*k@Wk69OK?#rwg#&#CtummDz?{7C2rVBwP7v*4g~PD~CEsJA1cm4Zi@$L*;9$f% z6a+M^0-FD3ldgoJ=u;Y;uGYSB$r+^UbNc!?ue@h$Lc@UrM!p)BkV&P%L2w4GG9VN$ zrL=QDeN7n5MJ7Qi6^;&0)+z%+Wmg76YD37Q%n-S;a64vr43g2@?#g2`@8px~N( zb#EqB0}fAjK&xOfpl&tkmf+{Tx)%}}DlK!mDz>D#AZ(TaVJoUhbFet1lHpi2nuoVJ zPukB-Or@LbO8eubp0w9>$XsfhlX*{*W)=@?v(#FfPca07I^=_D4%+O1P^67IN6<+}j_7gVql7a!H$ScBH$Cd3^O z%KK5luFKfm8n4`5h#eXdysF?12x?K@uhesu6Yd%iVo&&rf_b1Q9eB06t#l#epIm6#SklE_Aoy{c=rM2{dIs8y^7%ZzJ}i^7X1><%PbKI z%U@Kmhv6%H_wSdHmgW<0)>kX;kY^XUbUB@+%b@tNn-}WhH2N&#@`(!eGDqAvHeyJ4 zDet3Ze^quFwBIBzpzs`Z$VHV8*XE_(I3z5i4q2Dl=J;B8pkAYy#r57pXZ1aw4C;;U zv-VB&FX1+&`NsmiY_9oUvwux-P5jM@hCoB0A`w3TmS$7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_unselect_chatroom.png b/app/src/main/res/drawable-xxhdpi/ic_unselect_chatroom.png new file mode 100644 index 0000000000000000000000000000000000000000..f532ea49bf763c0060608b6f8c6db55ff274df05 GIT binary patch literal 2272 zcmV<62p{)}P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS@N=ZaPRCodHTw7=qXBf@Rjg8uh zAV#o45xhX3OyZ?bSrtS|EyV|8DfU5I69cx9YHcZ{7HL&%Ns2ZawLVyEqYqLLS`nfF zp-shD`cf}Y0vb%jhnA+MW}8dTnS9^)yEC&pyPMtY4l^+MzyE&D+5a+^Z&Fkg9-#uE z0-*vEr$F&Ub$#~i+0u@Vj^~Dlhv$!uj?OG8DVc_F8u1ht7x#~hjPxUXP+D4gI~t94 zZ`iP5cp|XoOrY)Cw?92JG!zB#RUjIL7>f`_e3FhqtQ#oX0Um1fF&4Skihx_7=+YAkHb(&ve8&)utgn2lfKkbC~XSpv+yQAFQaTIMLM9^sif) zOwz_xpgnu`l=SuWy@hG?2|&$q0d^f}7ja(3H2JBerR5)&GLEE%hK8w_o-ZI{CC)WC z7dr|S72U`5`?#{Q@;Gpexa6mmG;RW6IxWVpc?7@s5)%p1`f#3vXy0He+%)sjwb9o? zh_MNMZN^z?wu8Q|B5fP`;*XK>F)jkt)zxhQs1~3x7u`DmdtmnL*(dRfKFS!WO9NJ6=}tzR2yX_*-b#I3r$z5R0lY&3eO82ii1%lBia;bNNg13P5- z;Nal<=!oZJ?GPe0uU@@+XC{{jX$#cY*f<>v@fm>OnqVCO)CI9>F}(lKv|NUmdh>wc z3@}s~{a(ZZUfbN<{FjmD+br>2(kMtE5a$;p+2X)%1CSRdN*uyt-^4&HjLWfxSczE^ zQVCNYK{9eE&V1=;6bt4@M~@!;G?k9CUADfy{zGgGd(n?_ybbY|raF>R8bMrhWLl{> z0|2l--^8K#f@wWWV&pNO*vVlm>hEt#g=fr|(S&ASm!?M%a=rQ9Ust&=)z#H?v#P4< zcjCm!kugDN;>M%@7uD-UISjR$X1)gY;j= zqKW_N{7hI13mmUpf5sV+f^8T%uO+OMXPMye9UyHKSTTgl!6E6zWYRT=w-4AlkDx(I z9B$=PrcBu^9TiMK%)~B$BjiMG$p|DZz z$jRu_=4zx_rmH}Fz>eH?T9^;J)DB7*$7!8#cF=Pbh;JV-^z;Gyb?jU>9W@I)K{#0# zisVYpZj@XFg1W1W!hD7t)WhZ$$JyrVDiCs`S^{(RlG*_bFB_bqhHaY;f%rH8LvE3l zz?)6pg9Y;7n-wKS&TfxF90KumFe>RyX^-DmGulxhg~E;R82F| z7}^};xLZ^m0zt(GDgtazzZ@-7=%LBcGco)Ys2$YMrq8~DboO*{X##8@=c8!1-!pU+5C0BBG zqvk4*IBB2P3Q%{G+Cd59IGq>H4tlNvNvTs>8e8FJI!tQ3&_i+|CxeI0)kw2UPl3?D z1q{8rECsug-lXxB3pIZ4-aUHdRuVrs;yu}qUR*o{!c%{`_aD@XXmB^ZNi|-mp>TN5 zz<&@UD!q5}@aa2&hVDyabK%Ia+i18TO>q~VE8y=7M^7#Zy*udj0Pn1RjGmXJh2?N* zYonKhXN!59ft_m};C+j;j4-iK?>v0?a3^iA!*hyh1%CU0d3sgilVP8sTa4xxN=VGa z4!qW8Lr&zD41ZFAFh55yg0`U{>;4RO)x(DmPbO*acUNoX9O1&V*A;D`QIa z!ttmV@mD16c{)a3yLRo0mdWRkKGP87ZN-SuQ-@9H2aP8ReF?+{=oJc)ro&vuI67R3 z_2@UG=kTyMT_37dz&^(z?7PPt6%b=I;HL<+ZjUs^vfclxvhKMa zsj^*i4%=^GVYkuMcA`CCxm(F5veAIgAM_=xJ1KvKl+p;&4%rcYjird|bYs>=I7D6% z@w8}8L-tJ!#A0;J&!Lv4BM#e0YXoWM^oGC(bzfi+d`Hs|(!FgTy-DdXX{2Y(TolVd8B}yYOFA#Eaq;rynw1ZN;0EZpMpHHsV!2E;782^9zx2o=b&0{;VY5u^A&8p6N;00002+Gf#0>aptEq zdUN(drYWHb;eE37=Fds4ZOfm2;paCuv%haAo?M;hPXw2dl$rk!!^+ISpP4sytPr7_v>K1fck`^gd+Rh{xGL8gYoj>K% zfa#+3t1vP5WrXzoWmDl(!;%|G3CG&Km9a=beyBKf2R`g~NC5k>7HjZMS_` zXh|=~8nD;{58&}%BhS)>V>z*IsMLVGY9!{uV*~8-vH}jVY*j3Xm@F)@X9?@Pgn&qN zAZMk+L$a33P0BpuS5eHdkG>1#N~D=$&u-VMB@D}H5IiGM?VlbV!CCY*x#-vlv=hf(AXl&@~Z zk!^?dOuaxoVI_{#*!$L>AM=wI*yWzdePbr|N)l%AntnU=b7e8--`!H4C;W&RCEonvaEDD_ zY+Q!YS6IUSYU?{A4;u0&fHeZF`{{$sd#edpw!`R6f`*yFxdErtoOo4hd&&^Lf{~W3?DoMt{#G~2 ziVJ5O-S7gdi38mBrsJCJx;{?xIj0M$*%lil{y?_sOAJRm` z6F_JfW{R%-D-6)8Gvp6!)*^r!;YP=AGH;)s%J+iQu%a5>1m!)cbWi4zofCYQf*3VS zJ~?6$=_*o^cH1@bpjxm`mta2W6L=lR+K-a4$HmBY;HrtHIuL3gdrsK&zKBq1@P#o{ zg*LO&UAh$;OaOtKTBII$2iRLKNN+KR%`HT$c_Y;KST8Z!6fcUVIGgv1r`ADf&MvuW zlf*yaGKb`FPa)g z+=;td|G6#}ABE|Qm{Zi@eA7t@^~%spY*~wGZtw4O(>EWLJY@8CgraNx^Gj)ZbeFvo zfTO(q=#xo9t#sSv6_o*Sj?!_5ua9~NC?nWeuj@r=i~fAf2qNWp8N?}a>)BNsooMAY z8(*ic77K-duN&9Ob9~qRoxecOOnTHF1$mgNTYJZDh}7#ibi#rtZ|WAKxk8ap@7@Z! zY0{(iOP-cS4G0o~ zgQ&2AWDk0v_}Vr(N>8p}*6BxNfaAtXsi zmh7@*8#0(=4UwgH{NCqzf6x2Jxu0{-J?DJxeV%jgxpBsZ816$thX4TJ*1xQ4%0`Dh zIRIgglMjQ?YykP0Vzhx*9dH(VqU&O%?`mKG$g=eV04Vkbz_I7T79q9(05}^2fY}Jz zvt{r5->O44_+Nd`u}~Rj2mqWM`nng*ZiD7CJ>8GF34J!=<(4`ez-<~(SdFVOwjm5$ z9&(9F6gj?yA9_(`XKW?A#(Vll#hdJRqCahnvHc}N3MEgtZX)gL!v-rvQsm{2Cfb}9 z^Y|d~CR@Ho@{G#C<&>Sjz3F~g#13^oS1G@wQ!_Q-hVzR%#IVkq#gTFS+@FpIt@hDK zk`8;IrOI0%?fUE-;T!5Vt2bZ4%*^adY!-GVF(IK(91DF5Q>v7S-g?c#REewvQ9d*U zb57V&snmh{CoX)8@-~sb#3U8lR(1q$Z!G(gJSPu1mht5T3Ma9q)bRDuNjkBxQT>9k zGnT);AWHmZI;x>OCyMqh1z6#tE^YST;7Hnl&&9Q*o_aF&AzU-0Q`vTfP(;T+KIfHn ze}W0t`pd2K^^fZpuX+H!e1=?j2a^PUOC8Vq@`ir|Bz*1`mcu*{Z^yksb$t_dcYnsk z%lyfU5YfaW7Ue_C2+rL6tLB|QtKIK^@9t~`7-gL=jMAAio+cLgFNEIY&j|&$_D#9Z z$n+TDca{cUJK^>-4b+MqV1pHeVLu%m9Vp;Lpd2Cf$E@*9&1IbTZS?7W>JE`QA zuR)7rca8&aGX9#FZ_^Zd7sjm@rbnnGcDjXGnhCDlALGxPCl%&y=SqcbwF zXCa5j$>6EDhFG3oTvA?bw9~fJ6Ivf&+(j|U(|=HXvG(h+d3kx_p8Z9{$<$NHvo&gf z+gVNG>TEYAECf-9`&b>+lpyH#I^S17dN6Wbc5(FGZ;1bJ;+o6#hOT1I$;LRZ$)dvH zv@Bih7@YJvOpo00dU{$A{mdgqd`xlns|Nct_X8sR1Q z2C@uk+emt>041om9Wq-Vetr28qOoKZc2gCQe3_e5!h}zT2e3;?Lr}!hun`o^vwt_y z{QlE%2Rbe$KBLX&SSXF@{d(j2D!I1{pVaeRw!SUJTbmI>@#qtnDrvYN5+}6#=Esj8 zPZBLRP_*h^$lU>f<86-Lt_@$p%K2P_F(TrfYEJ}akA!=8dJ4z0@+{@lq;-YeISDBN zU9R5@AxauA&ga$l<{4}ug|;(q_C@?{i-PiKq%D89)(GF-Hg&&NrZI1+ zh#LnccR~+}_=(V~B734U}O7me#;A(C! zpCsoj;>+Oo?6tA#h6Xwpy5f4kfihK=M9b@+sCHd=Z*##{)`e5o6w|;P0OFE`+r7lv z_%d~tZCUB=vREoeFLLzC_*aYocE-#y zC0!WyE$`_cm&p+I0t!9pIX|i?9}{?l1I4E#uAcl!dfFerJ<@Jj4N-S5i0$-Fd_(n- zNT(!f8PApQnG87^LhDjPqqO7+Rou2+(Am;uM=C;!V5$jLPd_gURU`erVBF$adK8C9 z#v|PhxT`p0$m#GQ(`@iYj@-THbXxbP>Xn@_!-{*~PmymnUv|e%C>}MjKhp(Ta!CD> z)T+4`#@CgA(ybmHTpCEC@@hc6P%G@sH!~_$0uu`@|C$;pPB_rHvO6>!nB{46}W@a9jl`4f4OO0@; zE}?@d4c~#LC9zy4YTebk%Yj0+o6=ST03{-v^x3N)l!E;?cC_hw^Ny(D@ru%P zl54JYt7$Eal3tXdxvv&hSH%?c-H>tL?UOEkbe5gNW^N8}UO|(_Ct4%fTn>BuSK0jE zY59lc^NYa}ZvpGF9yu2i95j14^pvvLb`6*9(35}irqsf;^5`ylW|JYRr+--!SE-2h z)&^6hL%yV$esDGQm07=&%f-4nw$0gK^S?QR>$LxG|ML0twgif>H~pQ>r=e^yhN1_h z8$x3_G;GCqEinD|x22K`hMMBnrFbaex zOg_ApEmk@!C0{<^)w)gH*R7WNI1C>2va2QTMl0&b?)J6@*ScQMA$IC4Hx z`bY#3lGe!H|F1uN0R( z&#N(nPSEBnIF!jJsDQ0nx}&4hpo5a-spDLB+4#HUQZ#0GSA&S%Eb%TG!8(U&gofG7~PSuYHsp=59U-yHEpOX-0A0p#= zm2YPSg2FgEg3&~Lk)#EWx9udhl`=f4SScVJ9uYUMfy~WfTFz7-@;FuU~e zj4H|L#EfZ^y|=X*f+e zc13BFkD>u}egGmu`L40%^2hhTlm%=t*qLLFZEjVP zJA5MiVzCli!pH}D>nijMS}JbgQ&Kmary^DB2)v)kmncDa?lq(i7Fh0>Ge~Gi4tKfh z%c)p?`VxZuaOsBdPfh%~rQv&e6ek#LV3>=hON~9N)cn=wa0pTHq3kqjnY4a;JjSmG z-&~^U4`Y~>JonwmC4O}HMwSCzt>Z1>_y?qA_x*)hx*j9?h#v9T`xon9GSq#g?GX7N DvloZz literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/item_message_chat.xml b/app/src/main/res/layout/item_message_chat.xml index 5238d2e49b4..5c3993d5187 100644 --- a/app/src/main/res/layout/item_message_chat.xml +++ b/app/src/main/res/layout/item_message_chat.xml @@ -89,10 +89,31 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="6dp" - android:layout_below="@+id/title_own_message_layout"> + android:layout_below="@+id/title_own_message_layout" + android:background = "@null"> + + + + + + + + + + + + Date: Wed, 22 Apr 2020 13:36:28 +0200 Subject: [PATCH 003/100] Control the messages that can be selected --- .../megachat/ChatActivityLollipop.java | 32 ++++++++++++++++--- .../chatAdapters/MegaChatLollipopAdapter.java | 18 +++++------ .../GeneralChatMessageBottomSheet.java | 7 ++-- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index 6513f5eb3ea..e859b2606b4 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -4405,6 +4405,27 @@ public void itemLongClick(int positionInAdapter){ } } + private boolean isSelectableMessage(AndroidMegaChatMessage message){ + if (message.getMessage().getStatus() == MegaChatMessage.STATUS_SERVER_REJECTED || message.getMessage().getStatus() == MegaChatMessage.STATUS_SENDING_MANUAL) + return false; + + int type = message.getMessage().getType(); + switch (type) { + case MegaChatMessage.TYPE_NODE_ATTACHMENT: + case MegaChatMessage.TYPE_CONTACT_ATTACHMENT: + case MegaChatMessage.TYPE_VOICE_CLIP: + case MegaChatMessage.TYPE_NORMAL: + case MegaChatMessage.TYPE_CONTAINS_META: + case MegaChatMessage.TYPE_PUBLIC_HANDLE_CREATE: + case MegaChatMessage.TYPE_PUBLIC_HANDLE_DELETE: + case MegaChatMessage.TYPE_SET_PRIVATE_MODE: + return true; + default: + return false; + } + + } + public void itemClick(int positionInAdapter, int [] screenPosition) { int positionInMessages = positionInAdapter-1; @@ -4421,11 +4442,12 @@ public void itemClick(int positionInAdapter, int [] screenPosition) { }else{ logDebug("Message id: " + m.getMessage().getMsgId()); logDebug("Timestamp: " + m.getMessage().getTimestamp()); - - adapter.toggleSelection(positionInAdapter); - List messages = adapter.getSelectedMessages(); - if (!messages.isEmpty()) { - updateActionModeTitle(); + if(isSelectableMessage(m)) { + adapter.toggleSelection(positionInAdapter); + List messages = adapter.getSelectedMessages(); + if (!messages.isEmpty()) { + updateActionModeTitle(); + } } } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index 2e018d62978..c4565d8e6ff 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -2658,7 +2658,7 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha formatTime(message)); } - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { holder.layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(holder, userHandle, holder.fullNameTitle); @@ -2866,7 +2866,7 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha holder.contentContactMessageLayout.setVisibility(View.VISIBLE); - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { ((ViewHolderMessageChat) holder).layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(((ViewHolderMessageChat) holder), userHandle, ((ViewHolderMessageChat) holder).fullNameTitle); } else { @@ -3112,7 +3112,7 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat } } - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { holder.layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(holder, userHandle, holder.fullNameTitle); } else { @@ -3446,7 +3446,7 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes formatTime(message)); } - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { ((ViewHolderMessageChat) holder).layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(((ViewHolderMessageChat) holder), userHandle, ((ViewHolderMessageChat) holder).fullNameTitle); } else { @@ -3950,7 +3950,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa holder.contentContactMessageVoiceClipLayout.setVisibility(View.GONE); - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { ((ViewHolderMessageChat) holder).layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(((ViewHolderMessageChat) holder), userHandle, ((ViewHolderMessageChat) holder).fullNameTitle); } else { @@ -4471,7 +4471,7 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contactManagementMessageLayout.setVisibility(View.GONE); holder.contentContactMessageVoiceClipLayout.setVisibility(View.GONE); - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { holder.layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(holder, userHandle, ((ViewHolderMessageChat) holder).fullNameTitle); } else { @@ -4970,7 +4970,7 @@ public void onStopTrackingTouch(SeekBar seekBar) { } holder.contentContactMessageLayout.setVisibility(View.VISIBLE); holder.contactManagementMessageLayout.setVisibility(View.GONE); - if (messages.get(positionInAdapter - 1).isShowAvatar()) { + if (messages.get(positionInAdapter - 1).isShowAvatar() && !isMultipleSelect()) { holder.layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(holder, userHandle, holder.fullNameTitle); } else { @@ -5246,7 +5246,7 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.contentContactMessageVoiceClipLayout.setVisibility(View.GONE); - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { holder.layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(holder, userHandle, holder.fullNameTitle); } else { @@ -5726,7 +5726,7 @@ public void bindRevokeNodeMessage(ViewHolderMessageChat holder, AndroidMegaChatM ((ViewHolderMessageChat) holder).ownMessageLayout.setVisibility(View.GONE); ((ViewHolderMessageChat) holder).contactMessageLayout.setVisibility(View.VISIBLE); - if (messages.get(position - 1).isShowAvatar()) { + if (messages.get(position - 1).isShowAvatar() && !isMultipleSelect()) { ((ViewHolderMessageChat) holder).layoutAvatarMessages.setVisibility(View.VISIBLE); setContactAvatar(((ViewHolderMessageChat) holder), userHandle, ((ViewHolderMessageChat) holder).fullNameTitle); } else { diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java index c9ad73489ef..a473abb96f7 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java @@ -144,16 +144,19 @@ public void setupDialog(final Dialog dialog, int style) { } else { optionForward.setVisibility(View.VISIBLE); } - if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle() || !message.getMessage().isEditable()) { optionEdit.setVisibility(View.GONE); - optionDelete.setVisibility(View.GONE); } else { if (typeMessage == MegaChatMessage.TYPE_NORMAL || typeMessage == MegaChatMessage.TYPE_CONTAINS_META) { optionEdit.setVisibility(View.VISIBLE); } else { optionEdit.setVisibility(View.GONE); } + } + + if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle()) { + optionDelete.setVisibility(View.GONE); + } else { optionDelete.setVisibility(View.VISIBLE); } } From 99846db47ecba1f8b611be3bfeeb4c7249d9e0a7 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Wed, 22 Apr 2020 17:04:14 +0200 Subject: [PATCH 004/100] Added new chat bottomsheet options --- .../megachat/ChatActivityLollipop.java | 7 +- ...ctAttachmentBottomSheetDialogFragment.java | 116 ++++++++++----- .../GeneralChatMessageBottomSheet.java | 27 +++- ...deAttachmentBottomSheetDialogFragment.java | 137 ++++++++++++------ .../main/res/drawable-hdpi/ic_open_with.png | Bin 0 -> 688 bytes .../main/res/drawable-mdpi/ic_open_with.png | Bin 0 -> 495 bytes .../main/res/drawable-xhdpi/ic_open_with.png | Bin 0 -> 839 bytes .../main/res/drawable-xxhdpi/ic_open_with.png | Bin 0 -> 1171 bytes .../res/drawable-xxxhdpi/ic_open_with.png | Bin 0 -> 1466 bytes .../bottom_sheet_contact_attachment_item.xml | 127 ++++++++++++---- .../bottom_sheet_general_chat_messages.xml | 49 ++++--- .../bottom_sheet_node_attachment_item.xml | 94 ++++++++---- 12 files changed, 390 insertions(+), 167 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_open_with.png create mode 100644 app/src/main/res/drawable-mdpi/ic_open_with.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_open_with.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_open_with.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_open_with.png diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index e859b2606b4..4b803e75700 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -4373,7 +4373,7 @@ public void selectAll() { } } - public void itemLongClick(int positionInAdapter){ + public void itemLongClick(int positionInAdapter) { int positionInMessages = positionInAdapter - 1; if (positionInMessages >= messages.size()) return; @@ -4405,7 +4405,7 @@ public void itemLongClick(int positionInAdapter){ } } - private boolean isSelectableMessage(AndroidMegaChatMessage message){ + private boolean isSelectableMessage(AndroidMegaChatMessage message) { if (message.getMessage().getStatus() == MegaChatMessage.STATUS_SERVER_REJECTED || message.getMessage().getStatus() == MegaChatMessage.STATUS_SENDING_MANUAL) return false; @@ -4423,7 +4423,6 @@ private boolean isSelectableMessage(AndroidMegaChatMessage message){ default: return false; } - } public void itemClick(int positionInAdapter, int [] screenPosition) { @@ -4442,7 +4441,7 @@ public void itemClick(int positionInAdapter, int [] screenPosition) { }else{ logDebug("Message id: " + m.getMessage().getMsgId()); logDebug("Timestamp: " + m.getMessage().getTimestamp()); - if(isSelectableMessage(m)) { + if (isSelectableMessage(m)) { adapter.toggleSelection(positionInAdapter); List messages = adapter.getSelectedMessages(); if (!messages.isEmpty()) { diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java index 07479964f17..a4e7b20048f 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java @@ -74,7 +74,9 @@ public class ContactAttachmentBottomSheetDialogFragment extends BottomSheetDialo LinearLayout optionStartConversation; LinearLayout optionInvite; LinearLayout optionRemove; + private LinearLayout optionForward; private LinearLayout optionSelect; + private LinearLayout optionDeleteMessage; DisplayMetrics outMetrics; @@ -87,6 +89,7 @@ public class ContactAttachmentBottomSheetDialogFragment extends BottomSheetDialo private int heightDisplay; private int positionMessage; + private MegaChatRoom chatRoom; @Override public void onCreate(Bundle savedInstanceState) { @@ -136,7 +139,7 @@ public void onCreate(Bundle savedInstanceState) { nC = new NodeController(context); chatC = new ChatController(context); - + chatRoom = megaChatApi.getChatRoom(chatId); dbH = DatabaseHandler.getDbHandler(getActivity()); } @@ -167,21 +170,26 @@ public void setupDialog(final Dialog dialog, int style) { titleMailContactChatPanel = contentView.findViewById(R.id.contact_attachment_chat_mail_text); contactImageView = (RoundedImageView) contentView.findViewById(R.id.contact_attachment_thumbnail); - optionView = (LinearLayout) contentView.findViewById(R.id.option_view_layout); - optionInfo = (LinearLayout) contentView.findViewById(R.id.option_info_layout); - optionStartConversation = (LinearLayout) contentView.findViewById(R.id.option_start_conversation_layout); - optionInvite = (LinearLayout) contentView.findViewById(R.id.option_invite_layout); - optionRemove = (LinearLayout) contentView.findViewById(R.id.option_remove_layout); - optionSelect = contentView.findViewById(R.id.option_select_layout); + optionForward = contentView.findViewById(R.id.forward_layout); + LinearLayout selectSeparator = contentView.findViewById(R.id.select_separator); + optionSelect = contentView.findViewById(R.id.select_layout); + LinearLayout viewSeparator = contentView.findViewById(R.id.view_separator); + optionView = contentView.findViewById(R.id.option_view_layout); + optionInfo = contentView.findViewById(R.id.option_info_layout); + LinearLayout separatorInfo = contentView.findViewById(R.id.separator_info); + optionStartConversation = contentView.findViewById(R.id.option_start_conversation_layout); + optionInvite = contentView.findViewById(R.id.option_invite_layout); + LinearLayout deleteMessageSeparator = contentView.findViewById(R.id.delete_separator); + optionDeleteMessage = contentView.findViewById(R.id.delete_layout); + optionRemove = contentView.findViewById(R.id.option_remove_layout); optionView.setOnClickListener(this); optionInfo.setOnClickListener(this); optionStartConversation.setOnClickListener(this); optionInvite.setOnClickListener(this); optionSelect.setOnClickListener(this); - - LinearLayout separatorInfo = (LinearLayout) contentView.findViewById(R.id.separator_info); - + optionForward.setOnClickListener(this); + optionDeleteMessage.setOnClickListener(this); optionRemove.setVisibility(View.GONE); if(isScreenInPortrait(context)){ @@ -193,10 +201,27 @@ public void setupDialog(final Dialog dialog, int style) { } if (message != null) { - if(context instanceof ChatActivityLollipop) { + if (context instanceof ChatActivityLollipop && chatRoom != null) { optionSelect.setVisibility(View.VISIBLE); - }else{ + if (chatC.isInAnonymousMode() || ((chatRoom.getOwnPrivilege() == MegaChatRoom.PRIV_RM || chatRoom.getOwnPrivilege() == MegaChatRoom.PRIV_RO) && !chatRoom.isPreview())) { + optionForward.setVisibility(View.GONE); + optionDeleteMessage.setVisibility(View.GONE); + } else { + if (!isOnline(context)) { + optionForward.setVisibility(View.GONE); + } else { + optionForward.setVisibility(View.VISIBLE); + } + if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle() || !message.getMessage().isDeletable()) { + optionDeleteMessage.setVisibility(View.GONE); + } else { + optionDeleteMessage.setVisibility(View.VISIBLE); + } + } + } else { optionSelect.setVisibility(View.GONE); + optionForward.setVisibility(View.GONE); + optionDeleteMessage.setVisibility(View.GONE); } long userCount = message.getMessage().getUsersCount(); @@ -252,7 +277,6 @@ else if(state == MegaChatApi.STATUS_INVALID){ optionInfo.setVisibility(View.VISIBLE); //Check if the contact is the same that the one is chatting - MegaChatRoom chatRoom = megaChatApi.getChatRoom(chatId); if(!chatRoom.isGroup()){ long contactHandle = message.getMessage().getUserHandle(0); long messageContactHandle = chatRoom.getPeerHandle(0); @@ -426,6 +450,15 @@ else if(state == MegaChatApi.STATUS_INVALID){ separatorInfo.setVisibility(View.VISIBLE); } + if (optionSelect.getVisibility() == View.VISIBLE && optionForward.getVisibility() == View.VISIBLE) { + selectSeparator.setVisibility(optionSelect.getVisibility()); + } + if (optionSelect.getVisibility() == View.VISIBLE && (optionView.getVisibility() == View.VISIBLE || optionInfo.getVisibility() == View.VISIBLE)) { + viewSeparator.setVisibility(optionSelect.getVisibility()); + } + + deleteMessageSeparator.setVisibility(optionDeleteMessage.getVisibility()); + dialog.setContentView(contentView); mBehavior = BottomSheetBehavior.from((View) contentView.getParent()); @@ -469,10 +502,10 @@ public void onClick(View v) { logWarning("Error. The message is NULL"); return; } - + ArrayList messagesSelected = new ArrayList<>(); + messagesSelected.add(message); switch(v.getId()){ - - case R.id.option_info_layout:{ + case R.id.option_info_layout: logDebug("Info option"); if (!isOnline(context)){ @@ -480,39 +513,53 @@ public void onClick(View v) { return; } - Intent i = new Intent(context, ContactInfoActivityLollipop.class); + Intent infoIntent = new Intent(context, ContactInfoActivityLollipop.class); if(context instanceof ChatActivityLollipop){ - i.putExtra("name", message.getMessage().getUserEmail(0)); + infoIntent.putExtra("name", message.getMessage().getUserEmail(0)); } else{ if(position!=-1){ - i.putExtra("name", message.getMessage().getUserEmail(position)); + infoIntent.putExtra("name", message.getMessage().getUserEmail(position)); } else{ logWarning("Error - position -1"); } } - context.startActivity(i); + context.startActivity(infoIntent); dismissAllowingStateLoss(); break; - } - case R.id.option_view_layout:{ + + case R.id.option_view_layout: logDebug("View option"); - Intent i = new Intent(context, ContactAttachmentActivityLollipop.class); - i.putExtra("chatId", chatId); - i.putExtra("messageId", messageId); - context.startActivity(i); + Intent viewIntent = new Intent(context, ContactAttachmentActivityLollipop.class); + viewIntent.putExtra("chatId", chatId); + viewIntent.putExtra("messageId", messageId); + context.startActivity(viewIntent); dismissAllowingStateLoss(); break; - } - case R.id.option_select_layout: - if(context instanceof ChatActivityLollipop){ - ((ChatActivityLollipop)context).activateActionModeWithItem(positionMessage); + + case R.id.select_layout: + if (context instanceof ChatActivityLollipop) { + ((ChatActivityLollipop) context).activateActionModeWithItem(positionMessage); + } + dismissAllowingStateLoss(); + break; + case R.id.forward_layout: + if(context instanceof ChatActivityLollipop) { + ((ChatActivityLollipop) context).forwardMessages(messagesSelected); + } + dismissAllowingStateLoss(); + break; + case R.id.delete_layout: + if (context instanceof ChatActivityLollipop) { + logDebug("************* DELETE MESSAGE"); + + ((ChatActivityLollipop) context).showConfirmationDeleteMessages(messagesSelected, chatRoom); } dismissAllowingStateLoss(); break; - case R.id.option_invite_layout:{ + case R.id.option_invite_layout: logDebug("Invite option"); if (!isOnline(context)){ @@ -546,8 +593,8 @@ public void onClick(View v) { } break; - } - case R.id.option_start_conversation_layout:{ + + case R.id.option_start_conversation_layout: logDebug("Start conversation option"); long numUsers = message.getMessage().getUsersCount(); @@ -576,10 +623,9 @@ public void onClick(View v) { } break; - } + } -// dismiss(); mBehavior = BottomSheetBehavior.from((View) mainLinearLayout.getParent()); mBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java index a473abb96f7..4b3c9da28af 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java @@ -26,7 +26,6 @@ import nz.mega.sdk.MegaChatMessage; import nz.mega.sdk.MegaChatRoom; -import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.Util.*; @@ -103,10 +102,14 @@ public void setupDialog(final Dialog dialog, int style) { mainLayout = contentView.findViewById(R.id.bottom_sheet); itemsLayout = contentView.findViewById(R.id.items_layout); optionForward = contentView.findViewById(R.id.forward_layout); + LinearLayout editSeparator = contentView.findViewById(R.id.edit_separator); optionEdit = contentView.findViewById(R.id.edit_layout); + LinearLayout copySeparator = contentView.findViewById(R.id.copy_separator); optionCopy = contentView.findViewById(R.id.copy_layout); + LinearLayout selectSeparator = contentView.findViewById(R.id.select_separator); + optionSelect = contentView.findViewById(R.id.select_layout); + LinearLayout deleteSeparator = contentView.findViewById(R.id.delete_separator); optionDelete = contentView.findViewById(R.id.delete_layout); - optionSelect = contentView.findViewById(R.id.option_select_layout); optionForward.setOnClickListener(this); optionEdit.setOnClickListener(this); @@ -116,15 +119,20 @@ public void setupDialog(final Dialog dialog, int style) { if (message == null || chatRoom == null || ((ChatActivityLollipop) context).hasMessagesRemoved(message.getMessage()) || message.isUploading()) { optionForward.setVisibility(View.GONE); + editSeparator.setVisibility(View.GONE); optionEdit.setVisibility(View.GONE); + copySeparator.setVisibility(View.GONE); optionCopy.setVisibility(View.GONE); - optionDelete.setVisibility(View.GONE); + selectSeparator.setVisibility(View.GONE); optionSelect.setVisibility(View.GONE); + deleteSeparator.setVisibility(View.GONE); + optionDelete.setVisibility(View.GONE); } else { int typeMessage = message.getMessage().getType(); optionSelect.setVisibility(View.VISIBLE); + if (typeMessage == MegaChatMessage.TYPE_NORMAL || (typeMessage == MegaChatMessage.TYPE_CONTAINS_META && message.getMessage().getContainsMeta() != null && @@ -154,12 +162,21 @@ public void setupDialog(final Dialog dialog, int style) { } } - if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle()) { + if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle() || !message.getMessage().isDeletable()) { optionDelete.setVisibility(View.GONE); } else { optionDelete.setVisibility(View.VISIBLE); } } + + deleteSeparator.setVisibility(optionDelete.getVisibility()); + selectSeparator.setVisibility(optionSelect.getVisibility()); + editSeparator.setVisibility(optionEdit.getVisibility()); + if(optionEdit.getVisibility() == View.VISIBLE){ + copySeparator.setVisibility(View.GONE); + }else{ + copySeparator.setVisibility(optionCopy.getVisibility()); + } } dialog.setContentView(contentView); @@ -183,7 +200,7 @@ public void onClick(View view) { dismissAllowingStateLoss(); break; - case R.id.option_select_layout: + case R.id.select_layout: ((ChatActivityLollipop) context).activateActionModeWithItem(positionMessage); dismissAllowingStateLoss(); break; diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java index 4985be406cb..8589c412915 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java @@ -33,6 +33,7 @@ import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaChatApiAndroid; import nz.mega.sdk.MegaChatMessage; +import nz.mega.sdk.MegaChatRoom; import nz.mega.sdk.MegaNode; import nz.mega.sdk.MegaNodeList; @@ -71,8 +72,9 @@ public class NodeAttachmentBottomSheetDialogFragment extends BottomSheetDialogFr LinearLayout optionImport; LinearLayout optionSaveOffline; LinearLayout optionRemove; - LinearLayout optionForwardLayout; + private LinearLayout optionForward; private LinearLayout optionSelect; + private LinearLayout optionOpenWith; DisplayMetrics outMetrics; @@ -85,6 +87,7 @@ public class NodeAttachmentBottomSheetDialogFragment extends BottomSheetDialogFr private int heightDisplay; private int positionMessage; + private MegaChatRoom chatRoom; @Override public void onCreate(Bundle savedInstanceState) { @@ -130,7 +133,7 @@ else if(context instanceof NodeAttachmentHistoryActivity){ } chatC = new ChatController(context); - + chatRoom = megaChatApi.getChatRoom(chatId); dbH = DatabaseHandler.getDbHandler(getActivity()); } @@ -147,52 +150,45 @@ public void setupDialog(final Dialog dialog, int style) { View contentView = View.inflate(getContext(), R.layout.bottom_sheet_node_attachment_item, null); - mainLinearLayout = (LinearLayout) contentView.findViewById(R.id.node_attachment_bottom_sheet); - items_layout = (LinearLayout) contentView.findViewById(R.id.items_layout); - - nodeThumb = (ImageView) contentView.findViewById(R.id.node_attachment_thumbnail); - nodeName = (TextView) contentView.findViewById(R.id.node_attachment_name_text); - nodeInfo = (TextView) contentView.findViewById(R.id.node_attachment_info_text); - nodeIconLayout = (RelativeLayout) contentView.findViewById(R.id.node_attachment_relative_layout_icon); - nodeIcon = (ImageView) contentView.findViewById(R.id.node_attachment_icon); - optionDownload = (LinearLayout) contentView.findViewById(R.id.option_download_layout); - optionView = (LinearLayout) contentView.findViewById(R.id.option_view_layout); - optionViewText = (TextView) contentView.findViewById(R.id.option_view_text); - optionSaveOffline = (LinearLayout) contentView.findViewById(R.id.option_save_offline_layout); - optionRemove = (LinearLayout) contentView.findViewById(R.id.option_remove_layout); - optionForwardLayout = (LinearLayout) contentView.findViewById(R.id.option_forward_layout); - optionSelect = contentView.findViewById(R.id.option_select_layout); - - LinearLayout separatorInfo = (LinearLayout) contentView.findViewById(R.id.separator_info); - LinearLayout separatorRemove = (LinearLayout) contentView.findViewById(R.id.separator_remove); + mainLinearLayout = contentView.findViewById(R.id.node_attachment_bottom_sheet); + items_layout = contentView.findViewById(R.id.items_layout); + + nodeThumb = contentView.findViewById(R.id.node_attachment_thumbnail); + nodeName = contentView.findViewById(R.id.node_attachment_name_text); + nodeInfo = contentView.findViewById(R.id.node_attachment_info_text); + nodeIconLayout = contentView.findViewById(R.id.node_attachment_relative_layout_icon); + nodeIcon = contentView.findViewById(R.id.node_attachment_icon); + + optionOpenWith = contentView.findViewById(R.id.open_with_layout); + LinearLayout forwardSeparator = contentView.findViewById(R.id.forward_separator); + optionForward = contentView.findViewById(R.id.forward_layout); + LinearLayout selectSeparator = contentView.findViewById(R.id.select_separator); + optionSelect = contentView.findViewById(R.id.select_layout); + LinearLayout separatorInfo = contentView.findViewById(R.id.separator_info); + optionView = contentView.findViewById(R.id.option_view_layout); + optionViewText = contentView.findViewById(R.id.option_view_text); + optionDownload = contentView.findViewById(R.id.option_download_layout); + optionImport = contentView.findViewById(R.id.option_import_layout); + optionSaveOffline = contentView.findViewById(R.id.option_save_offline_layout); + LinearLayout separatorRemove = contentView.findViewById(R.id.separator_remove); + optionRemove = contentView.findViewById(R.id.option_remove_layout); if (message == null || message.getMessage() == null) { return; } - if(message.getMessage().getUserHandle() == megaChatApi.getMyUserHandle() && messageMega.isDeletable()){ - logDebug("Message DELETABLE"); - optionRemove.setVisibility(View.VISIBLE); - } - else{ - logDebug("Message NOT DELETABLE"); - optionRemove.setVisibility(View.GONE); - } - - optionImport = (LinearLayout) contentView.findViewById(R.id.option_import_layout); - optionDownload.setOnClickListener(this); optionView.setOnClickListener(this); optionSaveOffline.setOnClickListener(this); optionRemove.setOnClickListener(this); optionImport.setOnClickListener(this); - optionForwardLayout.setOnClickListener(this); + optionForward.setOnClickListener(this); + optionOpenWith.setOnClickListener(this); optionSelect.setOnClickListener(this); if (chatC.isInAnonymousMode()) { optionSaveOffline.setVisibility(View.GONE); optionImport.setVisibility(View.GONE); - optionForwardLayout.setVisibility(View.GONE); } nodeIconLayout.setVisibility(View.GONE); @@ -226,6 +222,38 @@ public void setupDialog(final Dialog dialog, int style) { return; } + if (context instanceof ChatActivityLollipop && chatRoom != null) { + optionSelect.setVisibility(View.VISIBLE); + if (chatC.isInAnonymousMode() || + ((chatRoom.getOwnPrivilege() == MegaChatRoom.PRIV_RM || chatRoom.getOwnPrivilege() == MegaChatRoom.PRIV_RO) && !chatRoom.isPreview())) { + optionForward.setVisibility(View.GONE); + optionRemove.setVisibility(View.GONE); + } else { + if (!isOnline(context)) { + optionForward.setVisibility(View.GONE); + } else { + optionForward.setVisibility(View.VISIBLE); + } + if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle() || !message.getMessage().isDeletable()) { + optionRemove.setVisibility(View.GONE); + } else { + optionRemove.setVisibility(View.VISIBLE); + } + } + + if (MimeTypeList.typeForName(node.getName()).isVideoReproducible() || MimeTypeList.typeForName(node.getName()).isVideo() || MimeTypeList.typeForName(node.getName()).isAudio() + || MimeTypeList.typeForName(node.getName()).isImage() || MimeTypeList.typeForName(node.getName()).isPdf()) { + optionOpenWith.setVisibility(View.VISIBLE); + } else { + optionOpenWith.setVisibility(View.GONE); + } + } else { + optionSelect.setVisibility(View.GONE); + optionForward.setVisibility(View.GONE); + optionRemove.setVisibility(View.GONE); + optionOpenWith.setVisibility(View.GONE); + } + if(handle == -1){ logDebug("Panel shown from ChatActivity"); if(nodeList.size()==1){ @@ -271,7 +299,7 @@ public void setupDialog(final Dialog dialog, int style) { separatorInfo.setVisibility(optionView.getVisibility()); - if ((optionDownload.getVisibility() == View.GONE && optionImport.getVisibility() == View.GONE && optionForwardLayout.getVisibility() == View.GONE && optionSaveOffline.getVisibility() == View.GONE) + if ((optionDownload.getVisibility() == View.GONE && optionImport.getVisibility() == View.GONE && optionForward.getVisibility() == View.GONE && optionSaveOffline.getVisibility() == View.GONE) || optionRemove.getVisibility() == View.GONE) { separatorRemove.setVisibility(View.GONE); } @@ -279,10 +307,16 @@ public void setupDialog(final Dialog dialog, int style) { separatorRemove.setVisibility(View.VISIBLE); } - if(context instanceof ChatActivityLollipop) { - optionSelect.setVisibility(View.VISIBLE); - }else{ - optionSelect.setVisibility(View.GONE); + if (optionOpenWith.getVisibility() == View.VISIBLE && optionForward.getVisibility() == View.VISIBLE) { + forwardSeparator.setVisibility(View.VISIBLE); + } else { + forwardSeparator.setVisibility(View.GONE); + } + + if (optionSelect.getVisibility() == View.VISIBLE && (optionForward.getVisibility() == View.VISIBLE || optionOpenWith.getVisibility() == View.VISIBLE)) { + selectSeparator.setVisibility(View.VISIBLE); + } else { + selectSeparator.setVisibility(View.GONE); } dialog.setContentView(contentView); @@ -345,13 +379,26 @@ public void onClick(View v) { } } else{ + ArrayList messagesSelected = new ArrayList<>(); + messagesSelected.add(message); switch(v.getId()){ + case R.id.open_with_layout: { + if(node==null){ + logWarning("The selected node is NULL"); + return; + } + UtilsModalBottomSheet.openWith(megaApi, context, node); + break; + } - case R.id.option_forward_layout: { - chatC.prepareMessageToForward(messageId, chatId); + case R.id.forward_layout: { + if (context instanceof ChatActivityLollipop) { + ((ChatActivityLollipop) context).forwardMessages(messagesSelected); + } + dismissAllowingStateLoss(); break; } - case R.id.option_select_layout: + case R.id.select_layout: if(context instanceof ChatActivityLollipop){ ((ChatActivityLollipop)context).activateActionModeWithItem(positionMessage); } @@ -404,13 +451,9 @@ public void onClick(View v) { return; } - if(message!=null){ - chatC.deleteMessage(message.getMessage(), chatId); + if (context instanceof ChatActivityLollipop) { + ((ChatActivityLollipop) context).showConfirmationDeleteMessages(messagesSelected, chatRoom); } - else{ - logWarning("Message is NULL"); - } - break; } } diff --git a/app/src/main/res/drawable-hdpi/ic_open_with.png b/app/src/main/res/drawable-hdpi/ic_open_with.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a0e3cae82c98544af187ce389508c10ffb3f01 GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM31Cx}ei(^Ox z=i6{=?;{QZcJdW=TB2)0)@|IhX~PE5jT?pj$WCkD@0|07Rr=teupAv7k(@0-j(pO( zTRyWcy1zZG?_{dk%^A5ZJT==lPrf-*e{=t7GpVgtL|240?rV6c{9z_bTZ7GiYtd|; zUoMUIcjX)TwUn9{N$7H}Ve~#`eEN!CPferlf=tV=H_9%&&zRjWa59G}_?BgWd|Nz+ zr16}70qw;n?=1MwP%|^|(lPOp{)S42WixWQHAK2EXt=%1yygCXlR?m}ha#~}PDauW z+!|Br4mWoPwoKLZc00C7)TsN`jOEcSJL+75xczz>*SbEFNq+zNSageo$CKzOlh*d1 zVSM!D*cOhdXXY0EH2S2gqxNdSiO6=?kY(Ox+bkzsNtgG;p?IGF#Er2>lZ!A4|_dXt@(ol z=bpZ~hO4&A{8r}D<3Z`63$FAwmvvA0clhzb?F*PfLM6TBmsm~jUVD1^-|qEBeizXH{!MLPYEjJdd4} zJon@)zvNPVo9Sm$j3)b(6^EK$loy?$)w4d~b_;KWR*!tb>^9pM;>Yf9lui4cQ|Ga^ z>Amy$8@c6dhpo=sWW2qdb4wAc{2@^r2Tys4en;-8me>de_1vwRQ(bqpY*SZ7CIc=|Zy?HQCQvCzVs&aK# zA&mu-T0}GhH44i9eP>ye}zw)-HnV*qic>5C+ N*q*L_F6*2UngFgux(fgR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_open_with.png b/app/src/main/res/drawable-xhdpi/ic_open_with.png new file mode 100644 index 0000000000000000000000000000000000000000..17abc97801ec38135819a3ef6975af969bdffcd2 GIT binary patch literal 839 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*5QUVA|;E;uw;_ z`ZmJWU&c^i?*tA-yCuS+9wHNeXb4Q4q}J3W*U7ZhlS}I#v%Qk93$s0=)D*qiRW2(# zTpE9@a42}XP(`VU<Z1C3PpHKIoiYkt4I2=M1wRqqe#1)W-cE9~}Sj zPK@FA^#;$+E?bWo$gQ8%!p`$cE+eyb=6Bb5_w*Zr&1yPxStCB{NNeV5%x@5W(Edi_ z#=q{u=mR1P>Y4Qul;<1~W2nz5+Nr-VpJD%;G!OoN%$FOD_P5wA&uI;b<}BPk@z9xY zRsFxJxs&SIPo${U#_rE$EI2-)NJG^Bt|fjR#qPcJ@5(3J-=7rM(!9+j z;_EcC(CkyS9^Y$@1Jadjw_Y>sne@JtLGQ`>5Xrw`y8^4XGU+|>?9)H>r1xy>OXJ?i zq}#2Vj!oaVbJBB}nwz;yj~V2B?Zm*-|3MJmKbw#j@cG`qrGbl>f>VbK2vgTws+) zsfXqD7@zIAtX~ALJ?EXPIN|bzaI0C}m1o2n_PIqK3brynHt{&y^9M0OCgPXBU)ger z_ui3@S%#K@pR_)R9RAIB6b zny~5b+4zj_pw!jyeuGeDGP+tQ$6$P9x2E7|@rI$38Q+VE7_7nF!SUHx3v IIVCg!0DbCIJ^%m! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_open_with.png b/app/src/main/res/drawable-xxhdpi/ic_open_with.png new file mode 100644 index 0000000000000000000000000000000000000000..8958ae1779ecde9c7c0effde5b53e4a02068c514 GIT binary patch literal 1171 zcmV;E1Z?|>P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS;{YgYYRCodHo4bk?K@f)53$6xU zz|2)a5$_-fZlVYVYo?|mqKS_nK7eTB@z``R8~z5P3??Qa2fmup$*V5^%vE@$H9f-MEhK&Wq4fDKW9{8S0}XV_Qx_$>8uJ)*;4qjx@A>!+#m-0uC;t8sVIPwx~H8 zCRlqA7lD#-Sj|ca9r}u%lN=7)VC_L%Axrj9a(3vm!1*~$JXSz_e2}cqp=B9XPZ0Di zDR8UL3P^kQ`D(pT;(P_1tu^%$&NTGBCQmTQ3Mg1nhZ$nv{1`T_Q3KQ|9KszXK%K)G zB|yEv85Kai!66`CJZEEke0-=|1QvHIZ9<+`8fdz^zt?t$7ar94%$=`bkhmBTIJcQ zbbkyCJ62xQV>4H-Wrq5X=GS2&8Qt>6 lPQVE`0Vm)DoIqLve*n=xnCBFZI4A%B002ovPDHLkV1fqM^E&_l literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_open_with.png b/app/src/main/res/drawable-xxxhdpi/ic_open_with.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4e581da9b057cfdea6a4fba694c61608b142db GIT binary patch literal 1466 zcmZvcX*|>k7{~wrnK3(#apY!X%(#+ckYnT~W2TH1<5>4*+%5ANNvrgySlX7b&NL=I zwMYy?O{->-t1w%vR74XZH?gBnX~&!0H@)~h-{12*zvu0f_dS(_meP;{002$)bU!X; z#GX({aTS)IwiN?p9w)g1O~aT4apO)8Bu9IB0Y+kv0>EG50K{HIEDf;$0L}&hxR~JH zj1Bv58^MPE@ArcBmf=(YkkBQ&yZEJn%b`aTl+D#{cRWyOmx@;ik7ZoP)}d&slfUDn zOc4wIYwN0?@JcDo(={k5E>j05!MK4n%2j!m>Lc|)ek$oU3r}6>VkTJ(9Mc~d{D;4u zs$Vhllt|Vuj_S>qHIH;wlSf_zzlBULfgp%G;J9pJq5X6o2;R!O z%wUq*6rdMtI!9w_a|unqDg~ywX2iJ#TupZ_ZP~i*Ip8Gw@F>2zMBo7oFV|f@w`)ba z2y_Q-l6Qrz=fsza2}UQX1-nivn;wpmtqM?ErO{PC38YH2t0O5X+iCosJUiJyD=(U| zOBC@J=3Iw7fXTDF&8`k9#pUQ7U(=8l1zxr`{ieFij&aH)0(I##S5h9cb7~*fb7K+b z%$a%N0J-MP?3xpInBBNe*@z(9i z6#jrBOgc>Gf%1@|%pt@67~+qbIX_83pNloLJr2D^^IO`X3gqg@ch5#YKi(Qgq?Ovf z5!%>o1m%n)rc3+eO!~iGV)CbwgGE}C4p4DK4D^K;4XqNrVM=oj^4EG&74`W_Zz(Cq zIvKVdrgdKCLI)FA+87lf587K!6Vu~B92A4Jk1;cGMyw4&@0V^!iX*aG`v3wlTW{^ zr(hUbm2}^V{Hvqw*041?VsdB>D@-KMs;o+u(w*Nq5_N1mdZX#_6PO;e=S{Q_&&Zun zVt(%Ys5aK)1aTYahMHR69H}Bfg)dP&nVXqi(8?!tZX24tdA4U$ll^)!$1v=-lAPxK zEif%)DrmQH9ye^r)~vx(YG-%8!nbwm`Mopo>4$QP!aEOiQG;legDDi{>-v#1P)J}! zleCZClcp%lxNOwR=4Q&lF~UmkVQEf6d#gQ+;I@5cg7DNkXv_;ybbfytJTN#6EMGU6 z2004z;D?B%)WA(NgmFDK0M1VZHh=c&#M2{9%D!&vLW zn@(JYJwjIidhvbsZ|E#KCc_D=WZ#nUY=E3m#a)J{ou9_rhjZ{L)m`pN&AnrTWUDOZ s;i|B5K!m~T%b?(oAOiN=2((;N9b6o?`q(w-vG+I0N2u;it`S-P0%pK+M*si- literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml b/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml index fd0c3b5ac5a..cd866cd69dc 100644 --- a/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml +++ b/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml @@ -96,108 +96,146 @@ android:layout_height="wrap_content" android:orientation="vertical" > - + android:orientation="horizontal" + android:visibility="gone"> + android:textSize="16sp" /> - + + android:orientation="horizontal" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + android:textSize="16sp" /> + + @@ -55,7 +54,6 @@ android:layout_below="@+id/node_attachment_name_text" android:textSize="14sp" android:singleLine="true" - android:maxLines="1" android:ellipsize="middle"/> @@ -97,41 +95,38 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > - - + android:orientation="horizontal" + android:visibility="gone"> - + + + @@ -266,6 +270,37 @@ android:textSize="16sp"/> + + + + + + + - \ No newline at end of file From 8e427ad3132537b9e66cd49ec60043f86c4cf505 Mon Sep 17 00:00:00 2001 From: chrisli-mega <49134504+chrisli-mega@users.noreply.github.com> Date: Tue, 28 Apr 2020 15:00:15 +1200 Subject: [PATCH 005/100] Cu user attribute (#1233) CU user attribute PR implementation --- .../privacy/android/app/DatabaseHandler.java | 8 + .../privacy/android/app/MegaApplication.java | 6 +- .../app/constants/SettingsConstants.java | 1 + .../app/jobservices/CameraUploadsService.java | 649 ++++++++---------- .../android/app/listeners/BaseListener.java | 10 + .../app/listeners/CreateFolderListener.java | 17 + .../app/listeners/GetAttrUserListener.java | 92 ++- .../android/app/listeners/GlobalListener.java | 9 +- .../app/listeners/SetAttrUserListener.java | 34 +- .../lollipop/FileInfoActivityLollipop.java | 12 +- .../lollipop/FileStorageActivityLollipop.java | 2 +- .../app/lollipop/ManagerActivityLollipop.java | 84 ++- .../app/lollipop/PinActivityLollipop.java | 9 +- .../adapters/MegaExplorerLollipopAdapter.java | 5 +- .../controllers/AccountController.java | 15 +- .../CameraUploadFragmentLollipop.java | 18 +- .../FileBrowserFragmentLollipop.java | 5 +- .../managerSections/RecentsFragment.java | 1 + .../SettingsFragmentLollipop.java | 183 ++--- .../app/receivers/CameraEventReceiver.java | 2 +- .../app/receivers/ChargeEventReceiver.java | 2 +- .../android/app/utils/CameraUploadUtil.java | 300 ++++++++ .../privacy/android/app/utils/Constants.java | 3 + .../privacy/android/app/utils/JobUtil.java | 43 +- .../android/app/utils/MegaNodeUtil.java | 33 +- .../privacy/android/app/utils/TextUtil.java | 2 +- .../app/utils/contacts/MegaContactGetter.java | 4 + app/src/main/res/values/strings.xml | 8 +- 28 files changed, 1015 insertions(+), 542 deletions(-) create mode 100644 app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java diff --git a/app/src/main/java/mega/privacy/android/app/DatabaseHandler.java b/app/src/main/java/mega/privacy/android/app/DatabaseHandler.java index 40b78be344c..9eeed9bd479 100644 --- a/app/src/main/java/mega/privacy/android/app/DatabaseHandler.java +++ b/app/src/main/java/mega/privacy/android/app/DatabaseHandler.java @@ -972,6 +972,14 @@ public void deleteAllSecondarySyncRecords(int type){ db.execSQL(sql); } + public void deleteAllPrimarySyncRecords(int type) { + String sql = "DELETE FROM " + TABLE_SYNC_RECORDS + " WHERE " + KEY_SYNC_SECONDARY + " ='" + encrypt("false") + "'"; + if (type != SyncRecord.TYPE_ANY) { + sql += " AND " + KEY_SYNC_TYPE + " = " + type; + } + db.execSQL(sql); + } + public void deleteVideoRecordsByState(int state){ String sql = "DELETE FROM " + TABLE_SYNC_RECORDS + " WHERE " + KEY_SYNC_STATE + " = " + state + " AND " diff --git a/app/src/main/java/mega/privacy/android/app/MegaApplication.java b/app/src/main/java/mega/privacy/android/app/MegaApplication.java index b0b0f63e1e5..c639e77c746 100644 --- a/app/src/main/java/mega/privacy/android/app/MegaApplication.java +++ b/app/src/main/java/mega/privacy/android/app/MegaApplication.java @@ -233,9 +233,13 @@ else if(request.getType() == MegaRequest.TYPE_FETCH_NODES){ logDebug("TYPE_FETCH_NODES"); if (e.getErrorCode() == MegaError.API_OK){ askForFullAccountInfo(); + GetAttrUserListener listener = new GetAttrUserListener(getApplicationContext(), true); if (dbH != null && dbH.getMyChatFilesFolderHandle() == INVALID_HANDLE) { - megaApi.getMyChatFilesFolder(new GetAttrUserListener(getApplicationContext(), true)); + megaApi.getMyChatFilesFolder(listener); } + //Ask for MU and CU folder when App in init state + megaApi.getCameraUploadsFolder(listener); + megaApi.getCameraUploadsFolderSecondary(listener); } } else if(request.getType() == MegaRequest.TYPE_GET_ATTR_USER){ diff --git a/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java b/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java index 9a257acf916..a3c80400ee7 100644 --- a/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java +++ b/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java @@ -13,6 +13,7 @@ public class SettingsConstants { public static final int REQUEST_MEGA_SECONDARY_MEDIA_FOLDER = 5000; public static final String KEY_SET_QUEUE_DIALOG = "KEY_SET_QUEUE_DIALOG"; public static final String KEY_SET_QUEUE_SIZE = "KEY_SET_QUEUE_SIZE"; + public final static String SELECTED_MEGA_FOLDER = "SELECT_MEGA_FOLDER"; public static final int DEFAULT_CONVENTION_QUEUE_SIZE = 200; diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 0f92cba9c52..d9cfb7d8df5 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -42,13 +42,15 @@ import mega.privacy.android.app.R; import mega.privacy.android.app.UserCredentials; import mega.privacy.android.app.VideoCompressor; +import mega.privacy.android.app.listeners.CreateFolderListener; +import mega.privacy.android.app.listeners.GetAttrUserListener; +import mega.privacy.android.app.listeners.SetAttrUserListener; import mega.privacy.android.app.lollipop.ManagerActivityLollipop; import mega.privacy.android.app.lollipop.megachat.ChatSettings; import mega.privacy.android.app.receivers.NetworkTypeChangeReceiver; import mega.privacy.android.app.utils.conversion.VideoCompressionCallback; import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaApiJava; -import nz.mega.sdk.MegaChatApi; import nz.mega.sdk.MegaChatApiAndroid; import nz.mega.sdk.MegaChatApiJava; import nz.mega.sdk.MegaChatError; @@ -63,18 +65,21 @@ import nz.mega.sdk.MegaTransferListenerInterface; import static mega.privacy.android.app.constants.SettingsConstants.VIDEO_QUALITY_MEDIUM; -import static mega.privacy.android.app.utils.Constants.*; -import static mega.privacy.android.app.utils.FileUtil.getFullPathFromTreeUri; -import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.jobservices.SyncRecord.*; +import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.receivers.NetworkTypeChangeReceiver.MOBILE; +import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.ImageProcessor.*; import static mega.privacy.android.app.utils.JobUtil.*; import static mega.privacy.android.app.utils.LogUtil.*; +import static mega.privacy.android.app.utils.MegaNodeUtil.*; import static mega.privacy.android.app.utils.PreviewUtils.*; import static mega.privacy.android.app.utils.SDCardUtils.*; +import static mega.privacy.android.app.utils.TextUtil.*; import static mega.privacy.android.app.utils.ThumbnailUtils.*; import static mega.privacy.android.app.utils.Util.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; +import static mega.privacy.android.app.utils.FileUtil.*; public class CameraUploadsService extends Service implements NetworkTypeChangeReceiver.OnNetworkTypeChangeCallback, MegaChatRequestListenerInterface, MegaRequestListenerInterface, MegaTransferListenerInterface, VideoCompressionCallback { @@ -84,29 +89,30 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeRe private static final String ERROR_SOURCE_FILE_NOT_EXIST = "SOURCE_FILE_NOT_EXIST"; private static final int BATTERY_STATE_LOW = 20; private static final int LOW_BATTERY_LEVEL = 20; - public static String PHOTO_SYNC = "PhotoSync"; - public static String CAMERA_UPLOADS = "Camera Uploads"; - public static String SECONDARY_UPLOADS = "Media Uploads"; - public static String ACTION_CANCEL = "CANCEL_SYNC"; - public static String ACTION_STOP = "STOP_SYNC"; - public static String ACTION_CANCEL_ALL = "CANCEL_ALL"; - public static String ACTION_LOGOUT = "LOGOUT_SYNC"; - public static String ACTION_LIST_PHOTOS_VIDEOS_NEW_FOLDER = "PHOTOS_VIDEOS_NEW_FOLDER"; - public static String CU_CACHE_FOLDER = "cu"; + public static final String CAMERA_UPLOADS = MegaApplication.getInstance().getString(R.string.section_photo_sync); + public static final String CAMERA_UPLOADS_ENGLISH = "Camera Uploads"; + public static final String SECONDARY_UPLOADS = MegaApplication.getInstance().getString(R.string.section_secondary_media_uploads); + public static final String SECONDARY_UPLOADS_ENGLISH = "Media Uploads"; + public static final String ACTION_CANCEL = "CANCEL_SYNC"; + public static final String ACTION_STOP = "STOP_SYNC"; + public static final String ACTION_CANCEL_ALL = "CANCEL_ALL"; + public static final String ACTION_LOGOUT = "LOGOUT_SYNC"; + public static final String ACTION_LIST_PHOTOS_VIDEOS_NEW_FOLDER = "PHOTOS_VIDEOS_NEW_FOLDER"; + public static final String EXTRA_IGNORE_ATTR_CHECK = "EXTRA_IGNORE_ATTR_CHECK"; + public static final String CU_CACHE_FOLDER = "cu"; public static int PAGE_SIZE = 200; public static int PAGE_SIZE_VIDEO = 10; public static boolean isServiceRunning = false; - + public static boolean uploadingInProgress; + private NotificationCompat.Builder mBuilder; private NotificationManager mNotificationManager; private int notificationId = NOTIFICATION_CAMERA_UPLOADS; private String notificationChannelId = NOTIFICATION_CHANNEL_CAMERA_UPLOADS_ID; private String notificationChannelName = NOTIFICATION_CHANNEL_CAMERA_UPLOADS_NAME; - - private Thread task; - - public static boolean running = false; + + public static boolean running, ignoreAttr; private Handler handler; private ExecutorService threadPool = Executors.newCachedThreadPool(); @@ -114,7 +120,7 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeRe private WifiManager.WifiLock lock; private PowerManager.WakeLock wl; - private boolean isOverQuota = false; + private boolean isOverQuota; private boolean canceled; private boolean stopByNetworkStateChange; @@ -125,25 +131,28 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeRe private boolean removeGPS = true; private ChatSettings chatSettings; private long cameraUploadHandle = -1; - private boolean secondaryEnabled = false; + private boolean secondaryEnabled; private String localPathSecondary = ""; private long secondaryUploadHandle = -1; private MegaNode secondaryUploadNode = null; - private boolean isLoggingIn = false; + private boolean isLoggingIn; private MegaApiAndroid megaApi; private MegaChatApiAndroid megaChatApi; private MegaApplication app; - private int LOGIN_IN = 12; + private static final int LOGIN_IN = 12; + private static final int SETTING_USER_ATTRIBUTE = 7; + private static final int TARGET_FOLDER_NOT_EXIST = 8; + private static final int CHECKING_USER_ATTRIBUTE = 9; + private static final int SHOULD_RUN_STATE_FAILED = -1; private long lastUpdated = 0; - private static String gSession; - private boolean isSec; - private boolean stopped = false; + private boolean isSec, isPrimaryHandleSynced, isSecondaryHandleSynced; + private boolean stopped; private NetworkTypeChangeReceiver receiver; - + public class Media { public String filePath; public long timestamp; @@ -207,12 +216,19 @@ public void onReceive(Context context, Intent intent) { } } }; - + + private GetAttrUserListener getAttrUserListener; + private SetAttrUserListener setAttrUserListener; + private CreateFolderListener createFolderListener; + @Override public void onCreate() { registerReceiver(chargingStopReceiver,new IntentFilter(Intent.ACTION_POWER_DISCONNECTED)); registerReceiver(batteryInfoReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); registerReceiver(pauseReceiver, new IntentFilter(BROADCAST_ACTION_INTENT_UPDATE_PAUSE_NOTIFICATION)); + getAttrUserListener = new GetAttrUserListener(this); + setAttrUserListener = new SetAttrUserListener(this); + createFolderListener = new CreateFolderListener(this); } @Override @@ -220,6 +236,7 @@ public void onDestroy() { logDebug("onDestroy()"); super.onDestroy(); isServiceRunning = false; + uploadingInProgress = false; if(receiver != null) { unregisterReceiver(receiver); } @@ -232,6 +249,9 @@ public void onDestroy() { if (pauseReceiver != null) { unregisterReceiver(pauseReceiver); } + getAttrUserListener = null; + setAttrUserListener = null; + createFolderListener = null; } @Nullable @@ -273,31 +293,27 @@ public int onStartCommand(Intent intent,int flags,int startId) { } if (intent != null && intent.getAction() != null) { + logDebug("onStartCommand intent action is " + intent.getAction()); if (intent.getAction().equals(ACTION_CANCEL) || intent.getAction().equals(ACTION_STOP) || intent.getAction().equals(ACTION_LIST_PHOTOS_VIDEOS_NEW_FOLDER) ) { - logDebug("Intent action is " + intent.getAction()); for(MegaTransfer transfer : cuTransfers) { megaApi.cancelTransfer(transfer,this); } } else if(ACTION_CANCEL_ALL.equals(intent.getAction()) || intent.getAction().equals(ACTION_LOGOUT)) { - logDebug("Intent action is " + intent.getAction()); megaApi.cancelTransfers(MegaTransfer.TYPE_UPLOAD,this); } stopped = true; finish(); return START_NOT_STICKY; } - - try { - logDebug("Start service here, creating new thread"); - task = createWorkerThread(); - task.start(); - } catch (Exception e) { - logError("Exception", e); - finish(); + + if(intent != null){ + ignoreAttr = intent.getBooleanExtra(EXTRA_IGNORE_ATTR_CHECK, false); } - logDebug("STARTS NOW"); + + logDebug("Start service here, creating new thread"); + startWorkerThread(); return START_NOT_STICKY; } @@ -317,12 +333,19 @@ public void run() { try { int result = shouldRun(); logDebug("onStartJob should run result: " + result + ""); - if (result == 0) { - startCameraUploads(); - } else if (result == LOGIN_IN) { - logDebug("Waiting for login"); - } else { - finish(); + switch (result) { + case 0: + startCameraUploads(); + break; + case LOGIN_IN: + case CHECKING_USER_ATTRIBUTE: + case TARGET_FOLDER_NOT_EXIST: + case SETTING_USER_ATTRIBUTE: + logDebug("wait for login or check user attribute"); + break; + default: + finish(); + break; } } catch (Exception e) { e.printStackTrace(); @@ -331,10 +354,22 @@ public void run() { } }; } - + + private void startWorkerThread(){ + try { + Thread task = createWorkerThread(); + task.start(); + } catch (Exception ex) { + logError("CameraUploadsService Exception: " + ex.getMessage() + "_" + ex.getStackTrace()); + finish(); + } + } + private void startCameraUploads() { logDebug("startCameraUploads"); showNotification(getString(R.string.section_photo_sync),getString(R.string.settings_camera_notif_checking_title),mPendingIntent,false); + // really starts the uploading process, before is checking settings. + uploadingInProgress = true; getFilesFromMediaStore(); } @@ -402,14 +437,7 @@ private void getFilesFromMediaStore() { finish(); return; } - - if (!wl.isHeld()) { - wl.acquire(); - } - if (!lock.isHeld()) { - lock.acquire(); - } - + String projection[] = { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_ADDED, @@ -442,6 +470,7 @@ private void getFilesFromMediaStore() { logDebug("SELECTION video: " + selectionCameraVideo); if (secondaryEnabled) { + secondaryUploadNode = megaApi.getNodeByHandle(secondaryUploadHandle); logDebug("if(secondaryEnabled)"); if (prefs.getSecSyncTimeStamp() != null) { secondaryTimeStamp = Long.parseLong(prefs.getSecSyncTimeStamp()); @@ -867,25 +896,23 @@ private ArrayList getPendingList(Queue mediaList,boolean isSe } private boolean checkFile(Media media,String path) { - - if (media.filePath != null && - path != null && - path.compareTo("") != 0 && - media.filePath.startsWith(path) - ) { - return true; - } - - return false; + return media.filePath != null && + !isTextEmpty(path) && + media.filePath.startsWith(path); } - + private int shouldRun() { logDebug("shouldRun()"); - + if (!isOnline(this)) { logWarning("Not online"); - finish(); - return 1; + return SHOULD_RUN_STATE_FAILED; + } + + UserCredentials credentials = dbH.getCredentials(); + if (credentials == null) { + logWarning("There are not user credentials"); + return SHOULD_RUN_STATE_FAILED; } if (isDeviceLowOnBattery(batteryIntent)) { @@ -895,308 +922,132 @@ private int shouldRun() { prefs = dbH.getPreferences(); if (prefs == null) { logWarning("Not defined, so not enabled"); - finish(); - return 2; - } else { - if (prefs.getCamSyncEnabled() == null) { - logWarning("Not defined, so not enabled"); - finish(); - return 3; - } else { - if (!Boolean.parseBoolean(prefs.getCamSyncEnabled())) { - logDebug("Camera Sync Not enabled"); - finish(); - return 4; - } else { - if (prefs.getCameraFolderExternalSDCard() != null && Boolean.parseBoolean(prefs.getCameraFolderExternalSDCard())) { - Uri uri = Uri.parse(prefs.getUriExternalSDCard()); - localPath = getFullPathFromTreeUri(uri,this); - } else { - localPath = prefs.getCamSyncLocalPath(); - } - - if (localPath == null) { - logWarning("Not defined, so not enabled"); - finish(); - return 5; - } else { - if ("".compareTo(localPath) == 0) { - logWarning("Not defined, so not enabled"); - finish(); - return 6; - - } else { - if(!localPath.endsWith(File.separator)) { - localPath += File.separator; - } - logDebug("Localpath: " + localPath); - } - } + return SHOULD_RUN_STATE_FAILED; + } - if(prefs.getRemoveGPS() != null) { - removeGPS = Boolean.parseBoolean(prefs.getRemoveGPS()); - logDebug("Should remove GPS: " + removeGPS); - } - - boolean isWifi = isOnWifi(this); - if (prefs.getCamSyncWifi() == null) { - if (!isWifi) { - logWarning("No wifi..."); - finish(); - return 7; - } - } else { - if (Boolean.parseBoolean(prefs.getCamSyncWifi())) { - if (!isWifi) { - logDebug("No wifi..."); - finish(); - return 8; - } - } - } - - UserCredentials credentials = dbH.getCredentials(); - if (credentials == null) { - logWarning("There are not user credentials"); - finish(); - return 11; - } - - gSession = credentials.getSession(); - isLoggingIn = MegaApplication.isLoggingIn(); - if (megaApi.getRootNode() == null && !isLoggingIn) { - logWarning("RootNode = null"); - - running = true; - - handler.postDelayed(new Runnable() { - @Override - public void run() { - if (megaApi.getRootNode() == null) { - isLoggingIn = MegaApplication.isLoggingIn(); - if (!isLoggingIn) { - - setLoginState(true); - - if (megaChatApi == null) { - megaChatApi = ((MegaApplication) getApplication()).getMegaChatApi(); - } - - int ret = megaChatApi.getInitState(); - - if (ret == MegaChatApi.INIT_NOT_DONE || ret == MegaChatApi.INIT_ERROR) { - ret = megaChatApi.init(gSession); - logDebug("shouldRun: result of init ---> " + ret); - chatSettings = dbH.getChatSettings(); - if (ret == MegaChatApi.INIT_NO_CACHE) { - logDebug("shouldRun: condition ret == MegaChatApi.INIT_NO_CACHE"); - - } else if (ret == MegaChatApi.INIT_ERROR) { - logDebug("shouldRun: condition ret == MegaChatApi.INIT_ERROR"); - megaChatApi.logout(CameraUploadsService.this); - } else { - logDebug("shouldRun: Chat correctly initialized"); - } - } - - logDebug("Camera upload start fast login"); - megaApi.fastLogin(gSession,CameraUploadsService.this); - } else { - logWarning("Another login is processing"); - } - } else { - logDebug("postDelayed RootNode != null"); - - int r = runLoggedIn(); - logDebug("shouldRunAfterLoginDelayed -> " + r); - if (r == 0) { - try { - startCameraUploads(); - } catch (Exception e) { - e.printStackTrace(); - handleException(e); - } - } - } - } - },10 * 1000); - - return LOGIN_IN; - } + if (prefs.getCamSyncEnabled() == null) { + logWarning("Not defined, so not enabled"); + return SHOULD_RUN_STATE_FAILED; + } - logDebug("RootNode != null"); - int r = runLoggedIn(); - return r; - } - } + if (!Boolean.parseBoolean(prefs.getCamSyncEnabled())) { + logWarning("Camera Sync Not enabled"); + return SHOULD_RUN_STATE_FAILED; } - } - - private int runLoggedIn() { - - if (prefs.getCamSyncHandle() == null) { - logWarning("if (prefs.getCamSyncHandle() == null)"); - cameraUploadHandle = -1; + + if (Boolean.parseBoolean(prefs.getCameraFolderExternalSDCard())) { + Uri uri = Uri.parse(prefs.getUriExternalSDCard()); + localPath = getFullPathFromTreeUri(uri, this); } else { - logDebug("if (prefs.getCamSyncHandle() != null)"); - cameraUploadHandle = Long.parseLong(prefs.getCamSyncHandle()); + localPath = prefs.getCamSyncLocalPath(); + } + + if (isTextEmpty(localPath)) { + logWarning("localPath is not defined, so not enabled"); + finish(); + return SHOULD_RUN_STATE_FAILED; + } + + if (!localPath.endsWith(SEPARATOR)) { + localPath += SEPARATOR; } if(prefs.getRemoveGPS() != null) { removeGPS = Boolean.parseBoolean(prefs.getRemoveGPS()); - logDebug("Should remove GPS: " + removeGPS); } - - if (prefs.getSecondaryMediaFolderEnabled() == null) { - logWarning("if (prefs.getSecondaryMediaFolderEnabled() == null)"); - dbH.setSecondaryUploadEnabled(false); - logWarning("Not defined, so not enabled"); - secondaryEnabled = false; - } else { - logDebug("if (prefs.getSecondaryMediaFolderEnabled() != null)"); - if (!Boolean.parseBoolean(prefs.getSecondaryMediaFolderEnabled())) { - logDebug("Not enabled Secondary"); - secondaryEnabled = false; - } else { - secondaryEnabled = true; - localPathSecondary = prefs.getLocalPathSecondaryFolder(); - if(!localPathSecondary.endsWith(File.separator)) { - localPathSecondary += File.separator; - } - logDebug("localPathSecondary: " + localPathSecondary); + + if (prefs.getCamSyncWifi() == null || Boolean.parseBoolean(prefs.getCamSyncWifi())) { + if (!isOnWifi(this)) { + logWarning("Not start, require WiFi."); + return SHOULD_RUN_STATE_FAILED; } } - - ArrayList nl = megaApi.getChildren(megaApi.getRootNode()); - if (cameraUploadHandle == -1) { - logDebug("Find the Camera Uploads folder of the old PhotoSync"); - for (int i = 0;i < nl.size();i++) { - if ((CAMERA_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - cameraUploadHandle = nl.get(i).getHandle(); - dbH.setCamSyncHandle(cameraUploadHandle); - } else if ((PHOTO_SYNC.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - cameraUploadHandle = nl.get(i).getHandle(); - dbH.setCamSyncHandle(cameraUploadHandle); - megaApi.renameNode(nl.get(i),CAMERA_UPLOADS,this); - } - } - logDebug("If not Camera Uploads nor Photosync"); + isLoggingIn = MegaApplication.isLoggingIn(); + if (megaApi.getRootNode() == null && !isLoggingIn) { + logWarning("RootNode = null"); + running = true; + setLoginState(true); + megaApi.fastLogin(credentials.getSession(), this); + return LOGIN_IN; + } + + cameraUploadHandle = getPrimaryFolderHandle(); + secondaryUploadHandle = getSecondaryFolderHandle(); + + //Prevent checking while app alive because it has been handled by global event + logDebug("is primary/secondary attr synced: " + isPrimaryHandleSynced + "/" + isSecondaryHandleSynced + ", ignoreAttr: " + ignoreAttr); + if (!ignoreAttr && !isPrimaryHandleSynced) { + logDebug("Try to get Camera Uploads primary target folder."); + megaApi.getCameraUploadsFolder(getAttrUserListener); + return CHECKING_USER_ATTRIBUTE; + } + + int primaryFolderResult = checkPrimaryFolder(); + int secondaryFolderResult = checkSecondaryFolder(); + + if (primaryFolderResult != 0) { + return primaryFolderResult; + } + + if (secondaryFolderResult != 0) { + return secondaryFolderResult; + } + + return 0; + } + + private int checkPrimaryFolder() { + if (isNodeInRubbishOrDeleted(cameraUploadHandle)) { + cameraUploadHandle = findDefaultFolder(CAMERA_UPLOADS); if (cameraUploadHandle == -1) { - logWarning("Must create the folder"); - megaApi.createFolder(CAMERA_UPLOADS,megaApi.getRootNode(),this); - return 13; - } - } else { - MegaNode n = megaApi.getNodeByHandle(cameraUploadHandle); - if (n == null) { - logWarning("Node with cameraUploadHandle is NULL"); - cameraUploadHandle = -1; - for (int i = 0;i < nl.size();i++) { - if ((CAMERA_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - cameraUploadHandle = nl.get(i).getHandle(); - dbH.setCamSyncHandle(cameraUploadHandle); - } else if ((PHOTO_SYNC.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - cameraUploadHandle = nl.get(i).getHandle(); - dbH.setCamSyncHandle(cameraUploadHandle); - megaApi.renameNode(nl.get(i),CAMERA_UPLOADS,this); - } - } - - if (cameraUploadHandle == -1) { - logWarning("If not Camera Uploads nor Photosync--- must create the folder"); - megaApi.createFolder(CAMERA_UPLOADS,megaApi.getRootNode(),this); - return 14; - } + megaApi.createFolder(CAMERA_UPLOADS, megaApi.getRootNode(), createFolderListener); + return TARGET_FOLDER_NOT_EXIST; } else { - logDebug("Sync Folder " + cameraUploadHandle + " Node: " + n.getName()); + megaApi.setCameraUploadsFolder(cameraUploadHandle, setAttrUserListener); + return SETTING_USER_ATTRIBUTE; } } - + return 0; + } + + private int checkSecondaryFolder() { + if (prefs.getSecondaryMediaFolderEnabled() == null) { + logDebug("Secondary upload setting not defined, so not enabled"); + dbH.setSecondaryUploadEnabled(false); + secondaryEnabled = false; + } else if (Boolean.parseBoolean(prefs.getSecondaryMediaFolderEnabled())) { + secondaryEnabled = true; + localPathSecondary = prefs.getLocalPathSecondaryFolder(); + if (!localPathSecondary.endsWith(SEPARATOR)) { + localPathSecondary += SEPARATOR; + } + } else { + logDebug("Not enabled Secondary"); + secondaryEnabled = false; + } + if (secondaryEnabled) { - logDebug("The secondary uploads are enabled"); - String temp = prefs.getMegaHandleSecondaryFolder(); - if (temp != null) { - if (temp.compareTo("") != 0) { - secondaryUploadHandle = Long.parseLong(prefs.getMegaHandleSecondaryFolder()); - if (secondaryUploadHandle == -1) { - for (int i = 0;i < nl.size();i++) { - if ((SECONDARY_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - secondaryUploadHandle = nl.get(i).getHandle(); - dbH.setSecondaryFolderHandle(secondaryUploadHandle); - } - } - - //If not "Media Uploads" - if (secondaryUploadHandle == -1) { - logWarning("Must create the secondary folder"); - megaApi.createFolder(SECONDARY_UPLOADS,megaApi.getRootNode(),this); - return 15; - } - } else { - logDebug("SecondaryUploadHandle: " + secondaryUploadHandle); - MegaNode n = megaApi.getNodeByHandle(secondaryUploadHandle); - //If ERROR with the handler (the node may no longer exist): Create the folder Media Uploads - if (n == null) { - secondaryUploadHandle = -1; - logWarning("The secondary media folder may not longer exists"); - for (int i = 0;i < nl.size();i++) { - if ((SECONDARY_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - secondaryUploadHandle = nl.get(i).getHandle(); - dbH.setSecondaryFolderHandle(secondaryUploadHandle); - } - } - - //If not "Media Uploads" - if (secondaryUploadHandle == -1) { - logWarning("Must create the folder"); - megaApi.createFolder(SECONDARY_UPLOADS,megaApi.getRootNode(),this); - return 16; - } - } else { - logDebug("Secondary Folder " + secondaryUploadHandle + " Node: " + n.getName()); - secondaryUploadNode = megaApi.getNodeByHandle(secondaryUploadHandle); - } - } - } else { - //If empty string as SecondaryHandle - secondaryUploadHandle = -1; - for (int i = 0;i < nl.size();i++) { - if ((SECONDARY_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - secondaryUploadHandle = nl.get(i).getHandle(); - dbH.setSecondaryFolderHandle(secondaryUploadHandle); - } - } - - //If not "Media Uploads" - if (secondaryUploadHandle == -1) { - logWarning("Mmust create the folder"); - megaApi.createFolder(SECONDARY_UPLOADS,megaApi.getRootNode(),this); - return 17; - } - } - } else { - for (int i = 0;i < nl.size();i++) { - if ((SECONDARY_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { - secondaryUploadHandle = nl.get(i).getHandle(); - dbH.setSecondaryFolderHandle(secondaryUploadHandle); - } - } - - //If not "Media Uploads" + logDebug("the secondary uploads are enabled"); + if (isNodeInRubbishOrDeleted(secondaryUploadHandle)) { + secondaryUploadHandle = findDefaultFolder(SECONDARY_UPLOADS); if (secondaryUploadHandle == -1) { - logWarning("Must create the folder"); - megaApi.createFolder(SECONDARY_UPLOADS,megaApi.getRootNode(),this); - return 18; + logDebug("must create the folder"); + megaApi.createFolder(SECONDARY_UPLOADS, megaApi.getRootNode(), createFolderListener); + return TARGET_FOLDER_NOT_EXIST; + } else { + megaApi.setCameraUploadsFolderSecondary(secondaryUploadHandle, setAttrUserListener); + return SETTING_USER_ATTRIBUTE; } } } else { logDebug("Secondary NOT Enabled"); } - return 0; } - + + + private void initService() { logDebug("initService()"); registerNetworkTypeChangeReceiver(); @@ -1381,8 +1232,7 @@ public void onRequestFinish(MegaApiJava api,MegaRequest request,MegaError e) { private synchronized void requestFinished(MegaRequest request,MegaError e) { if (request.getType() == MegaRequest.TYPE_LOGIN) { if (e.getErrorCode() == MegaError.API_OK) { - logDebug("Fast login OK"); - logDebug("Calling fetchNodes from CameraSyncService"); + logDebug("Fast login OK, Calling fetchNodes from CameraSyncService"); megaApi.fetchNodes(this); } else { logError("ERROR: " + e.getErrorString()); @@ -1391,39 +1241,16 @@ private synchronized void requestFinished(MegaRequest request,MegaError e) { } } else if (request.getType() == MegaRequest.TYPE_FETCH_NODES) { if (e.getErrorCode() == MegaError.API_OK) { - logDebug("Fetch nodes ok"); - logDebug("Chat --> connect"); + logDebug("fetch nodes ok"); megaChatApi.connectInBackground(this); setLoginState(false); - - try { - logDebug("Start service here MegaRequest.TYPE_FETCH_NODES"); - task = createWorkerThread(); - task.start(); - } catch (Exception ex) { - logError("Exception", ex); - finish(); - } + logDebug("Start service here MegaRequest.TYPE_FETCH_NODES"); + startWorkerThread(); } else { logError("ERROR: " + e.getErrorString()); setLoginState(false); finish(); } - } else if (request.getType() == MegaRequest.TYPE_CREATE_FOLDER) { - if (e.getErrorCode() == MegaError.API_OK) { - logDebug("Folder created: " + request.getName()); - String name = request.getName(); - if (name.contains(CAMERA_UPLOADS)) { - logDebug("CamSync Folder UPDATED DB"); - dbH.setCamSyncHandle(request.getNodeHandle()); - } else { - //Update in database - logDebug("Secondary Folder UPDATED DB"); - dbH.setSecondaryFolderHandle(request.getNodeHandle()); - } - } else { - finish(); - } } else if (request.getType() == MegaRequest.TYPE_CANCEL_TRANSFER) { logDebug("Cancel transfer received"); if (e.getErrorCode() == MegaError.API_OK) { @@ -1460,7 +1287,79 @@ public void run() { updateUpload(); } } - + + public void onGetPrimaryFolderAttribute(MegaRequest request, MegaError e) { + logDebug("onGetPrimaryAttribute: " + request.getNodeHandle() + " -> " + cameraUploadHandle); + //API_ENOENT means attribute never get set + if (e.getErrorCode() == MegaError.API_OK || e.getErrorCode() == MegaError.API_ENOENT) { + isPrimaryHandleSynced = true; + long cuPrimaryHandleInUserAttr = request.getNodeHandle(); + // when get an invalid hanle from cloud, need to upload local handle. + if (cuPrimaryHandleInUserAttr == -1 && cameraUploadHandle != -1) { + megaApi.setCameraUploadsFolder(cameraUploadHandle, setAttrUserListener); + } else if (cameraUploadHandle != cuPrimaryHandleInUserAttr) { + //cloud setting takes priority, update local handle. + cameraUploadHandle = cuPrimaryHandleInUserAttr; + dbH.setCamSyncHandle(cameraUploadHandle); + resetPrimaryTimeline(); + } + // start to get secondary handle. + megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); + } else { + logWarning("Get primary handle faild, finish process."); + finish(); + } + } + + public void onGetSecondaryFolderAttribute(MegaRequest request, MegaError e) { + logDebug("onGetSecondaryAttribute: " + request.getNodeHandle() + " -> " + secondaryUploadHandle) ; + if (e.getErrorCode() == MegaError.API_OK || e.getErrorCode() == MegaError.API_ENOENT) { + isSecondaryHandleSynced = true; + long cuSecondaryHandleInUserAttr = request.getNodeHandle(); + if (cuSecondaryHandleInUserAttr == -1 && secondaryUploadHandle != -1) { + megaApi.setCameraUploadsFolderSecondary(secondaryUploadHandle, setAttrUserListener); + } else if(cuSecondaryHandleInUserAttr != secondaryUploadHandle) { + secondaryUploadHandle = cuSecondaryHandleInUserAttr; + dbH.setSecondaryFolderHandle(secondaryUploadHandle); + resetSecondaryTimeline(); + } + // start to upload. + startWorkerThread(); + } else { + logWarning("Get secondary handle faild, finish process."); + finish(); + } + } + + public void onSetFolderAttribute(boolean isSuccessful) { + if (isSuccessful) { + startWorkerThread(); + } else { + logWarning("Set handle failed, finish process."); + finish(); + } + } + + public void onCreateFolder(MegaRequest request, MegaError e) { + if (e.getErrorCode() == MegaError.API_OK) { + logDebug("Folder created: " + request.getName()); + String name = request.getName(); + long handle = request.getNodeHandle(); + if (CAMERA_UPLOADS.equals(name)) { + // check if other client has created this folder already, if yes, delete it. + if(!deleteIfDuplicated(name, handle)) { + megaApi.setCameraUploadsFolder(handle, setAttrUserListener); + } + } + if (SECONDARY_UPLOADS.equals(name)) { + if(!deleteIfDuplicated(name, handle)) { + megaApi.setCameraUploadsFolderSecondary(handle, setAttrUserListener); + } + } + } else { + finish(); + } + } private void setLoginState(boolean b) { isLoggingIn = b; MegaApplication.setLoggingIn(b); @@ -1892,7 +1791,7 @@ private Notification createNotification(String title,String content,PendingInten } return mBuilder.build(); } - + private void showNotification(String title,String content,PendingIntent intent,boolean isAutoCancel) { mNotification = createNotification(title, content, intent, isAutoCancel); mNotificationManager.notify(notificationId,mNotification); @@ -2045,7 +1944,7 @@ private float[] getGPSCoordinates(String filePath,boolean isVideo) { output[0] = Float.parseFloat(parts[0]); output[1] = Float.parseFloat(parts[1]); - + } catch (Exception exc) { secondTry = true; logError("Exception, second try to set GPS coordinates", exc); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java b/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java index 127e2f82ece..2bab771243c 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java @@ -4,6 +4,8 @@ import mega.privacy.android.app.DatabaseHandler; import mega.privacy.android.app.MegaApplication; +import mega.privacy.android.app.MegaPreferences; +import mega.privacy.android.app.lollipop.ManagerActivityLollipop.*; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaError; import nz.mega.sdk.MegaRequest; @@ -11,12 +13,20 @@ public class BaseListener implements MegaRequestListenerInterface { + // FragmentTag is for storing the fragment which has the api call within Activity Context + protected FragmentTag fragmentTag; protected Context context; protected DatabaseHandler dBH; + protected MegaPreferences prefs; public BaseListener(Context context) { this.context = context; dBH = MegaApplication.getInstance().getDbH(); + prefs = dBH.getPreferences(); + } + + public void setFragmentTag(FragmentTag fragmentTag) { + this.fragmentTag = fragmentTag; } @Override diff --git a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java index 77b04c21ce2..ac7735b0485 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java @@ -2,7 +2,9 @@ import android.content.Context; +import mega.privacy.android.app.MegaApplication; import mega.privacy.android.app.R; +import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.FileExplorerActivityLollipop; import mega.privacy.android.app.lollipop.megachat.ChatActivityLollipop; import mega.privacy.android.app.lollipop.megachat.NodeAttachmentHistoryActivity; @@ -11,6 +13,9 @@ import nz.mega.sdk.MegaNode; import nz.mega.sdk.MegaRequest; +import static mega.privacy.android.app.jobservices.CameraUploadsService.CAMERA_UPLOADS; +import static mega.privacy.android.app.jobservices.CameraUploadsService.SECONDARY_UPLOADS; +import static mega.privacy.android.app.utils.CameraUploadUtil.deleteIfDuplicated; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -75,9 +80,21 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { api.setMyChatFilesFolder(handle, new SetAttrUserListener(nodeAttachmentHistoryActivity)); nodeAttachmentHistoryActivity.setMyChatFilesFolder(node); nodeAttachmentHistoryActivity.handleStoredData(); + } else if (context instanceof CameraUploadsService) { + ((CameraUploadsService) context).onCreateFolder(request, e); } else { nodeAttachmentHistoryActivity.showSnackbar(SNACKBAR_TYPE, context.getString(R.string.general_text_error)); } + } else if (context instanceof CameraUploadsService) { + ((CameraUploadsService) context).onCreateFolder(request, e); + } else if (context instanceof MegaApplication) { + if (e.getErrorCode() == MegaError.API_OK) { + if (name.equals(CAMERA_UPLOADS) && !deleteIfDuplicated(name, handle)) { + api.setCameraUploadsFolder(handle, new SetAttrUserListener(context)); + }else if (name.equals(SECONDARY_UPLOADS) && !deleteIfDuplicated(name, handle)) { + api.setCameraUploadsFolderSecondary(handle, new SetAttrUserListener(context)); + } + } } if (e.getErrorCode() != MegaError.API_OK) { diff --git a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java index ea9273ddbdc..8e03609295e 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java @@ -2,18 +2,24 @@ import android.content.Context; +import mega.privacy.android.app.MegaApplication; import mega.privacy.android.app.R; +import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.FileExplorerActivityLollipop; import mega.privacy.android.app.lollipop.megachat.ChatActivityLollipop; import mega.privacy.android.app.lollipop.megachat.NodeAttachmentHistoryActivity; +import mega.privacy.android.app.utils.JobUtil; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaError; import nz.mega.sdk.MegaNode; import nz.mega.sdk.MegaRequest; +import static mega.privacy.android.app.jobservices.CameraUploadsService.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.ContactUtil.*; +import static mega.privacy.android.app.utils.MegaNodeUtil.*; import static nz.mega.sdk.MegaApiJava.*; public class GetAttrUserListener extends BaseListener { @@ -22,6 +28,7 @@ public class GetAttrUserListener extends BaseListener { * If so, the rest of the actions in onRequestFinish() can be ignored. */ private boolean onlyDBUpdate; + public GetAttrUserListener(Context context) { super(context); } @@ -30,8 +37,8 @@ public GetAttrUserListener(Context context) { * Constructor to init a request for check the USER_ATTR_MY_CHAT_FILES_FOLDER user's attribute * and update the DB with the result. * - * @param context current application context - * @param onlyDBUpdate true if the purpose of the request is only update the DB, false otherwise + * @param context current application context + * @param onlyDBUpdate true if the purpose of the request is only update the DB, false otherwise */ public GetAttrUserListener(Context context, boolean onlyDBUpdate) { super(context); @@ -70,7 +77,7 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { if (myChatFolderNode != null && !api.isInRubbish(myChatFolderNode)) { dBH.setMyChatFilesFolderHandle(myChatFolderNode.getHandle()); myChatFolderFound = true; - } else if (!onlyDBUpdate){ + } else if (!onlyDBUpdate) { api.createFolder(context.getString(R.string.my_chat_files_folder), api.getRootNode(), new CreateFolderListener(context, true)); } @@ -103,16 +110,19 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { } } break; + case USER_ATTR_FIRSTNAME: if (e.getErrorCode() == MegaError.API_OK) { updateFirstName(context, request.getText(), request.getEmail()); } break; + case USER_ATTR_LASTNAME: if (e.getErrorCode() == MegaError.API_OK) { updateLastName(context, request.getText(), request.getEmail()); } break; + case USER_ATTR_ALIAS: if (e.getErrorCode() == MegaError.API_OK) { String nickname = request.getName(); @@ -129,6 +139,82 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { logError("Error recovering the alias" + e.getErrorCode()); } break; + + case USER_ATTR_CAMERA_UPLOADS_FOLDER: + if (context instanceof CameraUploadsService) { + if (request.getFlag()) { + ((CameraUploadsService) context).onGetSecondaryFolderAttribute(request, e); + } else { + ((CameraUploadsService) context).onGetPrimaryFolderAttribute(request, e); + } + } else if (e.getErrorCode() == MegaError.API_OK) { + synchronized (this) { + long handleInUserAttr = request.getNodeHandle(); + if (isNodeInRubbishOrDeleted(handleInUserAttr)) { + boolean isSecondary = request.getFlag(); + if (isSecondary) { + long secondaryHandle = findDefaultFolder(SECONDARY_UPLOADS); + if (secondaryHandle == INVALID_HANDLE) { + secondaryHandle = findDefaultFolder(SECONDARY_UPLOADS_ENGLISH); + } + if (secondaryHandle == INVALID_HANDLE) { + if (prefs != null && + prefs.getSecondaryMediaFolderEnabled() != null && + Boolean.parseBoolean(prefs.getSecondaryMediaFolderEnabled())) { + api.createFolder(SECONDARY_UPLOADS, api.getRootNode(), new CreateFolderListener(context)); + } + } else { + api.setCameraUploadsFolderSecondary(secondaryHandle, new SetAttrUserListener(context)); + api.renameNode(api.getNodeByHandle(secondaryHandle), SECONDARY_UPLOADS, new RenameListener(context)); + } + + } else { + long primaryHandle = findDefaultFolder(CAMERA_UPLOADS); + if (primaryHandle == INVALID_HANDLE) { + primaryHandle = findDefaultFolder(CAMERA_UPLOADS_ENGLISH); + } + if (primaryHandle == INVALID_HANDLE) { + if (prefs != null && + prefs.getCamSyncEnabled() != null && + Boolean.parseBoolean(prefs.getCamSyncEnabled())) { + api.createFolder(CAMERA_UPLOADS, api.getRootNode(), new CreateFolderListener(context)); + } + } else { + api.setCameraUploadsFolder(primaryHandle, new SetAttrUserListener(context)); + api.renameNode(api.getNodeByHandle(primaryHandle), CAMERA_UPLOADS, new RenameListener(context)); + } + } + } else { + long primaryHandle = getPrimaryFolderHandle(); + long secondaryHandle = getSecondaryFolderHandle(); + boolean shouldCUStop = false; + + //save changes to local DB + boolean isSecondary = request.getFlag(); + if (isSecondary && handleInUserAttr != secondaryHandle) { + dBH.setSecondaryFolderHandle(handleInUserAttr); + resetSecondaryTimeline(); + shouldCUStop = true; + + } else if (!isSecondary && handleInUserAttr != primaryHandle) { + dBH.setCamSyncHandle(handleInUserAttr); + resetPrimaryTimeline(); + shouldCUStop = true; + } + + //stop CU if destination has changed + if (shouldCUStop && CameraUploadsService.isServiceRunning) { + JobUtil.stopRunningCameraUploadService(context); + } + + //notify manager activity to update UI + if (!(context instanceof MegaApplication)) { + forceUpdateCameraUploadFolderIcon(isSecondary, handleInUserAttr); + } + } + } + } + break; } } } diff --git a/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java b/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java index 5e36d0cbdf3..472add0160e 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java @@ -8,7 +8,6 @@ import mega.privacy.android.app.DatabaseHandler; import mega.privacy.android.app.MegaApplication; import mega.privacy.android.app.fcm.ContactsAdvancedNotificationBuilder; -import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaContactRequest; import nz.mega.sdk.MegaEvent; @@ -44,6 +43,14 @@ public void onUsersUpdate(MegaApiJava api, ArrayList users) { && api.getMyUserHandle().equals(Long.toString(user.getHandle()))) { api.getMyChatFilesFolder(new GetAttrUserListener(MegaApplication.getInstance(), true)); } + + if (user.hasChanged(MegaUser.CHANGE_TYPE_CAMERA_UPLOADS_FOLDER)) { + //user has change CU attribute, need to update local ones + GetAttrUserListener listener = new GetAttrUserListener(megaApplication); + api.getCameraUploadsFolder(listener); + api.getCameraUploadsFolderSecondary(listener); + break; + } } } diff --git a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java index 2af5725b214..9665008a366 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java @@ -2,14 +2,17 @@ import android.content.Context; -import mega.privacy.android.app.DatabaseHandler; import mega.privacy.android.app.MegaApplication; import mega.privacy.android.app.R; +import mega.privacy.android.app.jobservices.CameraUploadsService; +import mega.privacy.android.app.lollipop.ManagerActivityLollipop; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaError; import nz.mega.sdk.MegaRequest; import nz.mega.sdk.MegaStringMap; +import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.FragmentTag.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.Util.*; import static mega.privacy.android.app.utils.TextUtil.*; @@ -63,6 +66,35 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { logError("Error adding, updating or removing the alias" + e.getErrorCode()); } break; + case USER_ATTR_CAMERA_UPLOADS_FOLDER: + long handle = request.getNodeHandle(); + boolean isSecondary = request.getFlag(); + // Database and preference update + if (e.getErrorCode() == MegaError.API_OK) { + if (isSecondary) { + resetSecondaryTimeline(); + dBH.setSecondaryFolderHandle(handle); + prefs.setMegaHandleSecondaryFolder(String.valueOf(handle)); + } else { + resetPrimaryTimeline(); + dBH.setCamSyncHandle(handle); + prefs.setCamSyncHandle(String.valueOf(handle)); + } + forceUpdateCameraUploadFolderIcon(request.getFlag(), request.getNodeHandle()); + } + + if (context instanceof CameraUploadsService) { + ((CameraUploadsService) context).onSetFolderAttribute(e.getErrorCode() == MegaError.API_OK); + } else if (context instanceof ManagerActivityLollipop + && fragmentTag == SETTINGS) { + if (e.getErrorCode() == MegaError.API_OK) { + ((ManagerActivityLollipop) context).getSettingsFragment().setCUDestinationFolder(isSecondary, handle); + return; + } + showSnackbar(context, context.getString(R.string.error_unable_to_setup_cloud_folder)); + logError("Exception happens when set user attribute" + e.toString()); + } + break; } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java index 45ab4dfc78d..2e402cd28e8 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java @@ -77,6 +77,7 @@ import mega.privacy.android.app.components.RoundedImageView; import mega.privacy.android.app.components.SimpleDividerItemDecoration; import mega.privacy.android.app.components.twemoji.EmojiTextView; +import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.listeners.ShareListener; import mega.privacy.android.app.lollipop.adapters.MegaFileInfoSharedContactLollipopAdapter; import mega.privacy.android.app.lollipop.controllers.ContactController; @@ -112,6 +113,7 @@ import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.MegaApiUtils.*; import static mega.privacy.android.app.utils.MegaNodeUtil.*; @@ -1941,7 +1943,15 @@ public void onClick(DialogInterface dialog, int which) { if (moveToRubbish){ AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); - String message= getResources().getString(R.string.confirmation_move_to_rubbish); + int stringMessageID; + if (getPrimaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + stringMessageID = R.string.confirmation_move_cu_folder_to_rubbish; + } else if (getSecondaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + stringMessageID = R.string.confirmation_move_mu_folder_to_rubbish; + } else { + stringMessageID = R.string.confirmation_move_to_rubbish; + } + String message= getResources().getString(stringMessageID); builder.setMessage(message).setPositiveButton(R.string.general_move, dialogClickListener) .setNegativeButton(R.string.general_cancel, dialogClickListener).show(); } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/FileStorageActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/FileStorageActivityLollipop.java index c89ee03518d..665db30b3e7 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/FileStorageActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/FileStorageActivityLollipop.java @@ -701,7 +701,7 @@ public void onClick(View v) { } if (mode == Mode.PICK_FOLDER) { if ((prefs == null || prefs.getStorageAskAlways() == null || Boolean.parseBoolean(prefs.getStorageAskAlways())) - && dbH.getAskSetDownloadLocation()) { + && dbH.getAskSetDownloadLocation() && !cameraFolderSettings) { showConfirmationSaveInSameLocation(); } else { finishPickFolder(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java index 6cf42600455..5d44aaf87ad 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java @@ -146,6 +146,7 @@ import mega.privacy.android.app.fcm.ContactsAdvancedNotificationBuilder; import mega.privacy.android.app.fragments.managerFragments.LinksFragment; import mega.privacy.android.app.interfaces.UploadBottomSheetDialogActionListener; +import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.listeners.ExportListener; import mega.privacy.android.app.listeners.GetAttrUserListener; import mega.privacy.android.app.lollipop.adapters.CloudPageAdapter; @@ -239,6 +240,7 @@ import nz.mega.sdk.MegaUser; import nz.mega.sdk.MegaUserAlert; import nz.mega.sdk.MegaUtilsAndroid; + import static mega.privacy.android.app.constants.BroadcastConstants.*; import static mega.privacy.android.app.utils.PermissionUtils.*; import static mega.privacy.android.app.utils.billing.PaymentUtils.*; @@ -248,6 +250,7 @@ import static mega.privacy.android.app.utils.AvatarUtil.*; import static mega.privacy.android.app.utils.CacheFolderManager.*; import static mega.privacy.android.app.utils.CallUtil.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.DBUtil.*; import static mega.privacy.android.app.utils.FileUtils.*; @@ -904,6 +907,34 @@ public void onReceive(Context context, Intent intent) { } }; + private BroadcastReceiver receiverCUAttrChanged = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + synchronized (this){ + long handleInUserAttr = intent.getLongExtra(EXTRA_NODE_HANDLE, -1); + boolean isSecondary = intent.getBooleanExtra(EXTRA_IS_CU_SECONDARY_FOLDER, false); + if (isSecondary) { + if (drawerItem == DrawerItem.MEDIA_UPLOADS) { + secondaryMediaUploadsClicked(); + } + } else { + if (drawerItem == DrawerItem.CAMERA_UPLOADS) { + cameraUploadsClicked(); + } + } + + //refresh settings if user is on that page + if (getSettingsFragment() != null) { + getSettingsFragment().setCUDestinationFolder(isSecondary, handleInUserAttr); + } + + //update folder icon + onNodesCloudDriveUpdate(); + } + } + }; + private BroadcastReceiver networkReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -933,7 +964,7 @@ else if(actionType == START_RECONNECTION){ public void onReceive(Context context,Intent intent) { try { logDebug("cameraUploadLauncherReceiver: Start service here"); - startCameraUploadService(ManagerActivityLollipop.this); + startCameraUploadServiceIgnoreAttr(ManagerActivityLollipop.this); } catch (Exception e) { logError("cameraUploadLauncherReceiver: Exception", e); } @@ -1913,6 +1944,9 @@ protected void onCreate(Bundle savedInstanceState) { localBroadcastManager.registerReceiver(networkReceiver, new IntentFilter(BROADCAST_ACTION_INTENT_CONNECTIVITY_CHANGE)); + localBroadcastManager.registerReceiver(receiverCUAttrChanged, + new IntentFilter(BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE)); + localBroadcastManager.registerReceiver(receiverUpdateOrder, new IntentFilter(BROADCAST_ACTION_INTENT_UPDATE_ORDER)); localBroadcastManager.registerReceiver(receiverUpdateView, new IntentFilter(BROADCAST_ACTION_INTENT_UPDATE_VIEW)); localBroadcastManager.registerReceiver(chatArchivedReceiver, new IntentFilter(BROADCAST_ACTION_INTENT_CHAT_ARCHIVED)); @@ -4508,6 +4542,7 @@ protected void onDestroy(){ LocalBroadcastManager.getInstance(this).unregisterReceiver(chatArchivedReceiver); LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshAddPhoneNumberButtonReceiver); LocalBroadcastManager.getInstance(this).unregisterReceiver(chatCallUpdateReceiver); + LocalBroadcastManager.getInstance(this).unregisterReceiver(receiverCUAttrChanged); unregisterReceiver(cameraUploadLauncherReceiver); @@ -5771,6 +5806,8 @@ public void selectDrawerItemLollipop(DrawerItem item) { muFLol = (CameraUploadFragmentLollipop) getSupportFragmentManager().findFragmentByTag(FragmentTag.MEDIA_UPLOADS.getTag()); if (muFLol == null) { muFLol = CameraUploadFragmentLollipop.newInstance(CameraUploadFragmentLollipop.TYPE_MEDIA); + } else { + refreshFragment(FragmentTag.MEDIA_UPLOADS.getTag()); } replaceFragment(muFLol, FragmentTag.MEDIA_UPLOADS.getTag()); @@ -7440,10 +7477,42 @@ public void refreshAfterMovingToRubbish(){ refreshSearch(); } + checkCameraUploadFolder(); refreshRubbishBin(); setToolbarTitle(); } + private void checkCameraUploadFolder() { + if (!CameraUploadsService.uploadingInProgress) return; + + long primaryHandle = getPrimaryFolderHandle(); + long secondaryHandle = getSecondaryFolderHandle(); + MegaPreferences prefs = dbH.getPreferences(); + boolean isSecondaryEnabled = false; + if(prefs != null) { + isSecondaryEnabled = Boolean.parseBoolean(prefs.getSecondaryMediaFolderEnabled()); + } + boolean isPrimaryFolderInRubbish = isNodeInRubbish(primaryHandle); + boolean isSecondaryFolderInRubbish = isSecondaryEnabled && isNodeInRubbish(secondaryHandle); + + if (isSecondaryFolderInRubbish && !isPrimaryFolderInRubbish) { + logDebug("MU folder is deleted, backup settings and disable MU."); + backupTimestampsAndFolderHandle(); + disableMediaUploadProcess(); + if (getSettingsFragment() != null) { + sttFLol.disableMediaUploadUIProcess(); + + } + } else if (isPrimaryFolderInRubbish) { + logDebug("CU folder is deleted, backup settings and disable CU."); + backupTimestampsAndFolderHandle(); + disableCameraUploadSettingProcess(false); + if (getSettingsFragment() != null) { + sttFLol.disableCameraUploadUIProcess(); + } + } + } + public void refreshRubbishBin () { rubbishBinFLol = (RubbishBinFragmentLollipop) getSupportFragmentManager().findFragmentByTag(FragmentTag.RUBBISH_BIN.getTag()); if (rubbishBinFLol != null){ @@ -8292,7 +8361,8 @@ public void onClick(DialogInterface dialog, int which) { if(handleList!=null){ if (handleList.size() > 0){ - MegaNode p = megaApi.getNodeByHandle(handleList.get(0)); + Long handle = handleList.get(0); + MegaNode p = megaApi.getNodeByHandle(handle); while (megaApi.getParentNode(p) != null){ p = megaApi.getParentNode(p); } @@ -8301,7 +8371,13 @@ public void onClick(DialogInterface dialog, int which) { setMoveToRubbish(true); AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(getResources().getString(R.string.confirmation_move_to_rubbish)); + if (getPrimaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + builder.setMessage(getResources().getString(R.string.confirmation_move_cu_folder_to_rubbish)); + } else if (getSecondaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + builder.setMessage(R.string.confirmation_move_mu_folder_to_rubbish); + } else { + builder.setMessage(getResources().getString(R.string.confirmation_move_to_rubbish)); + } builder.setPositiveButton(R.string.general_move, dialogClickListener); builder.setNegativeButton(R.string.general_cancel, dialogClickListener); @@ -14697,6 +14773,8 @@ public void onNodesUpdate(MegaApiJava api, ArrayList updatedNodes) { onNodesInboxUpdate(); + checkCameraUploadFolder(); + cuFL = (CameraUploadFragmentLollipop) getSupportFragmentManager().findFragmentByTag(FragmentTag.CAMERA_UPLOADS.getTag()); if (cuFL != null){ long cameraUploadHandle = cuFL.getPhotoSyncHandle(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/PinActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/PinActivityLollipop.java index c00adcc3a91..2044ff7a7f4 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/PinActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/PinActivityLollipop.java @@ -39,12 +39,9 @@ protected void onResume() { //if leave the APP then get back, should trigger camera upload. if(System.currentTimeMillis() - lastStart > 1000) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - startCameraUploadService(PinActivityLollipop.this); - } - }, 3000); + if (megaApi.getRootNode() != null && !MegaApplication.isLoggingIn()){ + startCameraUploadServiceIgnoreAttr(PinActivityLollipop.this); + } } } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java index 8c296ae511d..8713477e19c 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java @@ -44,6 +44,7 @@ import nz.mega.sdk.MegaShare; import nz.mega.sdk.MegaUser; +import static mega.privacy.android.app.jobservices.CameraUploadsService.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -750,7 +751,7 @@ private boolean isCameraUploads(MegaNode n){ } }else{ - if(n.getName().equals("Camera Uploads")){ + if(n.getName().equals(CAMERA_UPLOADS)){ if (prefs != null){ prefs.setCamSyncHandle(String.valueOf(n.getHandle())); } @@ -761,7 +762,7 @@ private boolean isCameraUploads(MegaNode n){ } }else{ - if(n.getName().equals("Camera Uploads")){ + if(n.getName().equals(CAMERA_UPLOADS)){ if (prefs != null){ prefs.setCamSyncHandle(String.valueOf(n.getHandle())); } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/controllers/AccountController.java b/app/src/main/java/mega/privacy/android/app/lollipop/controllers/AccountController.java index 44571fb3ccd..ed87ededb41 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/controllers/AccountController.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/controllers/AccountController.java @@ -6,7 +6,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -50,6 +49,7 @@ import static mega.privacy.android.app.lollipop.qrcode.MyCodeFragment.*; import static mega.privacy.android.app.utils.CacheFolderManager.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.JobUtil.*; @@ -60,9 +60,6 @@ public class AccountController { Context context; MegaApiAndroid megaApi; - MegaChatApiAndroid megaChatApi; - DatabaseHandler dbH; - MegaPreferences prefs = null; static int count = 0; @@ -78,10 +75,6 @@ public AccountController(Context context){ megaApi = ((MegaApplication) ((Activity)context).getApplication()).getMegaApi(); } } - - if (dbH == null){ - dbH = DatabaseHandler.getDbHandler(context); - } } public AccountController(Context context, MegaApiAndroid megaApi){ @@ -444,8 +437,10 @@ static public void localLogoutApp(Context context){ //clear mega contacts and reset last sync time. dbH.clearMegaContacts(); - SharedPreferences preferences = context.getSharedPreferences(MegaContactGetter.LAST_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE); - preferences.edit().putLong(MegaContactGetter.LAST_SYNC_TIMESTAMP_KEY, 0).apply(); + new MegaContactGetter(context).clearLastSyncTimeStamp(); + + // clean time stamps preference settings after logout + clearCUBackUp(); new LastShowSMSDialogTimeChecker(context).reset(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java index 0e6557c55da..61336c93e8c 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java @@ -88,6 +88,7 @@ import static mega.privacy.android.app.constants.SettingsConstants.DEFAULT_CONVENTION_QUEUE_SIZE; import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.BUSINESS_CU_FRAGMENT_CU; import static mega.privacy.android.app.MegaPreferences.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.JobUtil.*; @@ -1511,7 +1512,7 @@ public void cameraOnOff(){ } if (isEnabled){ - resetCUTimeStampsAndCache(); + resetCUTimestampsAndCache(); dbH.setCamSyncEnabled(false); dbH.deleteAllSyncRecords(SyncRecord.TYPE_ANY); stopRunningCameraUploadService(context); @@ -1524,7 +1525,7 @@ public void cameraOnOff(){ !TextUtils.isEmpty(prefs.getCamSyncFileUpload()) && !TextUtils.isEmpty(prefs.getCamSyncWifi()) ) { - resetCUTimeStampsAndCache(); + resetCUTimestampsAndCache(); dbH.setCamSyncEnabled(true); dbH.deleteAllSyncRecords(SyncRecord.TYPE_ANY); @@ -1548,7 +1549,7 @@ public void cameraOnOff(){ @Override public void onClick(DialogInterface dialog, int which) { logDebug("AlertDialog"); - resetCUTimeStampsAndCache(); + resetCUTimestampsAndCache(); dbH.setCamSyncEnabled(true); dbH.setCamSyncFileUpload(MegaPreferences.ONLY_PHOTOS); File localFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); @@ -2666,16 +2667,7 @@ public ArrayList getMonthPics() { public ArrayList getNodesArray() { return nodesArray; } - - private void resetCUTimeStampsAndCache(){ - dbH.setCamSyncTimeStamp(0); - dbH.setCamVideoSyncTimeStamp(0); - dbH.setSecSyncTimeStamp(0); - dbH.setSecVideoSyncTimeStamp(0); - dbH.saveShouldClearCamsyncRecords(true); - purgeDirectory(new File(context.getCacheDir().toString() + File.separator)); - } - + private void saveCompressionSettings(){ dbH.setCameraUploadVideoQuality(MEDIUM); dbH.setConversionOnCharging(true); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/FileBrowserFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/FileBrowserFragmentLollipop.java index e926a2fd6e5..ab26a4044dc 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/FileBrowserFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/FileBrowserFragmentLollipop.java @@ -66,6 +66,7 @@ import nz.mega.sdk.MegaNode; import nz.mega.sdk.MegaShare; +import static mega.privacy.android.app.jobservices.CameraUploadsService.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -1047,7 +1048,7 @@ public void setFolderInfoNavigation(MegaNode n){ return; } } else { - if (n.getName().equals("Camera Uploads")) { + if (n.getName().equals(CAMERA_UPLOADS)) { if (prefs != null) { prefs.setCamSyncHandle(String.valueOf(n.getHandle())); } @@ -1059,7 +1060,7 @@ public void setFolderInfoNavigation(MegaNode n){ } } else { - if (n.getName().equals("Camera Uploads")) { + if (n.getName().equals(CAMERA_UPLOADS)) { if (prefs != null) { prefs.setCamSyncHandle(String.valueOf(n.getHandle())); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/RecentsFragment.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/RecentsFragment.java index d5097fa78ef..b823599489b 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/RecentsFragment.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/RecentsFragment.java @@ -330,6 +330,7 @@ public void setVisibleContacts() { if (contacts.get(i).getVisibility() == MegaUser.VISIBILITY_VISIBLE) { long contactHandle = contacts.get(i).getHandle(); MegaContactDB contactDB = getContactDB(contactHandle); + if (contactDB == null) break; String fullName = getContactNameDB(contactDB); if (fullName == null) { fullName = contacts.get(i).getEmail(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index 640e0d3f6c0..a662dcce115 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -50,12 +50,14 @@ import mega.privacy.android.app.MegaAttributes; import mega.privacy.android.app.MegaPreferences; import mega.privacy.android.app.R; +import mega.privacy.android.app.activities.settingsActivities.ChatPreferencesActivity; import mega.privacy.android.app.activities.settingsActivities.DownloadPreferencesActivity; import mega.privacy.android.app.components.TwoLineCheckPreference; import mega.privacy.android.app.fcm.ChatAdvancedNotificationBuilder; import mega.privacy.android.app.fragments.settingsFragments.SettingsBaseFragment; import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.jobservices.SyncRecord; +import mega.privacy.android.app.listeners.SetAttrUserListener; import mega.privacy.android.app.lollipop.ChangePasswordActivityLollipop; import mega.privacy.android.app.lollipop.FileExplorerActivityLollipop; import mega.privacy.android.app.lollipop.FileStorageActivityLollipop; @@ -63,23 +65,20 @@ import mega.privacy.android.app.lollipop.MyAccountInfo; import mega.privacy.android.app.lollipop.PinLockActivityLollipop; import mega.privacy.android.app.lollipop.TwoFactorAuthenticationActivity; -import mega.privacy.android.app.activities.settingsActivities.ChatPreferencesActivity; import mega.privacy.android.app.lollipop.megachat.ChatSettings; import mega.privacy.android.app.lollipop.tasks.ClearCacheTask; import mega.privacy.android.app.lollipop.tasks.ClearOfflineTask; import mega.privacy.android.app.lollipop.tasks.GetCacheSizeTask; import mega.privacy.android.app.lollipop.tasks.GetOfflineSizeTask; import nz.mega.sdk.MegaAccountDetails; -import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaChatApi; -import nz.mega.sdk.MegaChatApiAndroid; import nz.mega.sdk.MegaChatPresenceConfig; import nz.mega.sdk.MegaNode; import static mega.privacy.android.app.constants.SettingsConstants.*; import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.BUSINESS_CU_FRAGMENT_SETTINGS; import static mega.privacy.android.app.MegaPreferences.*; -import static mega.privacy.android.app.jobservices.SyncRecord.*; +import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.FragmentTag.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.DBUtil.*; import static mega.privacy.android.app.utils.FileUtils.*; @@ -87,6 +86,8 @@ import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.PermissionUtils.*; import static mega.privacy.android.app.utils.Util.*; +import static mega.privacy.android.app.utils.CameraUploadUtil.*; +import static nz.mega.sdk.MegaApiJava.INVALID_HANDLE; @SuppressLint("NewApi") public class SettingsFragmentLollipop extends SettingsBaseFragment implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener { @@ -209,6 +210,7 @@ public class SettingsFragmentLollipop extends SettingsBaseFragment implements Pr AlertDialog compressionQueueSizeDialog; private EditText queueSizeInput; + private SetAttrUserListener setAttrUserListener; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences); @@ -955,6 +957,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa setOnlineOptions(false); } + setAttrUserListener = new SetAttrUserListener(context); + setAttrUserListener.setFragmentTag(SETTINGS); + return v; } @@ -1006,6 +1011,12 @@ public void onAttach(Context context) { this.context = context; } + @Override + public void onDestroy() { + super.onDestroy(); + setAttrUserListener = null; + } + @Override public boolean onPreferenceChange(Preference preference, Object newValue) { logDebug("onPreferenceChange"); @@ -1059,7 +1070,7 @@ else if (preference.getKey().compareTo(KEY_CAMERA_UPLOAD_WHAT_TO) == 0){ } } cameraUploadWhat.setSummary(fileUpload); - resetCUTimeStampsAndCache(); + resetCUTimestampsAndCache(); rescheduleCameraUpload(context); }else if(preference.getKey().compareTo(KEY_CAMERA_UPLOAD_VIDEO_QUALITY) == 0){ @@ -1242,12 +1253,10 @@ else if (preference.getKey().compareTo(KEY_SECONDARY_MEDIA_FOLDER_ON) == 0){ return false; } - dbH.setSecSyncTimeStamp(0); - dbH.setSecVideoSyncTimeStamp(0); - dbH.deleteAllSecondarySyncRecords(TYPE_ANY); secondaryUpload = !secondaryUpload; - if (secondaryUpload){ - dbH.setSecondaryUploadEnabled(true); + if (secondaryUpload){ + restoreSecondaryTimestampsAndSyncRecordProcess(); + dbH.setSecondaryUploadEnabled(true); secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_off)); //Check MEGA folder if(handleSecondaryMediaFolder!=null){ @@ -1301,6 +1310,7 @@ else if (preference.getKey().compareTo(KEY_LOCAL_SECONDARY_MEDIA_FOLDER) == 0){ Intent intent = new Intent(context, FileStorageActivityLollipop.class); intent.setAction(FileStorageActivityLollipop.Mode.PICK_FOLDER.getAction()); intent.putExtra(FileStorageActivityLollipop.EXTRA_FROM_SETTINGS, true); + intent.putExtra(FileStorageActivityLollipop.EXTRA_CAMERA_FOLDER, true); startActivityForResult(intent, REQUEST_LOCAL_SECONDARY_MEDIA_FOLDER); } else if (preference.getKey().compareTo(KEY_MEGA_SECONDARY_MEDIA_FOLDER) == 0){ @@ -1709,7 +1719,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent intent) { logWarning("pickedDirNAme NULL"); } - resetCUTimeStampsAndCache(); + resetCUTimestampsAndCache(); rescheduleCameraUpload(context); } else if(requestCode == SET_PIN){ @@ -1737,7 +1747,7 @@ else if (requestCode == REQUEST_CAMERA_FOLDER && resultCode == Activity.RESULT_O isExternalSDCard = false; localCameraUploadFolder.setSummary(cameraPath); localCameraUploadFolderSDCard.setSummary(cameraPath); - resetCUTimeStampsAndCache(); + resetCUTimestampsAndCache(); rescheduleCameraUpload(context); } else if (requestCode == REQUEST_LOCAL_SECONDARY_MEDIA_FOLDER && resultCode == Activity.RESULT_OK && intent != null){ @@ -1756,54 +1766,31 @@ else if (requestCode == REQUEST_LOCAL_SECONDARY_MEDIA_FOLDER && resultCode == Ac rescheduleCameraUpload(context); } else if (requestCode == REQUEST_MEGA_SECONDARY_MEDIA_FOLDER && resultCode == Activity.RESULT_OK && intent != null){ - //Mega folder to sync - - Long handle = intent.getLongExtra("SELECT_MEGA_FOLDER",-1); - if(!isNewSettingValid(prefs.getCamSyncLocalPath(), prefs.getLocalPathSecondaryFolder(), prefs.getCamSyncHandle(), String.valueOf(handle))){ - Toast.makeText(context, getString(R.string.error_invalid_folder_selected), Toast.LENGTH_LONG).show(); - return; - } - - if(handle!=-1){ - dbH.setSecondaryFolderHandle(handle); - prefs.setMegaHandleSecondaryFolder(String.valueOf(handle)); - - handleSecondaryMediaFolder = handle; - megaNodeSecondaryMediaFolder = megaApi.getNodeByHandle(handleSecondaryMediaFolder); - megaPathSecMediaFolder = megaNodeSecondaryMediaFolder.getName(); - - megaSecondaryFolder.setSummary(megaPathSecMediaFolder); - dbH.setSecSyncTimeStamp(0); - dbH.setSecVideoSyncTimeStamp(0); - rescheduleCameraUpload(context); - logDebug("Mega folder to secondary uploads change!!"); + //Secondary folder to sync + long handle = intent.getLongExtra(SELECTED_MEGA_FOLDER, INVALID_HANDLE); + if (!isNewSettingValid(prefs.getCamSyncLocalPath(), prefs.getLocalPathSecondaryFolder(), prefs.getCamSyncHandle(), String.valueOf(handle))) { + Toast.makeText(context, getString(R.string.error_invalid_folder_selected), Toast.LENGTH_LONG).show(); + return; } - else{ - logError("Error choosing the secondary uploads"); + + if (handle != INVALID_HANDLE) { + megaApi.setCameraUploadsFolderSecondary(handle, setAttrUserListener); + } else { + logError("Error choosing the Mega folder to sync the Camera"); } } else if (requestCode == REQUEST_MEGA_CAMERA_FOLDER && resultCode == Activity.RESULT_OK && intent != null){ - //Mega folder to sync - - Long handle = intent.getLongExtra("SELECT_MEGA_FOLDER",-1); + //primary folder to sync + long handle = intent.getLongExtra(SELECTED_MEGA_FOLDER,INVALID_HANDLE); if(!isNewSettingValid(prefs.getCamSyncLocalPath(), prefs.getLocalPathSecondaryFolder(), String.valueOf(handle), prefs.getMegaHandleSecondaryFolder())){ Toast.makeText(context, getString(R.string.error_invalid_folder_selected), Toast.LENGTH_LONG).show(); return; } - if(handle!=-1){ - dbH.setCamSyncHandle(handle); - prefs.setCamSyncHandle(String.valueOf(handle)); - camSyncHandle = handle; - camSyncMegaNode = megaApi.getNodeByHandle(camSyncHandle); - camSyncMegaPath = camSyncMegaNode.getName(); - megaCameraFolder.setSummary(camSyncMegaPath); - resetCUTimeStampsAndCache(); - rescheduleCameraUpload(context); - logDebug("Mega folder to sync the Camera CHANGED!!"); - } - else{ + if (handle != INVALID_HANDLE) { + megaApi.setCameraUploadsFolder(handle, setAttrUserListener); + } else { logError("Error choosing the Mega folder to sync the Camera"); } } @@ -1826,6 +1813,23 @@ public void onReceive(Context context, Intent intent) { } }; + public synchronized void setCUDestinationFolder(boolean isSecondary, long handle) { + if (isSecondary) { + //reset secondary timeline. + handleSecondaryMediaFolder = handle; + megaNodeSecondaryMediaFolder = megaApi.getNodeByHandle(handleSecondaryMediaFolder); + megaPathSecMediaFolder = megaNodeSecondaryMediaFolder.getName(); + megaSecondaryFolder.setSummary(megaPathSecMediaFolder); + } else { + //reset primary timeline. + camSyncHandle = handle; + camSyncMegaNode = megaApi.getNodeByHandle(camSyncHandle); + camSyncMegaPath = camSyncMegaNode.getName(); + megaCameraFolder.setSummary(camSyncMegaPath); + } + rescheduleCameraUpload(context); + } + @Override public void onResume() { logDebug("onResume"); @@ -2364,7 +2368,6 @@ private void setupSecondaryUpload(){ } } - megaSecondaryFolder.setSummary(megaPathSecMediaFolder); localSecondaryFolder.setSummary(localSecondaryFolderPath); secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_off)); @@ -2407,6 +2410,8 @@ public void enableCameraUpload() { //local primary folder setupLocalPathForCameraUpload(); + restorePrimaryTimestampsAndSyncRecordProcess(); + //cloud primary folder setupPrimaryCloudFolder(); @@ -2415,6 +2420,7 @@ public void enableCameraUpload() { //set cu enabled and start the service dbH.setCamSyncEnabled(true); + handler.postDelayed(new Runnable() { @Override @@ -2432,39 +2438,45 @@ public void run() { cameraUploadCategory.addPreference(secondaryMediaFolderOn); } + /** + * This method is to do the setting process + * and UI related process + */ public void disableCameraUpload(){ - logDebug("Camera Uploads OFF"); - cameraUpload = false; - resetCUTimeStampsAndCache(); - handler.postDelayed(new Runnable() { + disableCameraUploadSettingProcess(); + disableCameraUploadUIProcess(); + } - @Override - public void run() { - if(dbH.shouldClearCamsyncRecords()){ - dbH.deleteAllSyncRecords(TYPE_ANY); - dbH.saveShouldClearCamsyncRecords(false); - } - } - },10 * 1000); - - dbH.setCamSyncEnabled(false); - stopRunningCameraUploadService(context); - - cameraUploadOn.setTitle(getString(R.string.settings_camera_upload_on)); - cameraUploadOn.setSummary(""); - secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_on)); - cameraUploadCategory.removePreference(cameraUploadHow); - cameraUploadCategory.removePreference(cameraUploadWhat); - cameraUploadCategory.removePreference(localCameraUploadFolder); - cameraUploadCategory.removePreference(localCameraUploadFolderSDCard); - cameraUploadCategory.removePreference(cameraUploadIncludeGPS); + /** + * Disable MediaUpload UI related process + */ + public void disableMediaUploadUIProcess() { + logDebug("changes to sec folder only"); + secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_on)); + cameraUploadCategory.removePreference(localSecondaryFolder); + cameraUploadCategory.removePreference(megaSecondaryFolder); + } + /** + * Disable CameraUpload UI related process + */ + public void disableCameraUploadUIProcess() { + logDebug("Camera Uploads OFF"); + cameraUpload = false; + cameraUploadOn.setTitle(getString(R.string.settings_camera_upload_on)); + cameraUploadOn.setSummary(""); + secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_on)); + cameraUploadCategory.removePreference(cameraUploadHow); + cameraUploadCategory.removePreference(cameraUploadWhat); + cameraUploadCategory.removePreference(localCameraUploadFolder); + cameraUploadCategory.removePreference(localCameraUploadFolderSDCard); + cameraUploadCategory.removePreference(cameraUploadIncludeGPS); hideVideoQualitySettingsSection(); - cameraUploadCategory.removePreference(keepFileNames); - cameraUploadCategory.removePreference(megaCameraFolder); - cameraUploadCategory.removePreference(secondaryMediaFolderOn); - cameraUploadCategory.removePreference(localSecondaryFolder); - cameraUploadCategory.removePreference(megaSecondaryFolder); - } + cameraUploadCategory.removePreference(keepFileNames); + cameraUploadCategory.removePreference(megaCameraFolder); + cameraUploadCategory.removePreference(secondaryMediaFolderOn); + cameraUploadCategory.removePreference(localSecondaryFolder); + cameraUploadCategory.removePreference(megaSecondaryFolder); + } public void showResetCompressionQueueSizeDialog(){ logDebug("showResetCompressionQueueSizeDialog"); @@ -2676,15 +2688,6 @@ private boolean isNewSettingValid(String primaryPath, String secondaryPath, Stri } } - private void resetCUTimeStampsAndCache(){ - dbH.setCamSyncTimeStamp(0); - dbH.setCamVideoSyncTimeStamp(0); - dbH.setSecSyncTimeStamp(0); - dbH.setSecVideoSyncTimeStamp(0); - dbH.saveShouldClearCamsyncRecords(true); - purgeDirectory(new File(context.getCacheDir().toString() + File.separator)); - } - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/mega/privacy/android/app/receivers/CameraEventReceiver.java b/app/src/main/java/mega/privacy/android/app/receivers/CameraEventReceiver.java index defb52d4749..5255524eef3 100644 --- a/app/src/main/java/mega/privacy/android/app/receivers/CameraEventReceiver.java +++ b/app/src/main/java/mega/privacy/android/app/receivers/CameraEventReceiver.java @@ -11,6 +11,6 @@ public class CameraEventReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context,Intent intent) { - startCameraUploadService(context); + startCameraUploadServiceIgnoreAttr(context); } } \ No newline at end of file diff --git a/app/src/main/java/mega/privacy/android/app/receivers/ChargeEventReceiver.java b/app/src/main/java/mega/privacy/android/app/receivers/ChargeEventReceiver.java index 54399192668..69a944ca2ce 100644 --- a/app/src/main/java/mega/privacy/android/app/receivers/ChargeEventReceiver.java +++ b/app/src/main/java/mega/privacy/android/app/receivers/ChargeEventReceiver.java @@ -13,6 +13,6 @@ public class ChargeEventReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context,Intent intent) { logDebug("ChargeEventReceiver"); - startCameraUploadService(context); + startCameraUploadServiceIgnoreAttr(context); } } \ No newline at end of file diff --git a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java new file mode 100644 index 00000000000..31659e9c2a3 --- /dev/null +++ b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java @@ -0,0 +1,300 @@ +package mega.privacy.android.app.utils; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Handler; + +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import java.io.File; +import java.util.ArrayList; + +import mega.privacy.android.app.DatabaseHandler; +import mega.privacy.android.app.MegaApplication; +import mega.privacy.android.app.MegaPreferences; +import nz.mega.sdk.MegaApiAndroid; +import nz.mega.sdk.MegaNode; + +import static mega.privacy.android.app.jobservices.SyncRecord.TYPE_ANY; +import static mega.privacy.android.app.utils.Constants.*; +import static mega.privacy.android.app.utils.FileUtils.*; +import static mega.privacy.android.app.utils.JobUtil.*; +import static mega.privacy.android.app.utils.LogUtil.*; +import static mega.privacy.android.app.utils.TextUtil.*; +import static nz.mega.sdk.MegaApiJava.INVALID_HANDLE; + +public class CameraUploadUtil { + + /** + * Keys for backing up time stamps + */ + private static final String KEY_CAM_SYNC_TIMESTAMP = "KEY_CAM_SYNC_TIMESTAMP"; + private static final String KEY_CAM_VIDEO_SYNC_TIMESTAMP = "KEY_CAM_VIDEO_SYNC_TIMESTAMP"; + private static final String KEY_SEC_SYNC_TIMESTAMP = "KEY_SEC_SYNC_TIMESTAMP"; + private static final String KEY_SEC_VIDEO_SYNC_TIMESTAMP = "KEY_SEC_VIDEO_SYNC_TIMESTAMP"; + private static final String KEY_PRIMARY_HANDLE = "KEY_PRIMARY_HANDLE"; + private static final String KEY_SECONDARY_HANDLE = "KEY_SECONDARY_HANDLE"; + private static final String LAST_CAM_SYNC_TIMESTAMP_FILE = "LAST_CAM_SYNC_TIMESTAMP_FILE"; + + private static MegaApplication app = MegaApplication.getInstance(); + private static DatabaseHandler dbH = app.getDbH(); + + /** + * The method is to delete the timestamps backup in share preference + */ + private static void clearPrimaryBackUp() { + app.getSharedPreferences(LAST_CAM_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE).edit() + .putString(KEY_CAM_SYNC_TIMESTAMP, "") + .putString(KEY_CAM_VIDEO_SYNC_TIMESTAMP, "") + .putLong(KEY_PRIMARY_HANDLE, -2L) + .apply(); + } + + private static void clearSecondaryBackUp() { + app.getSharedPreferences(LAST_CAM_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE).edit() + .putString(KEY_SEC_SYNC_TIMESTAMP, "") + .putString(KEY_SEC_VIDEO_SYNC_TIMESTAMP, "") + .putLong(KEY_SECONDARY_HANDLE, -2L) + .apply(); + } + + public static void clearCUBackUp() { + app.getSharedPreferences(LAST_CAM_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE).edit().clear().apply(); + } + + /** + * If the handle matches the previous primary folder's handle, restore the time stamp from stamps + * if not clean the sync record from previous primary folder + */ + public static void restorePrimaryTimestampsAndSyncRecordProcess() { + SharedPreferences sharedPreferences = app.getSharedPreferences(LAST_CAM_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE); + long backupedHandle = sharedPreferences.getLong(KEY_PRIMARY_HANDLE, -2); + long detectedPrimaryKey = getPrimaryFolderHandle(); + logDebug("Primary handle in local is: " + detectedPrimaryKey + ", backuped handle is: " + backupedHandle); + if (detectedPrimaryKey == backupedHandle) { + // if the primary handle matches to previous deleted primary folder's handle, restore the time stamp + String camSyncStamp = sharedPreferences.getString(KEY_CAM_SYNC_TIMESTAMP, ""); + if (!isTextEmpty(camSyncStamp)) { + try { + dbH.setCamSyncTimeStamp(Long.parseLong(camSyncStamp)); + } catch (Exception ex) { + logError("Exception happens: " + ex.toString()); + } + } + + String camVideoSyncStamp = sharedPreferences.getString(KEY_CAM_VIDEO_SYNC_TIMESTAMP, ""); + if (!isTextEmpty(camVideoSyncStamp)) { + try { + dbH.setCamVideoSyncTimeStamp(Long.parseLong(camVideoSyncStamp)); + } catch (Exception ex) { + logError("Exception happens: " + ex.toString()); + } + } + } else { + // when primary target folder has been changed, delete primary sync records. + dbH.deleteAllPrimarySyncRecords(TYPE_ANY); + } + clearPrimaryBackUp(); + } + + /** + * If the handle matches the previous secondary folder's handle, restore the time stamp from stamps + * if not clean the sync record from previous primary folder + */ + public static void restoreSecondaryTimestampsAndSyncRecordProcess() { + SharedPreferences sharedPreferences = app.getSharedPreferences(LAST_CAM_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE); + long backupedHanlde = sharedPreferences.getLong(KEY_SECONDARY_HANDLE, -2); + long detectedSecondaryKey = getSecondaryFolderHandle(); + logDebug("Secondary handle in local is: " + detectedSecondaryKey + ", backuped handle is: " + backupedHanlde); + if (backupedHanlde == detectedSecondaryKey) { + // if the secondary handle matches to previous deleted secondary folder's handle, restore the time stamp + String secSyncStamp = sharedPreferences.getString(KEY_SEC_SYNC_TIMESTAMP, ""); + if (!isTextEmpty(secSyncStamp)) { + try { + dbH.setSecSyncTimeStamp(Long.parseLong(secSyncStamp)); + } catch (Exception ex) { + logError("Exception happens: " + ex.toString()); + } + } + + String secVideoSyncStamp = sharedPreferences.getString(KEY_SEC_VIDEO_SYNC_TIMESTAMP, ""); + if (!isTextEmpty(secVideoSyncStamp)) { + try { + dbH.setSecVideoSyncTimeStamp(Long.parseLong(secVideoSyncStamp)); + } catch (Exception ex) { + logError("Exception happens: " + ex.toString()); + } + } + } else { + // when secondary target folder has been changed, delete secondary sync records. + dbH.deleteAllSecondarySyncRecords(TYPE_ANY); + } + clearSecondaryBackUp(); + } + + /** + * The method is to backup time stamps, primary upload folder and secondary folder in share preference after + * database records being cleaned + */ + public static void backupTimestampsAndFolderHandle() { + MegaPreferences prefs = dbH.getPreferences(); + if (prefs == null) { + logError("Preference is null, while backup."); + return; + } + app.getSharedPreferences(LAST_CAM_SYNC_TIMESTAMP_FILE, Context.MODE_PRIVATE) + .edit() + .putString(KEY_CAM_SYNC_TIMESTAMP, prefs.getCamSyncTimeStamp()) + .putString(KEY_CAM_VIDEO_SYNC_TIMESTAMP, prefs.getCamVideoSyncTimeStamp()) + .putString(KEY_SEC_SYNC_TIMESTAMP, prefs.getSecSyncTimeStamp()) + .putString(KEY_SEC_VIDEO_SYNC_TIMESTAMP, prefs.getSecVideoSyncTimeStamp()) + .putLong(KEY_PRIMARY_HANDLE, getUploadFolderHandle(true)) + .putLong(KEY_SECONDARY_HANDLE, getUploadFolderHandle(false)) + .apply(); + } + + /** + * set all the time stamps to 0 for uploading, clean the cache directory for gps process + * and clean the sync record by default + */ + public static void resetCUTimestampsAndCache() { + resetCUTimestampsAndCache(true); + } + + public static void resetMUTimestampsAndCache() { + dbH.setSecSyncTimeStamp(0); + dbH.setSecVideoSyncTimeStamp(0); + } + + public static void resetCUTimestampsAndCache(boolean clearCamsynRecords) { + dbH.setCamSyncTimeStamp(0); + dbH.setCamVideoSyncTimeStamp(0); + dbH.setSecSyncTimeStamp(0); + dbH.setSecVideoSyncTimeStamp(0); + dbH.saveShouldClearCamsyncRecords(clearCamsynRecords); + purgeDirectory(new File(app.getCacheDir().toString() + SEPARATOR)); + } + + public static void resetPrimaryTimeline() { + logDebug("Reset primary timeline"); + dbH.setCamSyncTimeStamp(0); + dbH.setCamVideoSyncTimeStamp(0); + dbH.deleteAllPrimarySyncRecords(TYPE_ANY); + } + + public static void resetSecondaryTimeline() { + logDebug("Reset secondary timeline"); + dbH.setSecSyncTimeStamp(0); + dbH.setSecVideoSyncTimeStamp(0); + dbH.deleteAllSecondarySyncRecords(TYPE_ANY); + } + + public static long getPrimaryFolderHandle() { + return getUploadFolderHandle(true); + } + + public static long getSecondaryFolderHandle() { + return getUploadFolderHandle(false); + } + + /** + * @param isPrimary whether the primary upload's folder is returned + * @return the primary or secondary upload folder's handle + */ + private static long getUploadFolderHandle(boolean isPrimary) { + MegaPreferences prefs = dbH.getPreferences(); + if (prefs == null) { + return -1; + } + + String handle; + if (isPrimary) { + handle = prefs.getCamSyncHandle(); + } else { + handle = prefs.getMegaHandleSecondaryFolder(); + } + + if (isTextEmpty(handle)) { + return -1; + } else { + return Long.parseLong(handle); + } + } + + public static void disableMediaUploadProcess() { + resetMUTimestampsAndCache(); + dbH.setSecondaryUploadEnabled(false); + stopRunningCameraUploadService(app); + } + /** + * This method is to disable the CU and MU settings in database + * + * @param clearCamsyncRecords the boolean setting whether to clean the cam record + */ + public static void disableCameraUploadSettingProcess(boolean clearCamsyncRecords) { + resetCUTimestampsAndCache(clearCamsyncRecords); + new Handler().postDelayed(() -> { + if (dbH.shouldClearCamsyncRecords()) { + dbH.deleteAllSyncRecords(TYPE_ANY); + dbH.saveShouldClearCamsyncRecords(false); + } + }, 10 * 1000); + + // disable both primary and secondary. + dbH.setCamSyncEnabled(false); + dbH.setSecondaryUploadEnabled(false); + stopRunningCameraUploadService(app); + } + + /** + * This method is to disable the settings in database, clean the sync records by default + */ + public static void disableCameraUploadSettingProcess() { + disableCameraUploadSettingProcess(true); + } + + public static long findDefaultFolder(String folderName) { + MegaApiAndroid megaApi = MegaApplication.getInstance().getMegaApi(); + MegaNode node = megaApi.getNodeByPath(folderName, megaApi.getRootNode()); + if (node != null && node.isFolder() && !megaApi.isInRubbish(node)) { + return node.getHandle(); + } else { + return INVALID_HANDLE; + } + } + + /** + * Check if a newly created folder is duplicated, if yes delete the folder. + * + * @param name The name of the folder. + * @param handle The hanlde of the folder. + * @return true, the folder is duplicated, and been removed. Otherwise, false. + */ + public static boolean deleteIfDuplicated(String name, long handle) { + // only compare the folders under cloud root. + MegaApiAndroid megaApi = MegaApplication.getInstance().getMegaApi(); + ArrayList nl = megaApi.getChildren(megaApi.getRootNode()); + for (MegaNode node : nl) { + // have same name, different handle, is folder and not in rubbish bin. + if (name.equals(node.getName()) && (handle != node.getHandle()) && node.isFolder() && !megaApi.isInRubbish(node)) { + megaApi.remove(megaApi.getNodeByHandle(handle)); + return true; + } + } + return false; + } + + /** + * Force update node list's icon + * + * @param isSecondary whether the updated node is secondary folder + * @param handle the updated node handle + */ + public static void forceUpdateCameraUploadFolderIcon(boolean isSecondary, long handle) { + Intent intent = new Intent(Constants.BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE); + intent.putExtra(EXTRA_IS_CU_SECONDARY_FOLDER, isSecondary); + intent.putExtra(EXTRA_NODE_HANDLE, handle); + LocalBroadcastManager.getInstance(MegaApplication.getInstance()).sendBroadcast(intent); + } +} diff --git a/app/src/main/java/mega/privacy/android/app/utils/Constants.java b/app/src/main/java/mega/privacy/android/app/utils/Constants.java index 36164c097c8..b6b0319465f 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/Constants.java +++ b/app/src/main/java/mega/privacy/android/app/utils/Constants.java @@ -54,6 +54,8 @@ public class Constants { public static final String ACTION_CREATE_ACCOUNT_EXISTS = "ACTION_CREATE_ACCOUNT_EXISTS"; public static final String ACTION_CONFIRM = "MEGA_ACTION_CONFIRM"; public static final String EXTRA_CONFIRMATION = "MEGA_EXTRA_CONFIRMATION"; + + public static final String EXTRA_IS_CU_SECONDARY_FOLDER = "EXTRA_IS_CU_SECONDARY_FOLDER"; public static final String ACTION_FORWARD_MESSAGES = "ACTION_FORWARD_MESSAGES"; public static final String ACTION_OPEN_QR = "ACTION_OPEN_QR"; public static final String ACTION_TAKE_PICTURE = "ACTION_TAKE_PICTURE"; @@ -248,6 +250,7 @@ public class Constants { public static final String BROADCAST_ACTION_INTENT_UPDATE_ORDER = "INTENT_UPDATE_ORDER"; public static final String BROADCAST_ACTION_INTENT_UPDATE_VIEW = "INTENT_UPDATE_VIEW"; public static final String BROADCAST_ACTION_INTENT_VOICE_CLIP_DOWNLOADED = "INTENT_VOICE_CLIP_DOWNLOADED"; + public static final String BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE = "INTENT_CU_ATTR_CHANGE"; public static final String BROADCAST_ACTION_INTENT_BUSINESS_EXPIRED = "INTENT_BUSINESS_EXPIRED"; public static final String BROADCAST_ACTION_INTENT_CHAT_ARCHIVED = "INTENT_CHAT_ARCHIVED"; public static final String BROADCAST_ACTION_INTENT_CHAT_ARCHIVED_GROUP = "INTENT_CHAT_ARCHIVED_GROUP"; diff --git a/app/src/main/java/mega/privacy/android/app/utils/JobUtil.java b/app/src/main/java/mega/privacy/android/app/utils/JobUtil.java index 9a382ddf52c..329bf96831d 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/JobUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/JobUtil.java @@ -21,6 +21,7 @@ import mega.privacy.android.app.jobservices.CameraUploadsService; import nz.mega.sdk.MegaApiJava; +import static mega.privacy.android.app.jobservices.CameraUploadsService.EXTRA_IGNORE_ATTR_CHECK; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.PermissionUtils.*; @@ -36,8 +37,8 @@ public class JobUtil { private static final int PHOTOS_UPLOAD_JOB_ID = Constants.PHOTOS_UPLOAD_JOB_ID; - private static synchronized boolean isJobScheduled(Context context,int id) { - JobScheduler js = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + private static synchronized boolean isJobScheduled(Context context, int id) { + JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (js != null) { List jobs = js.getAllPendingJobs(); for (JobInfo info : jobs) { @@ -52,17 +53,17 @@ private static synchronized boolean isJobScheduled(Context context,int id) { } public static synchronized int scheduleCameraUploadJob(Context context) { - if(!isCameraUploadEnabled(context)){ + if (!isCameraUploadEnabled(context)) { logDebug("Schedule failed as CU not enabled"); return START_JOB_FAILED_NOT_ENABLED; } - if (isJobScheduled(context,PHOTOS_UPLOAD_JOB_ID)) { + if (isJobScheduled(context, PHOTOS_UPLOAD_JOB_ID)) { logDebug("Schedule failed as already scheduled"); return START_JOB_FAILED; } - JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (jobScheduler != null) { - JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(PHOTOS_UPLOAD_JOB_ID,new ComponentName(context,CameraUploadStarterService.class)); + JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(PHOTOS_UPLOAD_JOB_ID, new ComponentName(context, CameraUploadStarterService.class)); jobInfoBuilder.setPeriodic(SCHEDULER_INTERVAL); jobInfoBuilder.setPersisted(true); @@ -75,6 +76,19 @@ public static synchronized int scheduleCameraUploadJob(Context context) { } public static synchronized void startCameraUploadService(Context context) { + start(context, false); + } + + public static synchronized void startCameraUploadServiceIgnoreAttr(final Context context) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + start(context, true); + } + }, CU_RESCHEDULE_INTERVAL); + } + + private static void start(Context context, boolean shouldIgnoreAttr) { boolean isOverQuota = isOverquota(context); boolean hasReadPermission = hasPermissions(context, Manifest.permission.READ_EXTERNAL_STORAGE); boolean isEnabled = isCameraUploadEnabled(context); @@ -83,31 +97,32 @@ public static synchronized void startCameraUploadService(Context context) { ", isCameraUploadEnabled:" + isEnabled + ", isRunning:" + CameraUploadsService.isServiceRunning); if (!CameraUploadsService.isServiceRunning && !isOverQuota && hasReadPermission && isEnabled) { - Intent newIntent = new Intent(context,CameraUploadsService.class); + Intent newIntent = new Intent(context, CameraUploadsService.class); + newIntent.putExtra(EXTRA_IGNORE_ATTR_CHECK, shouldIgnoreAttr); postIntent(context, newIntent); } } private static boolean isOverquota(Context context) { - MegaApplication app = (MegaApplication)context.getApplicationContext(); + MegaApplication app = (MegaApplication) context.getApplicationContext(); return app.getStorageState() == MegaApiJava.STORAGE_STATE_RED; } public static synchronized void stopRunningCameraUploadService(Context context) { logDebug("stopRunningCameraUploadService"); - Intent stopIntent = new Intent(context,CameraUploadsService.class); + Intent stopIntent = new Intent(context, CameraUploadsService.class); stopIntent.setAction(CameraUploadsService.ACTION_STOP); postIntent(context, stopIntent); } public static synchronized void cancelAllUploads(Context context) { logDebug("stopRunningCameraUploadService"); - Intent stopIntent = new Intent(context,CameraUploadsService.class); + Intent stopIntent = new Intent(context, CameraUploadsService.class); stopIntent.setAction(CameraUploadsService.ACTION_CANCEL_ALL); postIntent(context, stopIntent); } - private static void postIntent(Context context, Intent intent){ + private static void postIntent(Context context, Intent intent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { logDebug("Starting on Oreo or above"); context.startForegroundService(intent); @@ -116,18 +131,18 @@ private static void postIntent(Context context, Intent intent){ context.startService(intent); } } - + public static void rescheduleCameraUpload(final Context context) { stopRunningCameraUploadService(context); Handler handler = new Handler(); handler.postDelayed(new Runnable() { - + @Override public void run() { logDebug("Rescheduling CU"); scheduleCameraUploadJob(context); } - },CU_RESCHEDULE_INTERVAL); + }, CU_RESCHEDULE_INTERVAL); } private static boolean isCameraUploadEnabled(Context context) { diff --git a/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java b/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java index 1323b35bc79..2fdbf38ddf4 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java @@ -32,7 +32,6 @@ import nz.mega.sdk.MegaNode; import nz.mega.sdk.MegaShare; -import static mega.privacy.android.app.jobservices.CameraUploadsService.SECONDARY_UPLOADS; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -348,12 +347,6 @@ public static boolean isCameraUploads(MegaNode n) { if (cameraSyncHandle != null && !cameraSyncHandle.isEmpty() && n.getHandle() == Long.parseLong(cameraSyncHandle)) { return true; - } else if (n.getName().equals("Camera Uploads")) { - if (prefs != null) { - prefs.setCamSyncHandle(String.valueOf(n.getHandle())); - } - dbH.setCamSyncHandle(n.getHandle()); - return true; } //Check if the item is the Media Uploads folder @@ -363,12 +356,6 @@ public static boolean isCameraUploads(MegaNode n) { if (secondaryMediaHandle != null && !secondaryMediaHandle.isEmpty() && n.getHandle() == Long.parseLong(secondaryMediaHandle)) { return true; - } else if (n.getName().equals(SECONDARY_UPLOADS)) { - if (prefs != null) { - prefs.setMegaHandleSecondaryFolder(String.valueOf(n.getHandle())); - } - dbH.setSecondaryFolderHandle(n.getHandle()); - return true; } return false; @@ -444,4 +431,24 @@ public static boolean showShareOption(int adapterType, boolean isFolderLink, lon return true; } + + /** + * @param handle node's handle to be detected + * @return whether the node is in rubbish + */ + public static boolean isNodeInRubbish(long handle){ + MegaApiAndroid megaApi = MegaApplication.getInstance().getMegaApi(); + MegaNode node = megaApi.getNodeByHandle(handle); + return node != null && megaApi.isInRubbish(node); + } + + /** + * @param handle node's handle to be detected + * @return whether the node is in rubbish + */ + public static boolean isNodeInRubbishOrDeleted(long handle){ + MegaApiAndroid megaApi = MegaApplication.getInstance().getMegaApi(); + MegaNode node = megaApi.getNodeByHandle(handle); + return node == null || megaApi.isInRubbish(node); + } } diff --git a/app/src/main/java/mega/privacy/android/app/utils/TextUtil.java b/app/src/main/java/mega/privacy/android/app/utils/TextUtil.java index 2865ca52566..6523871d281 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/TextUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/TextUtil.java @@ -3,6 +3,6 @@ public class TextUtil { public static boolean isTextEmpty(String string) { - return (string == null || string.isEmpty() || string.trim().isEmpty()) ? true : false; + return string == null || string.isEmpty() || string.trim().isEmpty(); } } diff --git a/app/src/main/java/mega/privacy/android/app/utils/contacts/MegaContactGetter.java b/app/src/main/java/mega/privacy/android/app/utils/contacts/MegaContactGetter.java index 306276908c1..92f79b5ad48 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/contacts/MegaContactGetter.java +++ b/app/src/main/java/mega/privacy/android/app/utils/contacts/MegaContactGetter.java @@ -54,6 +54,10 @@ public MegaContactGetter(Context context) { getLastSyncTimeStamp(); } + public void clearLastSyncTimeStamp() { + preferences.edit().clear().apply(); + } + private void getLastSyncTimeStamp() { lastSyncTimestamp = preferences.getLong(LAST_SYNC_TIMESTAMP_KEY, 0); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d94d6172e32..147b9f5d7f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -249,7 +249,7 @@ Cloud Drive Recents - Media uploads + Media Uploads Inbox Saved for Offline Offline @@ -267,7 +267,7 @@ Transfers My Account - Camera uploads + Camera Uploads @@ -762,7 +762,6 @@ Wi-Fi or mobile data Wi-Fi only - File Upload @@ -917,6 +916,7 @@ Logs are now enabled Logs are now disabled + Unable to setup MEGA Camera Uploads folder Logs have not been enabled because you denied the required permissions Open location @@ -1656,6 +1656,8 @@ Removing contact from shared folder Move to Rubbish Bin? + Are you sure you want to move this folder to the Rubbish Bin? This will disable Camera Uploads. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Move to Rubbish Bin? Delete from MEGA? If you leave the folder, you will not be able to see it again. From 62c4b6925a35a2068b390455abd1ed09eb14d902 Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Tue, 28 Apr 2020 11:08:21 +0200 Subject: [PATCH 006/100] Remove confirmation before rejoin to a chat link and do it automatically when pressing the link --- .../megachat/ChatActivityLollipop.java | 42 +++++-------------- app/src/main/res/values/strings.xml | 1 - 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index a8842e6a62c..d220c4bdfa6 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -176,6 +176,7 @@ import static mega.privacy.android.app.utils.ContactUtil.*; import static mega.privacy.android.app.utils.TextUtil.*; import static mega.privacy.android.app.constants.BroadcastConstants.*; +import static nz.mega.sdk.MegaChatApiJava.MEGACHAT_INVALID_HANDLE; public class ChatActivityLollipop extends DownloadableActivity implements MegaChatRequestListenerInterface, MegaRequestListenerInterface, MegaChatListenerInterface, MegaChatRoomListenerInterface, View.OnClickListener, StoreDataBeforeForward> { @@ -3324,32 +3325,6 @@ public void onClick(DialogInterface dialog, int which) { .setNegativeButton(R.string.general_cancel, dialogClickListener).show(); } - public void showConfirmationRejoinChat(final long publicHandle){ - logDebug("showConfirmationRejoinChat"); - - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which){ - case DialogInterface.BUTTON_POSITIVE: { - logDebug("Rejoin chat!: " + publicHandle); - megaChatApi.autorejoinPublicChat(idChat, publicHandle, chatActivity); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - //No button clicked - break; - } - } - } - }; - - androidx.appcompat.app.AlertDialog.Builder builder = new androidx.appcompat.app.AlertDialog.Builder(this); - String message= getResources().getString(R.string.confirmation_rejoin_chat_link); - builder.setMessage(message).setPositiveButton(R.string.action_join, dialogClickListener) - .setNegativeButton(R.string.general_cancel, dialogClickListener).show(); - } - @Override public void onBackPressed() { logDebug("onBackPressed"); @@ -7107,7 +7082,7 @@ else if(request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW){ } idChat = request.getChatHandle(); - if (idChat != MegaChatApiAndroid.MEGACHAT_INVALID_HANDLE) { + if (idChat != MEGACHAT_INVALID_HANDLE) { dbH.setLastPublicHandle(idChat); dbH.setLastPublicHandleTimeStamp(); dbH.setLastPublicHandleType(MegaApiJava.AFFILIATE_TYPE_CHAT); @@ -7120,7 +7095,7 @@ else if(request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW){ if (megaChatApi.getChatRoom(idChat).isActive()) { logWarning("ERROR: You are already a participant of the chat link or are trying to open it again"); } else { - showConfirmationRejoinChat(request.getUserHandle()); + megaChatApi.autorejoinPublicChat(idChat, request.getUserHandle(), this); } } } @@ -7140,19 +7115,22 @@ else if(request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW){ } else if(request.getType() == MegaChatRequest.TYPE_AUTOJOIN_PUBLIC_CHAT) { if (e.getErrorCode() == MegaChatError.ERROR_OK) { - if (request.getUserHandle() != -1) { //Rejoin option - showChat(null); + initializeInputText(); + titleToolbar.setText(chatRoom.getTitle()); + isOpeningChat = true; + loadHistory(); } else { //Join setChatSubtitle(); setPreviewersView(); - supportInvalidateOptionsMenu(); } + + supportInvalidateOptionsMenu(); } else { logError("ERROR WHEN JOINING CHAT " + e.getErrorCode() + " " + e.getErrorString()); - showSnackbar(MESSAGE_SNACKBAR_TYPE, getString(R.string.error_general_nodes), -1); + showSnackbar(MESSAGE_SNACKBAR_TYPE, getString(R.string.error_general_nodes), MEGACHAT_INVALID_HANDLE); } } else if(request.getType() == MegaChatRequest.TYPE_LAST_GREEN){ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d94d6172e32..47ed6a1dc74 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2287,7 +2287,6 @@ Error initialising chat when loading the chat link. - You are trying to preview a chat that you were previously a member of. Do you want to join the chat again? You are already participating in this chat. This chat preview is no longer available. If you leave the preview, you won’t be able to reopen it. From cef81198285b402d35acdb6e39c2d72c9da241e8 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 29 Apr 2020 14:15:20 +1200 Subject: [PATCH 007/100] Simple code improvement --- .../app/constants/BroadcastConstants.java | 2 ++ .../app/jobservices/CameraUploadsService.java | 13 ++++++------ .../app/listeners/GetAttrUserListener.java | 8 +++++-- .../app/listeners/SetAttrUserListener.java | 6 +++++- .../SettingsFragmentLollipop.java | 10 ++++----- .../android/app/utils/CameraUploadUtil.java | 21 ++++--------------- .../privacy/android/app/utils/Constants.java | 2 -- .../android/app/utils/MegaNodeUtil.java | 3 +++ 8 files changed, 32 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java b/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java index 78794be123a..9ed6348337f 100644 --- a/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java +++ b/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java @@ -11,6 +11,7 @@ public class BroadcastConstants { public static final String BROADCAST_ACTION_INTENT_SHOWSNACKBAR_TRANSFERS_FINISHED = "BROADCAST_ACTION_INTENT_SHOWSNACKBAR_TRANSFERS_FINISHED"; public static final String BROADCAST_ACTION_INTENT_CALL_UPDATE = "INTENT_CALL_UPDATE"; public static final String BROADCAST_ACTION_INTENT_SESSION_UPDATE = "INTENT_SESSION_UPDATE"; + public static final String BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE = "INTENT_CU_ATTR_CHANGE"; // Broadcasts' actions public static final String ACTION_ON_ACCOUNT_UPDATE = "ACTION_ON_ACCOUNT_UPDATE"; @@ -42,4 +43,5 @@ public class BroadcastConstants { public static final String UPDATE_CLIENT_ID = "UPDATE_CLIENT_ID"; public static final String UPDATE_SESSION_STATUS = "UPDATE_SESSION_STATUS"; public static final String UPDATE_SESSION_TERM_CODE = "UPDATE_SESSION_TERM_CODE"; + public static final String EXTRA_IS_CU_SECONDARY_FOLDER = "EXTRA_IS_CU_SECONDARY_FOLDER"; } diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index d9cfb7d8df5..86ee843dee5 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -80,6 +80,7 @@ import static mega.privacy.android.app.utils.Util.*; import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.FileUtil.*; +import static nz.mega.sdk.MegaApiJava.INVALID_HANDLE; public class CameraUploadsService extends Service implements NetworkTypeChangeReceiver.OnNetworkTypeChangeCallback, MegaChatRequestListenerInterface, MegaRequestListenerInterface, MegaTransferListenerInterface, VideoCompressionCallback { @@ -130,10 +131,10 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeRe private String localPath = ""; private boolean removeGPS = true; private ChatSettings chatSettings; - private long cameraUploadHandle = -1; + private long cameraUploadHandle = INVALID_HANDLE; private boolean secondaryEnabled; private String localPathSecondary = ""; - private long secondaryUploadHandle = -1; + private long secondaryUploadHandle = INVALID_HANDLE; private MegaNode secondaryUploadNode = null; private boolean isLoggingIn; @@ -1000,7 +1001,7 @@ private int shouldRun() { private int checkPrimaryFolder() { if (isNodeInRubbishOrDeleted(cameraUploadHandle)) { cameraUploadHandle = findDefaultFolder(CAMERA_UPLOADS); - if (cameraUploadHandle == -1) { + if (cameraUploadHandle == INVALID_HANDLE) { megaApi.createFolder(CAMERA_UPLOADS, megaApi.getRootNode(), createFolderListener); return TARGET_FOLDER_NOT_EXIST; } else { @@ -1031,7 +1032,7 @@ private int checkSecondaryFolder() { logDebug("the secondary uploads are enabled"); if (isNodeInRubbishOrDeleted(secondaryUploadHandle)) { secondaryUploadHandle = findDefaultFolder(SECONDARY_UPLOADS); - if (secondaryUploadHandle == -1) { + if (secondaryUploadHandle == INVALID_HANDLE) { logDebug("must create the folder"); megaApi.createFolder(SECONDARY_UPLOADS, megaApi.getRootNode(), createFolderListener); return TARGET_FOLDER_NOT_EXIST; @@ -1295,7 +1296,7 @@ public void onGetPrimaryFolderAttribute(MegaRequest request, MegaError e) { isPrimaryHandleSynced = true; long cuPrimaryHandleInUserAttr = request.getNodeHandle(); // when get an invalid hanle from cloud, need to upload local handle. - if (cuPrimaryHandleInUserAttr == -1 && cameraUploadHandle != -1) { + if (cuPrimaryHandleInUserAttr == INVALID_HANDLE && cameraUploadHandle != INVALID_HANDLE) { megaApi.setCameraUploadsFolder(cameraUploadHandle, setAttrUserListener); } else if (cameraUploadHandle != cuPrimaryHandleInUserAttr) { //cloud setting takes priority, update local handle. @@ -1316,7 +1317,7 @@ public void onGetSecondaryFolderAttribute(MegaRequest request, MegaError e) { if (e.getErrorCode() == MegaError.API_OK || e.getErrorCode() == MegaError.API_ENOENT) { isSecondaryHandleSynced = true; long cuSecondaryHandleInUserAttr = request.getNodeHandle(); - if (cuSecondaryHandleInUserAttr == -1 && secondaryUploadHandle != -1) { + if (cuSecondaryHandleInUserAttr == INVALID_HANDLE && secondaryUploadHandle != INVALID_HANDLE) { megaApi.setCameraUploadsFolderSecondary(secondaryUploadHandle, setAttrUserListener); } else if(cuSecondaryHandleInUserAttr != secondaryUploadHandle) { secondaryUploadHandle = cuSecondaryHandleInUserAttr; diff --git a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java index 8e03609295e..5b24baf9b87 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java @@ -165,7 +165,9 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { } } else { api.setCameraUploadsFolderSecondary(secondaryHandle, new SetAttrUserListener(context)); - api.renameNode(api.getNodeByHandle(secondaryHandle), SECONDARY_UPLOADS, new RenameListener(context)); + if (!SECONDARY_UPLOADS.equals(SECONDARY_UPLOADS_ENGLISH)) { + api.renameNode(api.getNodeByHandle(secondaryHandle), SECONDARY_UPLOADS, new RenameListener(context)); + } } } else { @@ -181,7 +183,9 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { } } else { api.setCameraUploadsFolder(primaryHandle, new SetAttrUserListener(context)); - api.renameNode(api.getNodeByHandle(primaryHandle), CAMERA_UPLOADS, new RenameListener(context)); + if (!CAMERA_UPLOADS.equals(CAMERA_UPLOADS_ENGLISH)) { + api.renameNode(api.getNodeByHandle(primaryHandle), CAMERA_UPLOADS, new RenameListener(context)); + } } } } else { diff --git a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java index 9665008a366..dc213a034a3 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java @@ -6,6 +6,7 @@ import mega.privacy.android.app.R; import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.ManagerActivityLollipop; +import mega.privacy.android.app.lollipop.managerSections.SettingsFragmentLollipop; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaError; import nz.mega.sdk.MegaRequest; @@ -88,7 +89,10 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { } else if (context instanceof ManagerActivityLollipop && fragmentTag == SETTINGS) { if (e.getErrorCode() == MegaError.API_OK) { - ((ManagerActivityLollipop) context).getSettingsFragment().setCUDestinationFolder(isSecondary, handle); + SettingsFragmentLollipop settingsFragment = ((ManagerActivityLollipop) context).getSettingsFragment(); + if (settingsFragment != null) { + settingsFragment.setCUDestinationFolder(isSecondary, handle); + } return; } showSnackbar(context, context.getString(R.string.error_unable_to_setup_cloud_folder)); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index a662dcce115..927129e800c 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -1814,16 +1814,18 @@ public void onReceive(Context context, Intent intent) { }; public synchronized void setCUDestinationFolder(boolean isSecondary, long handle) { + MegaNode targetNode = megaApi.getNodeByHandle(handle); + if (targetNode == null) return; if (isSecondary) { //reset secondary timeline. handleSecondaryMediaFolder = handle; - megaNodeSecondaryMediaFolder = megaApi.getNodeByHandle(handleSecondaryMediaFolder); + megaNodeSecondaryMediaFolder = targetNode; megaPathSecMediaFolder = megaNodeSecondaryMediaFolder.getName(); megaSecondaryFolder.setSummary(megaPathSecMediaFolder); } else { //reset primary timeline. camSyncHandle = handle; - camSyncMegaNode = megaApi.getNodeByHandle(camSyncHandle); + camSyncMegaNode = targetNode; camSyncMegaPath = camSyncMegaNode.getName(); megaCameraFolder.setSummary(camSyncMegaPath); } @@ -2464,7 +2466,6 @@ public void disableCameraUploadUIProcess() { cameraUpload = false; cameraUploadOn.setTitle(getString(R.string.settings_camera_upload_on)); cameraUploadOn.setSummary(""); - secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_on)); cameraUploadCategory.removePreference(cameraUploadHow); cameraUploadCategory.removePreference(cameraUploadWhat); cameraUploadCategory.removePreference(localCameraUploadFolder); @@ -2474,8 +2475,7 @@ public void disableCameraUploadUIProcess() { cameraUploadCategory.removePreference(keepFileNames); cameraUploadCategory.removePreference(megaCameraFolder); cameraUploadCategory.removePreference(secondaryMediaFolderOn); - cameraUploadCategory.removePreference(localSecondaryFolder); - cameraUploadCategory.removePreference(megaSecondaryFolder); + disableMediaUploadUIProcess(); } public void showResetCompressionQueueSizeDialog(){ diff --git a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java index 31659e9c2a3..2949fd36bd2 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java @@ -205,21 +205,12 @@ public static long getSecondaryFolderHandle() { private static long getUploadFolderHandle(boolean isPrimary) { MegaPreferences prefs = dbH.getPreferences(); if (prefs == null) { - return -1; + return INVALID_HANDLE; } - String handle; - if (isPrimary) { - handle = prefs.getCamSyncHandle(); - } else { - handle = prefs.getMegaHandleSecondaryFolder(); - } + String handle = isPrimary ? prefs.getCamSyncHandle() : prefs.getMegaHandleSecondaryFolder(); - if (isTextEmpty(handle)) { - return -1; - } else { - return Long.parseLong(handle); - } + return isTextEmpty(handle) ? INVALID_HANDLE : Long.parseLong(handle); } public static void disableMediaUploadProcess() { @@ -257,11 +248,7 @@ public static void disableCameraUploadSettingProcess() { public static long findDefaultFolder(String folderName) { MegaApiAndroid megaApi = MegaApplication.getInstance().getMegaApi(); MegaNode node = megaApi.getNodeByPath(folderName, megaApi.getRootNode()); - if (node != null && node.isFolder() && !megaApi.isInRubbish(node)) { - return node.getHandle(); - } else { - return INVALID_HANDLE; - } + return node != null && node.isFolder() && !megaApi.isInRubbish(node) ? node.getHandle() : INVALID_HANDLE; } /** diff --git a/app/src/main/java/mega/privacy/android/app/utils/Constants.java b/app/src/main/java/mega/privacy/android/app/utils/Constants.java index b6b0319465f..facbe9f7d5a 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/Constants.java +++ b/app/src/main/java/mega/privacy/android/app/utils/Constants.java @@ -55,7 +55,6 @@ public class Constants { public static final String ACTION_CONFIRM = "MEGA_ACTION_CONFIRM"; public static final String EXTRA_CONFIRMATION = "MEGA_EXTRA_CONFIRMATION"; - public static final String EXTRA_IS_CU_SECONDARY_FOLDER = "EXTRA_IS_CU_SECONDARY_FOLDER"; public static final String ACTION_FORWARD_MESSAGES = "ACTION_FORWARD_MESSAGES"; public static final String ACTION_OPEN_QR = "ACTION_OPEN_QR"; public static final String ACTION_TAKE_PICTURE = "ACTION_TAKE_PICTURE"; @@ -250,7 +249,6 @@ public class Constants { public static final String BROADCAST_ACTION_INTENT_UPDATE_ORDER = "INTENT_UPDATE_ORDER"; public static final String BROADCAST_ACTION_INTENT_UPDATE_VIEW = "INTENT_UPDATE_VIEW"; public static final String BROADCAST_ACTION_INTENT_VOICE_CLIP_DOWNLOADED = "INTENT_VOICE_CLIP_DOWNLOADED"; - public static final String BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE = "INTENT_CU_ATTR_CHANGE"; public static final String BROADCAST_ACTION_INTENT_BUSINESS_EXPIRED = "INTENT_BUSINESS_EXPIRED"; public static final String BROADCAST_ACTION_INTENT_CHAT_ARCHIVED = "INTENT_CHAT_ARCHIVED"; public static final String BROADCAST_ACTION_INTENT_CHAT_ARCHIVED_GROUP = "INTENT_CHAT_ARCHIVED_GROUP"; diff --git a/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java b/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java index 2fdbf38ddf4..fde6c197bdb 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java @@ -433,6 +433,7 @@ public static boolean showShareOption(int adapterType, boolean isFolderLink, lon } /** + * This method is to detect whether the node exist and in rubbish bean * @param handle node's handle to be detected * @return whether the node is in rubbish */ @@ -443,6 +444,8 @@ public static boolean isNodeInRubbish(long handle){ } /** + * This method is to detect whether the node has been deleted completely + * or in rubbish bin * @param handle node's handle to be detected * @return whether the node is in rubbish */ From f2b023ef5046d7cce70ddddf29d549aad0df2ea7 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 29 Apr 2020 15:11:03 +1200 Subject: [PATCH 008/100] Remove the delete duplicated folder action --- .../app/jobservices/CameraUploadsService.java | 8 ++----- .../app/listeners/CreateFolderListener.java | 5 ++-- .../android/app/utils/CameraUploadUtil.java | 24 ++----------------- 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 86ee843dee5..5dc31b86bd5 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -1348,14 +1348,10 @@ public void onCreateFolder(MegaRequest request, MegaError e) { long handle = request.getNodeHandle(); if (CAMERA_UPLOADS.equals(name)) { // check if other client has created this folder already, if yes, delete it. - if(!deleteIfDuplicated(name, handle)) { - megaApi.setCameraUploadsFolder(handle, setAttrUserListener); - } + megaApi.setCameraUploadsFolder(handle, setAttrUserListener); } if (SECONDARY_UPLOADS.equals(name)) { - if(!deleteIfDuplicated(name, handle)) { - megaApi.setCameraUploadsFolderSecondary(handle, setAttrUserListener); - } + megaApi.setCameraUploadsFolderSecondary(handle, setAttrUserListener); } } else { finish(); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java index ac7735b0485..fae412f0a49 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java @@ -15,7 +15,6 @@ import static mega.privacy.android.app.jobservices.CameraUploadsService.CAMERA_UPLOADS; import static mega.privacy.android.app.jobservices.CameraUploadsService.SECONDARY_UPLOADS; -import static mega.privacy.android.app.utils.CameraUploadUtil.deleteIfDuplicated; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -89,9 +88,9 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { ((CameraUploadsService) context).onCreateFolder(request, e); } else if (context instanceof MegaApplication) { if (e.getErrorCode() == MegaError.API_OK) { - if (name.equals(CAMERA_UPLOADS) && !deleteIfDuplicated(name, handle)) { + if (name.equals(CAMERA_UPLOADS)) { api.setCameraUploadsFolder(handle, new SetAttrUserListener(context)); - }else if (name.equals(SECONDARY_UPLOADS) && !deleteIfDuplicated(name, handle)) { + } else if (name.equals(SECONDARY_UPLOADS)) { api.setCameraUploadsFolderSecondary(handle, new SetAttrUserListener(context)); } } diff --git a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java index 2949fd36bd2..bb75b58d38a 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java @@ -16,6 +16,7 @@ import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaNode; +import static mega.privacy.android.app.constants.BroadcastConstants.*; import static mega.privacy.android.app.jobservices.SyncRecord.TYPE_ANY; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; @@ -251,27 +252,6 @@ public static long findDefaultFolder(String folderName) { return node != null && node.isFolder() && !megaApi.isInRubbish(node) ? node.getHandle() : INVALID_HANDLE; } - /** - * Check if a newly created folder is duplicated, if yes delete the folder. - * - * @param name The name of the folder. - * @param handle The hanlde of the folder. - * @return true, the folder is duplicated, and been removed. Otherwise, false. - */ - public static boolean deleteIfDuplicated(String name, long handle) { - // only compare the folders under cloud root. - MegaApiAndroid megaApi = MegaApplication.getInstance().getMegaApi(); - ArrayList nl = megaApi.getChildren(megaApi.getRootNode()); - for (MegaNode node : nl) { - // have same name, different handle, is folder and not in rubbish bin. - if (name.equals(node.getName()) && (handle != node.getHandle()) && node.isFolder() && !megaApi.isInRubbish(node)) { - megaApi.remove(megaApi.getNodeByHandle(handle)); - return true; - } - } - return false; - } - /** * Force update node list's icon * @@ -279,7 +259,7 @@ public static boolean deleteIfDuplicated(String name, long handle) { * @param handle the updated node handle */ public static void forceUpdateCameraUploadFolderIcon(boolean isSecondary, long handle) { - Intent intent = new Intent(Constants.BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE); + Intent intent = new Intent(BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE); intent.putExtra(EXTRA_IS_CU_SECONDARY_FOLDER, isSecondary); intent.putExtra(EXTRA_NODE_HANDLE, handle); LocalBroadcastManager.getInstance(MegaApplication.getInstance()).sendBroadcast(intent); From e72f7b4973280842433fda6741d8f535d5b7cd80 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 29 Apr 2020 16:37:18 +1200 Subject: [PATCH 009/100] Refactor as instructed --- .../app/jobservices/CameraUploadsService.java | 16 ++++++++++------ .../android/app/listeners/BaseListener.java | 10 ---------- .../app/listeners/GetAttrUserListener.java | 2 ++ .../app/listeners/SetAttrUserListener.java | 11 +++++++++++ .../app/lollipop/ManagerActivityLollipop.java | 12 ++++-------- .../SettingsFragmentLollipop.java | 9 +-------- 6 files changed, 28 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 5dc31b86bd5..9ce4498b344 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -984,6 +984,12 @@ private int shouldRun() { return CHECKING_USER_ATTRIBUTE; } + if (!ignoreAttr && !isSecondaryHandleSynced) { + logDebug("Try to get Camera Uploads primary target folder."); + megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); + return CHECKING_USER_ATTRIBUTE; + } + int primaryFolderResult = checkPrimaryFolder(); int secondaryFolderResult = checkSecondaryFolder(); @@ -991,11 +997,7 @@ private int shouldRun() { return primaryFolderResult; } - if (secondaryFolderResult != 0) { - return secondaryFolderResult; - } - - return 0; + return secondaryFolderResult; } private int checkPrimaryFolder() { @@ -1305,7 +1307,9 @@ public void onGetPrimaryFolderAttribute(MegaRequest request, MegaError e) { resetPrimaryTimeline(); } // start to get secondary handle. - megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); + if (!isSecondaryHandleSynced) { + megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); + } } else { logWarning("Get primary handle faild, finish process."); finish(); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java b/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java index 2bab771243c..127e2f82ece 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/BaseListener.java @@ -4,8 +4,6 @@ import mega.privacy.android.app.DatabaseHandler; import mega.privacy.android.app.MegaApplication; -import mega.privacy.android.app.MegaPreferences; -import mega.privacy.android.app.lollipop.ManagerActivityLollipop.*; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaError; import nz.mega.sdk.MegaRequest; @@ -13,20 +11,12 @@ public class BaseListener implements MegaRequestListenerInterface { - // FragmentTag is for storing the fragment which has the api call within Activity Context - protected FragmentTag fragmentTag; protected Context context; protected DatabaseHandler dBH; - protected MegaPreferences prefs; public BaseListener(Context context) { this.context = context; dBH = MegaApplication.getInstance().getDbH(); - prefs = dBH.getPreferences(); - } - - public void setFragmentTag(FragmentTag fragmentTag) { - this.fragmentTag = fragmentTag; } @Override diff --git a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java index 5b24baf9b87..47465503266 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java @@ -3,6 +3,7 @@ import android.content.Context; import mega.privacy.android.app.MegaApplication; +import mega.privacy.android.app.MegaPreferences; import mega.privacy.android.app.R; import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.FileExplorerActivityLollipop; @@ -149,6 +150,7 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { } } else if (e.getErrorCode() == MegaError.API_OK) { synchronized (this) { + MegaPreferences prefs = dBH.getPreferences(); long handleInUserAttr = request.getNodeHandle(); if (isNodeInRubbishOrDeleted(handleInUserAttr)) { boolean isSecondary = request.getFlag(); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java index dc213a034a3..32b9e0e6507 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java @@ -3,6 +3,7 @@ import android.content.Context; import mega.privacy.android.app.MegaApplication; +import mega.privacy.android.app.MegaPreferences; import mega.privacy.android.app.R; import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.ManagerActivityLollipop; @@ -19,13 +20,22 @@ import static mega.privacy.android.app.utils.TextUtil.*; import static nz.mega.sdk.MegaApiJava.*; import static mega.privacy.android.app.utils.ContactUtil.*; +import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.*; public class SetAttrUserListener extends BaseListener { + // FragmentTag is for storing the fragment which has the api call within Activity Context + private FragmentTag fragmentTag; + public SetAttrUserListener(Context context) { super(context); } + public SetAttrUserListener(Context context, FragmentTag fragmentTag) { + super(context); + this.fragmentTag = fragmentTag; + } + @Override public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { if (request.getType() != MegaRequest.TYPE_SET_ATTR_USER) return; @@ -70,6 +80,7 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { case USER_ATTR_CAMERA_UPLOADS_FOLDER: long handle = request.getNodeHandle(); boolean isSecondary = request.getFlag(); + MegaPreferences prefs = dBH.getPreferences(); // Database and preference update if (e.getErrorCode() == MegaError.API_OK) { if (isSecondary) { diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java index 5d44aaf87ad..42667c2b91e 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java @@ -914,14 +914,10 @@ public void onReceive(Context context, Intent intent) { synchronized (this){ long handleInUserAttr = intent.getLongExtra(EXTRA_NODE_HANDLE, -1); boolean isSecondary = intent.getBooleanExtra(EXTRA_IS_CU_SECONDARY_FOLDER, false); - if (isSecondary) { - if (drawerItem == DrawerItem.MEDIA_UPLOADS) { - secondaryMediaUploadsClicked(); - } - } else { - if (drawerItem == DrawerItem.CAMERA_UPLOADS) { - cameraUploadsClicked(); - } + if (isSecondary && drawerItem == DrawerItem.MEDIA_UPLOADS) { + secondaryMediaUploadsClicked(); + } else if (!isSecondary && drawerItem == DrawerItem.CAMERA_UPLOADS) { + cameraUploadsClicked(); } //refresh settings if user is on that page diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index 927129e800c..135ae7688eb 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -957,8 +957,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa setOnlineOptions(false); } - setAttrUserListener = new SetAttrUserListener(context); - setAttrUserListener.setFragmentTag(SETTINGS); + setAttrUserListener = new SetAttrUserListener(context, SETTINGS); return v; } @@ -1011,12 +1010,6 @@ public void onAttach(Context context) { this.context = context; } - @Override - public void onDestroy() { - super.onDestroy(); - setAttrUserListener = null; - } - @Override public boolean onPreferenceChange(Preference preference, Object newValue) { logDebug("onPreferenceChange"); From 2a808e2a3e68cc7d901b9e1aefc356fcf34a34f8 Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Wed, 29 Apr 2020 12:57:50 +0200 Subject: [PATCH 010/100] When rejoining a chat link conversation, if some messages where received while the user was not participating in it, they are not received until they logged out and logged in (Bug #15492) --- .../CreateGroupChatWithPublicLink.java | 2 +- .../megachat/ChatActivityLollipop.java | 217 +++++++++--------- .../privacy/android/app/utils/Constants.java | 1 + 3 files changed, 110 insertions(+), 110 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/listeners/CreateGroupChatWithPublicLink.java b/app/src/main/java/mega/privacy/android/app/lollipop/listeners/CreateGroupChatWithPublicLink.java index 686bd87dd4e..3f62bdf243d 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/listeners/CreateGroupChatWithPublicLink.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/listeners/CreateGroupChatWithPublicLink.java @@ -72,7 +72,7 @@ else if (request.getType() == MegaChatRequest.TYPE_CHAT_LINK_HANDLE) { intent.setAction(ACTION_CHAT_SHOW_MESSAGES); intent.putExtra("CHAT_ID", request.getChatHandle()); intent.putExtra("PUBLIC_LINK", e.getErrorCode()); - intent.putExtra("CHAT_LINK", request.getText()); + intent.putExtra(CHAT_LINK_EXTRA, request.getText()); context.startActivity(intent); } else if(context instanceof FileExplorerActivityLollipop){ diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index bf070c8e702..0b7decacdcd 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -1277,7 +1277,7 @@ else if (errorCode != 1 && errorCode == MegaChatError.ERROR_OK && !isShareLinkDi text = getString(R.string.chat_link_copied_clipboard); } } - showChat(text); + initAndShowChat(text); } } } @@ -1359,109 +1359,108 @@ private void updateTitle() { titleToolbar.setText(chatRoom.getTitle()); } - private void showChat(String textSnackbar){ - if(idChat!=-1) { - //Recover chat - logDebug("Recover chat with id: " + idChat); - chatRoom = megaChatApi.getChatRoom(idChat); - if(chatRoom==null){ - logError("Chatroom is NULL - finish activity!!"); - finish(); - } + /** + * Opens a new chat conversation, checking if the id is valid and if the ChatRoom exists. + * If an error ocurred opening the chat, an error dialog is shown. + * + * @return True if the chat was successfully opened, false otherwise + */ + private boolean initChat() { + if (idChat == MEGACHAT_INVALID_HANDLE) { + logError("Chat ID -1 error"); + return false; + } - megaChatApi.closeChatRoom(idChat, this); - boolean result = megaChatApi.openChatRoom(idChat, this); + //Recover chat + logDebug("Recover chat with id: " + idChat); + chatRoom = megaChatApi.getChatRoom(idChat); + if (chatRoom == null) { + logError("Chatroom is NULL - finish activity!!"); + finish(); + } - logDebug("Result of open chat: " + result); - if(result){ - MegaApplication.setClosedChat(false); - } + megaChatApi.closeChatRoom(idChat, this); + if (megaChatApi.openChatRoom(idChat, this)) { + MegaApplication.setClosedChat(false); + return true; + } - if(!result){ - logError("Error on openChatRoom"); - if(errorOpenChatDialog==null){ - androidx.appcompat.app.AlertDialog.Builder builder; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); - } - else{ - builder = new AlertDialog.Builder(this); - } - builder.setTitle(getString(R.string.chat_error_open_title)); - builder.setMessage(getString(R.string.chat_error_open_message)); + logError("Error openChatRoom"); + if (errorOpenChatDialog == null) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.chat_error_open_title)) + .setMessage(getString(R.string.chat_error_open_message)) + .setPositiveButton(getString(R.string.general_ok), (dialog, whichButton) -> finish()); - builder.setPositiveButton(getString(R.string.general_ok), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - finish(); - } - } - ); - errorOpenChatDialog = builder.create(); - errorOpenChatDialog.show(); - } - } - else { - initializeInputText(); - int chatConnection = megaChatApi.getChatConnectionState(idChat); - logDebug("Chat connection (" + idChat + ") is: " + chatConnection); - if (adapter == null) { - createAdapter(); - }else { - adapter.notifyDataSetChanged(); - } - setPreviewersView(); - titleToolbar.setText(chatRoom.getTitle()); - setChatSubtitle(); - if (!chatRoom.isPublic()) { - privateIconToolbar.setVisibility(View.VISIBLE); - } - else { - privateIconToolbar.setVisibility(View.GONE); - } + errorOpenChatDialog = builder.create(); + errorOpenChatDialog.show(); + } + return false; + } - isOpeningChat = true; + /** + * Opens a new chat conversation. + * If it went well, shows the chat with the empty state and requests messages. + * + * @param textSnackbar if there is a chat link involved in the action, it it indicates the "Copy chat link" dialog has to be shown. + * If not, a simple Snackbar has to be shown with this text. + */ + private void initAndShowChat(String textSnackbar) { + if (!initChat()) { + return; + } - String textToShowB = String.format(getString(R.string.chat_loading_messages)); + initializeInputText(); - try { - textToShowB = textToShowB.replace("[A]", ""); - textToShowB = textToShowB.replace("[/A]", ""); - textToShowB = textToShowB.replace("[B]", ""); - textToShowB = textToShowB.replace("[/B]", ""); - } catch (Exception e) { - } - Spanned resultB = null; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { - resultB = Html.fromHtml(textToShowB, Html.FROM_HTML_MODE_LEGACY); - } else { - resultB = Html.fromHtml(textToShowB); - } + int chatConnection = megaChatApi.getChatConnectionState(idChat); + logDebug("Chat connection (" + idChat + ") is: " + chatConnection); - emptyScreen(resultB.toString()); + if (adapter == null) { + createAdapter(); + } else { + adapter.notifyDataSetChanged(); + } - if(textSnackbar!=null){ - String chatLink = getIntent().getStringExtra("CHAT_LINK"); - if (chatLink != null && !isShareLinkDialogDismissed) { - showShareChatLinkDialog(this, chatRoom, chatLink); - } - else { - showSnackbar(SNACKBAR_TYPE, textSnackbar, -1); - } - } + setPreviewersView(); + titleToolbar.setText(chatRoom.getTitle()); + setChatSubtitle(); - loadHistory(); - logDebug("On create: stateHistory: " + stateHistory); - if (isLocationDialogShown) { - showSendLocationDialog(); - } - } + if (!chatRoom.isPublic()) { + privateIconToolbar.setVisibility(View.VISIBLE); + } else { + privateIconToolbar.setVisibility(View.GONE); } - else{ - logError("Chat ID -1 error"); + + isOpeningChat = true; + + String textToShowB = String.format(getString(R.string.chat_loading_messages)); + + try { + textToShowB = textToShowB.replace("[A]", ""); + textToShowB = textToShowB.replace("[/A]", ""); + textToShowB = textToShowB.replace("[B]", ""); + textToShowB = textToShowB.replace("[/B]", ""); + } catch (Exception e) { + logWarning("Exception formatting string", e); } - logDebug("FINISH on Create"); + emptyScreen(getSpannedHtmlText(textToShowB).toString()); + + if (!isTextEmpty(textSnackbar)) { + String chatLink = getIntent().getStringExtra(CHAT_LINK_EXTRA); + + if (!isTextEmpty(chatLink) && !isShareLinkDialogDismissed) { + showShareChatLinkDialog(this, chatRoom, chatLink); + } else { + showSnackbar(SNACKBAR_TYPE, textSnackbar, MEGACHAT_INVALID_HANDLE); + } + } + + loadHistory(); + logDebug("On create: stateHistory: " + stateHistory); + if (isLocationDialogShown) { + showSendLocationDialog(); + } } private void emptyScreen(String text){ @@ -7074,13 +7073,13 @@ else if(request.getType() == MegaChatRequest.TYPE_ATTACH_NODE_MESSAGE){ logError("ERROR WHEN CREATING CHAT " + e.getErrorString()); showSnackbar(SNACKBAR_TYPE, getString(R.string.create_chat_error), -1); } - } - else if(request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW){ - if(e.getErrorCode()==MegaChatError.ERROR_OK || e.getErrorCode()==MegaChatError.ERROR_EXIST){ - if (idChat != -1 && megaChatApi.getChatRoom(idChat) != null) { + } else if (request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW) { + if (e.getErrorCode() == MegaChatError.ERROR_OK || e.getErrorCode() == MegaChatError.ERROR_EXIST) { + if (idChat != MEGACHAT_INVALID_HANDLE && megaChatApi.getChatRoom(idChat) != null) { logDebug("Close previous chat"); megaChatApi.closeChatRoom(idChat, this); } + idChat = request.getChatHandle(); megaChatApi.addChatListener(this); @@ -7091,33 +7090,34 @@ else if(request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW){ } MegaApplication.setOpenChatId(idChat); - showChat(null); - supportInvalidateOptionsMenu(); + if (e.getErrorCode() == MegaChatError.ERROR_EXIST) { if (megaChatApi.getChatRoom(idChat).isActive()) { logWarning("ERROR: You are already a participant of the chat link or are trying to open it again"); - } else { + } else if (initChat()) { + //Chat successfully initialized, now can rejoin megaChatApi.autorejoinPublicChat(idChat, request.getUserHandle(), this); + } else { + logWarning("Error opening chat before rejoin"); } + } else { + initAndShowChat(null); + supportInvalidateOptionsMenu(); } - } - else { - + } else { String text; - if(e.getErrorCode()==MegaChatError.ERROR_NOENT){ + if (e.getErrorCode() == MegaChatError.ERROR_NOENT) { text = getString(R.string.invalid_chat_link); - } - else{ + } else { showSnackbar(MESSAGE_SNACKBAR_TYPE, getString(R.string.error_general_nodes), -1); text = getString(R.string.error_chat_link); } emptyScreen(text); } - } - else if(request.getType() == MegaChatRequest.TYPE_AUTOJOIN_PUBLIC_CHAT) { + } else if (request.getType() == MegaChatRequest.TYPE_AUTOJOIN_PUBLIC_CHAT) { if (e.getErrorCode() == MegaChatError.ERROR_OK) { - if (request.getUserHandle() != -1) { + if (request.getUserHandle() != MEGACHAT_INVALID_HANDLE) { //Rejoin option initializeInputText(); titleToolbar.setText(chatRoom.getTitle()); @@ -7134,8 +7134,7 @@ else if(request.getType() == MegaChatRequest.TYPE_AUTOJOIN_PUBLIC_CHAT) { logError("ERROR WHEN JOINING CHAT " + e.getErrorCode() + " " + e.getErrorString()); showSnackbar(MESSAGE_SNACKBAR_TYPE, getString(R.string.error_general_nodes), MEGACHAT_INVALID_HANDLE); } - } - else if(request.getType() == MegaChatRequest.TYPE_LAST_GREEN){ + } else if(request.getType() == MegaChatRequest.TYPE_LAST_GREEN){ logDebug("TYPE_LAST_GREEN requested"); }else if(request.getType() == MegaChatRequest.TYPE_ARCHIVE_CHATROOM){ diff --git a/app/src/main/java/mega/privacy/android/app/utils/Constants.java b/app/src/main/java/mega/privacy/android/app/utils/Constants.java index 36164c097c8..a84ffeef8c3 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/Constants.java +++ b/app/src/main/java/mega/privacy/android/app/utils/Constants.java @@ -444,6 +444,7 @@ public class Constants { public static final String USER_HANDLES = "USER_HANDLES"; public static final String URL_FILE_LINK = "URL_FILE_LINK"; public static final String OPEN_SCAN_QR = "OPEN_SCAN_QR"; + public static final String CHAT_LINK_EXTRA = "CHAT_LINK"; public static final String SHOW_MESSAGE_UPLOAD_STARTED = "SHOW_MESSAGE_UPLOAD_STARTED"; public static final String NUMBER_UPLOADS = "NUMBER_UPLOADS"; From 0108ae919b2316add47297a4c19283eeefcaf5ac Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Wed, 29 Apr 2020 23:01:32 +0200 Subject: [PATCH 011/100] Code improvements --- .../megachat/ChatActivityLollipop.java | 48 ++++++------------- .../chatAdapters/MegaChatLollipopAdapter.java | 19 ++++---- .../GeneralChatMessageBottomSheet.java | 15 +----- 3 files changed, 25 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index a81338f6aea..b7a43ddf7c3 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -3824,15 +3824,15 @@ public void showUploadPanel(){ bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); } - private void activateActionMode(){ - if (!adapter.isMultipleSelect()){ + private void activateActionMode() { + if (!adapter.isMultipleSelect()) { adapter.setMultipleSelect(true); actionMode = startSupportActionMode(new ActionBarCallBack()); updateActionModeTitle(); } } - public void activateActionModeWithItem(int positionInAdapter){ + public void activateActionModeWithItem(int positionInAdapter) { activateActionMode(); if (adapter.isMultipleSelect()) { itemClick((positionInAdapter + 1), null); @@ -3876,7 +3876,6 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { clipboard.setPrimaryClip(clip); } showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); - } break; @@ -3974,7 +3973,6 @@ public boolean onPrepareActionMode(ActionMode mode, Menu menu) { menu.findItem(R.id.chat_cab_menu_offline).setVisible(false); importIcon.setVisible(false); - }else { if((chatRoom.getOwnPrivilege()==MegaChatRoom.PRIV_RM||chatRoom.getOwnPrivilege()==MegaChatRoom.PRIV_RO) && !chatRoom.isPreview()){ @@ -4328,9 +4326,9 @@ private void clearSelections() { public void updateActionModeTitle() { try { if (actionMode != null) { - if(adapter.getSelectedItemCount() == 0){ + if (adapter.getSelectedItemCount() == 0) { actionMode.setTitle(getString(R.string.select_message_title).toUpperCase()); - }else{ + } else { actionMode.setTitle(adapter.getSelectedItemCount() + ""); } actionMode.invalidate(); @@ -4351,7 +4349,6 @@ public void hideMultipleSelect() { if (actionMode != null) { actionMode.finish(); } - } public void finishMultiselectionMode() { @@ -4763,34 +4760,19 @@ else if(m.getMessage().getType()==MegaChatMessage.TYPE_CONTACT_ATTACHMENT){ }else{ String url = richLinkMessage.getUrl(); - if(richLinkMessage.isChat()){ + if (richLinkMessage.isChat()) { loadChatLink(url); - } - else{ - if(richLinkMessage.getNode()!=null){ - if(richLinkMessage.getNode().isFile()){ - openMegaLink(url, true); - } - else{ - openMegaLink(url, false); - } - } - else{ - if(richLinkMessage.isFile()){ - openMegaLink(url, true); - } - else{ - openMegaLink(url, false); - } - } + } else if (richLinkMessage.getNode() != null) { + openMegaLink(url, richLinkMessage.getNode().isFile()); + } else { + openMegaLink(url, richLinkMessage.isFile()); + } } - } } } } - } }else{ logDebug("DO NOTHING: Position (" + positionInMessages + ") is more than size in messages (size: " + messages.size() + ")"); @@ -6933,7 +6915,7 @@ public void showContactAttachmentBottomSheet(AndroidMegaChatMessage message, int bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); } - public void showGeneralChatMessageBottomSheet(AndroidMegaChatMessage message, int position){ + public void showGeneralChatMessageBottomSheet(AndroidMegaChatMessage message, int position) { selectedPosition = position; if (message == null || isBottomSheetDialogShown(bottomSheetDialogFragment)) return; @@ -7721,9 +7703,9 @@ public void onClick(DialogInterface dialog, int whichButton) { } public boolean hasMessagesRemoved(MegaChatMessage messageSelected) { - if(removedMessages != null && !removedMessages.isEmpty()){ - for(int i=0; i Date: Thu, 30 Apr 2020 12:23:42 +1200 Subject: [PATCH 012/100] 1. Fix crash issue from preference not init 2. Fix moved rubbish node icon issue --- .../android/app/listeners/SetAttrUserListener.java | 1 + .../mega/privacy/android/app/utils/MegaNodeUtil.java | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java index 32b9e0e6507..874a64c9766 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/SetAttrUserListener.java @@ -83,6 +83,7 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { MegaPreferences prefs = dBH.getPreferences(); // Database and preference update if (e.getErrorCode() == MegaError.API_OK) { + if (prefs == null) return; if (isSecondary) { resetSecondaryTimeline(); dBH.setSecondaryFolderHandle(handle); diff --git a/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java b/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java index fde6c197bdb..5f2639bea32 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/MegaNodeUtil.java @@ -345,7 +345,10 @@ public static boolean isCameraUploads(MegaNode n) { cameraSyncHandle = prefs.getCamSyncHandle(); } - if (cameraSyncHandle != null && !cameraSyncHandle.isEmpty() && n.getHandle() == Long.parseLong(cameraSyncHandle)) { + long handle = n.getHandle(); + + if (cameraSyncHandle != null && !cameraSyncHandle.isEmpty() + && handle == Long.parseLong(cameraSyncHandle) && !isNodeInRubbishOrDeleted(handle) ) { return true; } @@ -354,11 +357,8 @@ public static boolean isCameraUploads(MegaNode n) { secondaryMediaHandle = prefs.getMegaHandleSecondaryFolder(); } - if (secondaryMediaHandle != null && !secondaryMediaHandle.isEmpty() && n.getHandle() == Long.parseLong(secondaryMediaHandle)) { - return true; - } - - return false; + return secondaryMediaHandle != null && !secondaryMediaHandle.isEmpty() + && handle == Long.parseLong(secondaryMediaHandle) && !isNodeInRubbishOrDeleted(handle); } /** From c8f34aff86396afe12f21802c3f9d6c34e6fcb3e Mon Sep 17 00:00:00 2001 From: Chris Li Date: Thu, 30 Apr 2020 13:55:34 +1200 Subject: [PATCH 013/100] Fix the issue that If I have MU disabled and a folder named Media Uploads exists and then I enable MU that folder is not updated with the icon --- .../SettingsFragmentLollipop.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index 135ae7688eb..7717b3fbe61 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -76,6 +76,7 @@ import nz.mega.sdk.MegaNode; import static mega.privacy.android.app.constants.SettingsConstants.*; +import static mega.privacy.android.app.jobservices.CameraUploadsService.*; import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.BUSINESS_CU_FRAGMENT_SETTINGS; import static mega.privacy.android.app.MegaPreferences.*; import static mega.privacy.android.app.lollipop.ManagerActivityLollipop.FragmentTag.*; @@ -84,6 +85,7 @@ import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.JobUtil.*; import static mega.privacy.android.app.utils.LogUtil.*; +import static mega.privacy.android.app.utils.MegaNodeUtil.*; import static mega.privacy.android.app.utils.PermissionUtils.*; import static mega.privacy.android.app.utils.Util.*; import static mega.privacy.android.app.utils.CameraUploadUtil.*; @@ -710,16 +712,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { megaPathSecMediaFolder = megaNodeSecondaryMediaFolder.getName(); } else{ - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } else{ - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } else{ logWarning("handleSecondaryMediaFolder empty string"); - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } @@ -727,7 +729,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { logWarning("handleSecondaryMediaFolder Null"); dbH.setSecondaryFolderHandle(-1); handleSecondaryMediaFolder = (long) -1; - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } //check if the local secondary folder exists @@ -1248,17 +1250,25 @@ else if (preference.getKey().compareTo(KEY_SECONDARY_MEDIA_FOLDER_ON) == 0){ secondaryUpload = !secondaryUpload; if (secondaryUpload){ + //If there is any possible secondary folder, set it as the default one + long setSecondaryFolderHandle = getSecondaryFolderHandle(); + long possibleSecondaryFolderHandle = findDefaultFolder(SECONDARY_UPLOADS); + if ((setSecondaryFolderHandle == INVALID_HANDLE || isNodeInRubbishOrDeleted(setSecondaryFolderHandle)) && + possibleSecondaryFolderHandle != INVALID_HANDLE) { + megaApi.setCameraUploadsFolderSecondary(possibleSecondaryFolderHandle, setAttrUserListener); + } + restoreSecondaryTimestampsAndSyncRecordProcess(); dbH.setSecondaryUploadEnabled(true); secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_off)); //Check MEGA folder if(handleSecondaryMediaFolder!=null){ if(handleSecondaryMediaFolder==-1){ - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } else{ - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } megaSecondaryFolder.setSummary(megaPathSecMediaFolder); @@ -2330,20 +2340,20 @@ private void setupSecondaryUpload(){ if (megaNodeSecondaryMediaFolder != null) { megaPathSecMediaFolder = megaNodeSecondaryMediaFolder.getName(); } else { - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } else { - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } else { logWarning("handleSecondaryMediaFolder empty string"); - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } } else { logWarning("handleSecondaryMediaFolder Null"); dbH.setSecondaryFolderHandle(-1); handleSecondaryMediaFolder = (long) -1; - megaPathSecMediaFolder = CameraUploadsService.SECONDARY_UPLOADS; + megaPathSecMediaFolder = SECONDARY_UPLOADS; } //check if the local secondary folder exists From bf82b562527a1d7805de2dc7d12a309a0a5e416a Mon Sep 17 00:00:00 2001 From: Chris Li Date: Thu, 30 Apr 2020 16:33:31 +1200 Subject: [PATCH 014/100] Fix the issue that cache folder is gone --- .../app/jobservices/CameraUploadsService.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 9ce4498b344..22c5deba658 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -1698,18 +1698,22 @@ public synchronized void onCompressFailed(SyncRecord record) { //file can not be compress will be uploaded directly? File srcFile = new File(localPath); if (srcFile.exists()) { - StatFs stat = new StatFs(tempRoot); - double availableFreeSpace = stat.getAvailableBytes(); - if (availableFreeSpace > srcFile.length()) { - logDebug("Can not compress but got enough disk space, so should be un-supported format issue"); - String newPath = record.getNewPath(); - File temp = new File(newPath); - dbH.updateSyncRecordStatusByLocalPath(STATUS_PENDING,localPath,isSecondary); - if (newPath.startsWith(tempRoot) && temp.exists()) { - temp.delete(); + try { + StatFs stat = new StatFs(tempRoot); + double availableFreeSpace = stat.getAvailableBytes(); + if (availableFreeSpace > srcFile.length()) { + logDebug("Can not compress but got enough disk space, so should be un-supported format issue"); + String newPath = record.getNewPath(); + File temp = new File(newPath); + dbH.updateSyncRecordStatusByLocalPath(STATUS_PENDING, localPath, isSecondary); + if (newPath.startsWith(tempRoot) && temp.exists()) { + temp.delete(); + } + } else { + //record will remain in DB and will be re-compressed next launch } - } else { - //record will remain in DB and will be re-compressed next launch + } catch (Exception ex) { + logError("Exception happens, cache folder is deleted: " + ex.toString()); } } else { logWarning("Compressed video not exists, remove from DB"); From 96eca422639ecc9d7b5ecf28d42eb00ecca6a2ec Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Thu, 30 Apr 2020 11:45:41 +0200 Subject: [PATCH 015/100] Fix check to know if the change in onUsersUpdate is my own change --- .../privacy/android/app/listeners/GlobalListener.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java b/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java index 472add0160e..fbff27d0c28 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/GlobalListener.java @@ -39,12 +39,13 @@ public void onUsersUpdate(MegaApiJava api, ArrayList users) { continue; } - if (user.hasChanged(MegaUser.CHANGE_TYPE_MY_CHAT_FILES_FOLDER) - && api.getMyUserHandle().equals(Long.toString(user.getHandle()))) { - api.getMyChatFilesFolder(new GetAttrUserListener(MegaApplication.getInstance(), true)); + boolean isMyChange = api.getMyUserHandle().equals(MegaApiJava.userHandleToBase64(user.getHandle())); + + if (user.hasChanged(MegaUser.CHANGE_TYPE_MY_CHAT_FILES_FOLDER) && isMyChange) { + api.getMyChatFilesFolder(new GetAttrUserListener(megaApplication, true)); } - if (user.hasChanged(MegaUser.CHANGE_TYPE_CAMERA_UPLOADS_FOLDER)) { + if (user.hasChanged(MegaUser.CHANGE_TYPE_CAMERA_UPLOADS_FOLDER) && isMyChange) { //user has change CU attribute, need to update local ones GetAttrUserListener listener = new GetAttrUserListener(megaApplication); api.getCameraUploadsFolder(listener); From 711ae5e09fccb3a84d50b47a11e180d57fef7387 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Fri, 1 May 2020 11:44:04 +1200 Subject: [PATCH 016/100] Change from sequential setting to parallel setting --- .../app/jobservices/CameraUploadsService.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 22c5deba658..c2a3deba863 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -978,16 +978,18 @@ private int shouldRun() { //Prevent checking while app alive because it has been handled by global event logDebug("is primary/secondary attr synced: " + isPrimaryHandleSynced + "/" + isSecondaryHandleSynced + ", ignoreAttr: " + ignoreAttr); - if (!ignoreAttr && !isPrimaryHandleSynced) { - logDebug("Try to get Camera Uploads primary target folder."); - megaApi.getCameraUploadsFolder(getAttrUserListener); - return CHECKING_USER_ATTRIBUTE; - } + if (!ignoreAttr) { + if (!isPrimaryHandleSynced) { + megaApi.getCameraUploadsFolder(getAttrUserListener); + } + + if (!isSecondaryHandleSynced) { + megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); + } - if (!ignoreAttr && !isSecondaryHandleSynced) { - logDebug("Try to get Camera Uploads primary target folder."); - megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); - return CHECKING_USER_ATTRIBUTE; + if (!isPrimaryHandleSynced || !isSecondaryHandleSynced) { + return CHECKING_USER_ATTRIBUTE; + } } int primaryFolderResult = checkPrimaryFolder(); @@ -1306,10 +1308,6 @@ public void onGetPrimaryFolderAttribute(MegaRequest request, MegaError e) { dbH.setCamSyncHandle(cameraUploadHandle); resetPrimaryTimeline(); } - // start to get secondary handle. - if (!isSecondaryHandleSynced) { - megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); - } } else { logWarning("Get primary handle faild, finish process."); finish(); From 86364b8b710af8aa97ac74931ff73dcd83c714e5 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Mon, 4 May 2020 10:30:50 +0200 Subject: [PATCH 017/100] Null pointer exception fixed when retrieving the preview of an attached node --- .../megachat/chatAdapters/MegaChatLollipopAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index 2a463a68787..93504d50f49 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -7116,9 +7116,9 @@ private void setPreview(long handle, MegaChatLollipopAdapter.ViewHolderMessageCh logDebug("handle: " + handle); if (holder != null) { - MegaChatMessage holderMessage = getMessageAt(holder.getCurrentPosition()).getMessage(); + AndroidMegaChatMessage megaMessage = getMessageAt(holder.getCurrentPosition()); - if(msgId != INVALID_HANDLE && holderMessage.getMsgId() != msgId) + if(megaMessage == null || (msgId != INVALID_HANDLE && megaMessage.getMessage().getMsgId() != msgId)) return; File previewDir = getPreviewFolder(context); From d4d577ec3a413dc21e0a7a1d755692cbd794de59 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Mon, 4 May 2020 10:42:24 +0200 Subject: [PATCH 018/100] When the app is in background, incoming calls are not received --- app/src/main/java/mega/privacy/android/app/MegaApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/mega/privacy/android/app/MegaApplication.java b/app/src/main/java/mega/privacy/android/app/MegaApplication.java index b0b0f63e1e5..35b48b640db 100644 --- a/app/src/main/java/mega/privacy/android/app/MegaApplication.java +++ b/app/src/main/java/mega/privacy/android/app/MegaApplication.java @@ -1511,7 +1511,6 @@ public void setStorageState(int state) { public void unregisterReceiver(BroadcastReceiver receiver) { super.unregisterReceiver(receiver); LocalBroadcastManager.getInstance(this).unregisterReceiver(logoutReceiver); - LocalBroadcastManager.getInstance(this).unregisterReceiver(chatCallUpdateReceiver); } public static boolean isVerifySMSShowed() { From 9510721052b37a52a874a91835ecd61c5e9d6b53 Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Mon, 4 May 2020 14:55:19 +0200 Subject: [PATCH 019/100] Fix both When it tries to edit a location message in chat, the URL of the message is set in the input text view and it should not (Bug #15551) and Chat messages are incorrectly marked as `Edited` (Bug #15499) --- .../megachat/ChatActivityLollipop.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index e18ef8b91f3..cd46736d035 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -176,6 +176,7 @@ import static mega.privacy.android.app.utils.ContactUtil.*; import static mega.privacy.android.app.utils.TextUtil.*; import static mega.privacy.android.app.constants.BroadcastConstants.*; +import static nz.mega.sdk.MegaChatApiJava.MEGACHAT_INVALID_HANDLE; public class ChatActivityLollipop extends DownloadableActivity implements MegaChatRequestListenerInterface, MegaRequestListenerInterface, MegaChatListenerInterface, MegaChatRoomListenerInterface, View.OnClickListener, StoreDataBeforeForward> { @@ -3733,25 +3734,20 @@ public void sendMessagesToUI(ArrayList messages) { } } - public void editMessage(String text){ - logDebug("editMessage: "); - MegaChatMessage msgEdited = null; + public void editMessage(String text) { + if (messageToEdit.getContent().equals(text)) return; - if(messageToEdit.getMsgId()!=-1){ - msgEdited = megaChatApi.editMessage(idChat, messageToEdit.getMsgId(), text); - } - else{ - msgEdited = megaChatApi.editMessage(idChat, messageToEdit.getTempId(), text); - } + MegaChatMessage msgEdited = megaChatApi.editMessage(idChat, + messageToEdit.getMsgId() != MEGACHAT_INVALID_HANDLE ? messageToEdit.getMsgId() : messageToEdit.getTempId(), + text); - if(msgEdited!=null){ + if (msgEdited != null) { logDebug("Edited message: status: " + msgEdited.getStatus()); AndroidMegaChatMessage androidMsgEdited = new AndroidMegaChatMessage(msgEdited); modifyMessageReceived(androidMsgEdited, false); - } - else{ + } else { logWarning("Message cannot be edited!"); - showSnackbar(SNACKBAR_TYPE, getString(R.string.error_editing_message), -1); + showSnackbar(SNACKBAR_TYPE, getString(R.string.error_editing_message), MEGACHAT_INVALID_HANDLE); } } @@ -3807,8 +3803,7 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { MegaChatMessage msg = messagesSelected.get(0).getMessage(); MegaChatContainsMeta meta = msg.getContainsMeta(); messageToEdit = msg; - textChat.setText(messageToEdit.getContent()); - textChat.setSelection(textChat.getText().length()); + if (msg.getType() == MegaChatMessage.TYPE_CONTAINS_META && meta != null && meta.getType() == MegaChatContainsMeta.CONTAINS_META_GEOLOCATION) { sendLocation(); clearSelections(); @@ -7108,7 +7103,7 @@ else if(request.getType() == MegaChatRequest.TYPE_LOAD_PREVIEW){ } idChat = request.getChatHandle(); megaChatApi.addChatListener(this); - if (idChat != MegaChatApiAndroid.MEGACHAT_INVALID_HANDLE) { + if (idChat != MEGACHAT_INVALID_HANDLE) { dbH.setLastPublicHandle(idChat); dbH.setLastPublicHandleTimeStamp(); dbH.setLastPublicHandleType(MegaApiJava.AFFILIATE_TYPE_CHAT); From 3e0a4ed1a5568e383564ed72d757ba79c7c7206c Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Mon, 4 May 2020 17:48:08 +0200 Subject: [PATCH 020/100] Transfer session to embedded mobile webclient (Task #15548) --- .../privacy/android/app/OpenLinkActivity.java | 17 ++++++++++++++++- .../listeners/SessionTransferURLListener.java | 8 ++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java b/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java index 983461400cc..276607e4003 100644 --- a/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java +++ b/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java @@ -9,6 +9,7 @@ import android.widget.TextView; import mega.privacy.android.app.listeners.QueryRecoveryLinkListener; +import mega.privacy.android.app.listeners.SessionTransferURLListener; import mega.privacy.android.app.lollipop.FileLinkActivityLollipop; import mega.privacy.android.app.lollipop.FolderLinkActivityLollipop; import mega.privacy.android.app.lollipop.LoginActivityLollipop; @@ -33,6 +34,8 @@ public class OpenLinkActivity extends PinActivityLollipop implements MegaRequestListenerInterface, View.OnClickListener { + private static final String REQUIRES_TRANSFER_SESSION = "fm" + SEPARATOR; + private DatabaseHandler dbH = null; private String urlConfirmationLink = null; @@ -390,10 +393,22 @@ protected void onCreate(Bundle savedInstanceState){ // Browser open the link which does not require app to handle logDebug("Browser open link: " + url); + checkIfRequiresTransferSession(url); + } + + private void checkIfRequiresTransferSession(String url) { + if (url.contains(REQUIRES_TRANSFER_SESSION)) { + int start = url.indexOf(REQUIRES_TRANSFER_SESSION); + if (start != -1) { + String path = url.substring(start + 3); + megaApi.getSessionTransferURL(path, new SessionTransferURLListener(this)); + return; + } + } openWebLink(url); } - private void openWebLink(String url) { + public void openWebLink(String url) { Intent openIntent = new Intent(this, WebViewActivityLollipop.class); openIntent.setData(Uri.parse(url)); startActivity(openIntent); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/SessionTransferURLListener.java b/app/src/main/java/mega/privacy/android/app/listeners/SessionTransferURLListener.java index 4c621f6fdc6..de73de33235 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/SessionTransferURLListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/SessionTransferURLListener.java @@ -4,7 +4,7 @@ import android.content.Intent; import android.net.Uri; -import mega.privacy.android.app.lollipop.WebViewActivityLollipop; +import mega.privacy.android.app.OpenLinkActivity; import nz.mega.sdk.MegaApiJava; import nz.mega.sdk.MegaError; import nz.mega.sdk.MegaRequest; @@ -27,7 +27,11 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { if (link != null) { Uri uri = Uri.parse(link); if (uri != null) { - context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); + if (context instanceof OpenLinkActivity) { + ((OpenLinkActivity) context).openWebLink(link); + } else { + context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); + } return; } } From 80d3f74206d446544eedf11804064df5bdd95827 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Tue, 5 May 2020 12:37:23 +1200 Subject: [PATCH 021/100] 1. Consider the API_ENOENT situation 2. Tidy up listener UI process and data update --- .../app/jobservices/CameraUploadsService.java | 40 ++------- .../app/listeners/CreateFolderListener.java | 37 ++++---- .../app/listeners/GetAttrUserListener.java | 85 +++++-------------- .../android/app/utils/CameraUploadUtil.java | 79 ++++++++++++++++- 4 files changed, 127 insertions(+), 114 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index c2a3deba863..1ecc68cb14f 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -66,6 +66,7 @@ import static mega.privacy.android.app.constants.SettingsConstants.VIDEO_QUALITY_MEDIUM; import static mega.privacy.android.app.jobservices.SyncRecord.*; +import static mega.privacy.android.app.listeners.CreateFolderListener.ExtraAction.INIT_CU; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.receivers.NetworkTypeChangeReceiver.MOBILE; import static mega.privacy.android.app.utils.FileUtils.*; @@ -229,7 +230,7 @@ public void onCreate() { registerReceiver(pauseReceiver, new IntentFilter(BROADCAST_ACTION_INTENT_UPDATE_PAUSE_NOTIFICATION)); getAttrUserListener = new GetAttrUserListener(this); setAttrUserListener = new SetAttrUserListener(this); - createFolderListener = new CreateFolderListener(this); + createFolderListener = new CreateFolderListener(this, INIT_CU); } @Override @@ -1295,19 +1296,10 @@ public void run() { public void onGetPrimaryFolderAttribute(MegaRequest request, MegaError e) { logDebug("onGetPrimaryAttribute: " + request.getNodeHandle() + " -> " + cameraUploadHandle); - //API_ENOENT means attribute never get set if (e.getErrorCode() == MegaError.API_OK || e.getErrorCode() == MegaError.API_ENOENT) { isPrimaryHandleSynced = true; long cuPrimaryHandleInUserAttr = request.getNodeHandle(); - // when get an invalid hanle from cloud, need to upload local handle. - if (cuPrimaryHandleInUserAttr == INVALID_HANDLE && cameraUploadHandle != INVALID_HANDLE) { - megaApi.setCameraUploadsFolder(cameraUploadHandle, setAttrUserListener); - } else if (cameraUploadHandle != cuPrimaryHandleInUserAttr) { - //cloud setting takes priority, update local handle. - cameraUploadHandle = cuPrimaryHandleInUserAttr; - dbH.setCamSyncHandle(cameraUploadHandle); - resetPrimaryTimeline(); - } + if (cameraUploadHandle != cuPrimaryHandleInUserAttr) cameraUploadHandle = cuPrimaryHandleInUserAttr; } else { logWarning("Get primary handle faild, finish process."); finish(); @@ -1319,13 +1311,7 @@ public void onGetSecondaryFolderAttribute(MegaRequest request, MegaError e) { if (e.getErrorCode() == MegaError.API_OK || e.getErrorCode() == MegaError.API_ENOENT) { isSecondaryHandleSynced = true; long cuSecondaryHandleInUserAttr = request.getNodeHandle(); - if (cuSecondaryHandleInUserAttr == INVALID_HANDLE && secondaryUploadHandle != INVALID_HANDLE) { - megaApi.setCameraUploadsFolderSecondary(secondaryUploadHandle, setAttrUserListener); - } else if(cuSecondaryHandleInUserAttr != secondaryUploadHandle) { - secondaryUploadHandle = cuSecondaryHandleInUserAttr; - dbH.setSecondaryFolderHandle(secondaryUploadHandle); - resetSecondaryTimeline(); - } + if(cuSecondaryHandleInUserAttr != secondaryUploadHandle) secondaryUploadHandle = cuSecondaryHandleInUserAttr; // start to upload. startWorkerThread(); } else { @@ -1343,22 +1329,10 @@ public void onSetFolderAttribute(boolean isSuccessful) { } } - public void onCreateFolder(MegaRequest request, MegaError e) { - if (e.getErrorCode() == MegaError.API_OK) { - logDebug("Folder created: " + request.getName()); - String name = request.getName(); - long handle = request.getNodeHandle(); - if (CAMERA_UPLOADS.equals(name)) { - // check if other client has created this folder already, if yes, delete it. - megaApi.setCameraUploadsFolder(handle, setAttrUserListener); - } - if (SECONDARY_UPLOADS.equals(name)) { - megaApi.setCameraUploadsFolderSecondary(handle, setAttrUserListener); - } - } else { - finish(); - } + public void onCreateFolder(boolean isSuccessful) { + if (!isSuccessful) finish(); } + private void setLoginState(boolean b) { isLoggingIn = b; MegaApplication.setLoggingIn(b); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java index fae412f0a49..bcafc2327f6 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java @@ -20,15 +20,22 @@ public class CreateFolderListener extends BaseListener { - private boolean isMyChatFiles; + public enum ExtraAction { + NONE, + MY_CHAT_FILES, + INIT_CU + } + + private ExtraAction extraAction; public CreateFolderListener(Context context) { super(context); + this.extraAction = ExtraAction.NONE; } - public CreateFolderListener(Context context, boolean isMyChatFiles) { + public CreateFolderListener(Context context, ExtraAction extraAction) { super(context); - this.isMyChatFiles = isMyChatFiles; + this.extraAction = extraAction; } @Override @@ -39,11 +46,19 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { MegaNode node = api.getNodeByHandle(handle); String name = request.getName(); + if (extraAction == ExtraAction.INIT_CU && e.getErrorCode() == MegaError.API_OK) { + if (name.equals(CAMERA_UPLOADS)) { + api.setCameraUploadsFolder(handle, new SetAttrUserListener(context)); + } else if (name.equals(SECONDARY_UPLOADS)) { + api.setCameraUploadsFolderSecondary(handle, new SetAttrUserListener(context)); + } + } + if (context instanceof FileExplorerActivityLollipop) { FileExplorerActivityLollipop fileExplorerActivityLollipop = (FileExplorerActivityLollipop) context; if (e.getErrorCode() == MegaError.API_OK) { - if (isMyChatFiles) { + if (extraAction == ExtraAction.MY_CHAT_FILES) { fileExplorerActivityLollipop.setMyChatFilesFolder(node); api.setMyChatFilesFolder(handle, new SetAttrUserListener(fileExplorerActivityLollipop)); fileExplorerActivityLollipop.checkIfFilesExistsInMEGA(); @@ -51,7 +66,7 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { fileExplorerActivityLollipop.finishCreateFolder(true, handle); } } else { - if (isMyChatFiles) { + if (extraAction == ExtraAction.MY_CHAT_FILES) { fileExplorerActivityLollipop.showSnackbar(context.getString(R.string.general_text_error)); } else { fileExplorerActivityLollipop.finishCreateFolder(false, handle); @@ -79,21 +94,11 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { api.setMyChatFilesFolder(handle, new SetAttrUserListener(nodeAttachmentHistoryActivity)); nodeAttachmentHistoryActivity.setMyChatFilesFolder(node); nodeAttachmentHistoryActivity.handleStoredData(); - } else if (context instanceof CameraUploadsService) { - ((CameraUploadsService) context).onCreateFolder(request, e); } else { nodeAttachmentHistoryActivity.showSnackbar(SNACKBAR_TYPE, context.getString(R.string.general_text_error)); } } else if (context instanceof CameraUploadsService) { - ((CameraUploadsService) context).onCreateFolder(request, e); - } else if (context instanceof MegaApplication) { - if (e.getErrorCode() == MegaError.API_OK) { - if (name.equals(CAMERA_UPLOADS)) { - api.setCameraUploadsFolder(handle, new SetAttrUserListener(context)); - } else if (name.equals(SECONDARY_UPLOADS)) { - api.setCameraUploadsFolderSecondary(handle, new SetAttrUserListener(context)); - } - } + ((CameraUploadsService) context).onCreateFolder(e.getErrorCode() == MegaError.API_OK); } if (e.getErrorCode() != MegaError.API_OK) { diff --git a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java index 47465503266..39917082625 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/GetAttrUserListener.java @@ -3,7 +3,6 @@ import android.content.Context; import mega.privacy.android.app.MegaApplication; -import mega.privacy.android.app.MegaPreferences; import mega.privacy.android.app.R; import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.FileExplorerActivityLollipop; @@ -16,6 +15,7 @@ import nz.mega.sdk.MegaRequest; import static mega.privacy.android.app.jobservices.CameraUploadsService.*; +import static mega.privacy.android.app.listeners.CreateFolderListener.ExtraAction.*; import static mega.privacy.android.app.utils.CameraUploadUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -79,7 +79,7 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { dBH.setMyChatFilesFolderHandle(myChatFolderNode.getHandle()); myChatFolderFound = true; } else if (!onlyDBUpdate) { - api.createFolder(context.getString(R.string.my_chat_files_folder), api.getRootNode(), new CreateFolderListener(context, true)); + api.createFolder(context.getString(R.string.my_chat_files_folder), api.getRootNode(), new CreateFolderListener(context, MY_CHAT_FILES)); } if (onlyDBUpdate) { @@ -142,72 +142,15 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { break; case USER_ATTR_CAMERA_UPLOADS_FOLDER: - if (context instanceof CameraUploadsService) { - if (request.getFlag()) { - ((CameraUploadsService) context).onGetSecondaryFolderAttribute(request, e); - } else { - ((CameraUploadsService) context).onGetPrimaryFolderAttribute(request, e); - } - } else if (e.getErrorCode() == MegaError.API_OK) { + boolean isSecondary = request.getFlag(); + + if (e.getErrorCode() == MegaError.API_OK) { synchronized (this) { - MegaPreferences prefs = dBH.getPreferences(); long handleInUserAttr = request.getNodeHandle(); if (isNodeInRubbishOrDeleted(handleInUserAttr)) { - boolean isSecondary = request.getFlag(); - if (isSecondary) { - long secondaryHandle = findDefaultFolder(SECONDARY_UPLOADS); - if (secondaryHandle == INVALID_HANDLE) { - secondaryHandle = findDefaultFolder(SECONDARY_UPLOADS_ENGLISH); - } - if (secondaryHandle == INVALID_HANDLE) { - if (prefs != null && - prefs.getSecondaryMediaFolderEnabled() != null && - Boolean.parseBoolean(prefs.getSecondaryMediaFolderEnabled())) { - api.createFolder(SECONDARY_UPLOADS, api.getRootNode(), new CreateFolderListener(context)); - } - } else { - api.setCameraUploadsFolderSecondary(secondaryHandle, new SetAttrUserListener(context)); - if (!SECONDARY_UPLOADS.equals(SECONDARY_UPLOADS_ENGLISH)) { - api.renameNode(api.getNodeByHandle(secondaryHandle), SECONDARY_UPLOADS, new RenameListener(context)); - } - } - - } else { - long primaryHandle = findDefaultFolder(CAMERA_UPLOADS); - if (primaryHandle == INVALID_HANDLE) { - primaryHandle = findDefaultFolder(CAMERA_UPLOADS_ENGLISH); - } - if (primaryHandle == INVALID_HANDLE) { - if (prefs != null && - prefs.getCamSyncEnabled() != null && - Boolean.parseBoolean(prefs.getCamSyncEnabled())) { - api.createFolder(CAMERA_UPLOADS, api.getRootNode(), new CreateFolderListener(context)); - } - } else { - api.setCameraUploadsFolder(primaryHandle, new SetAttrUserListener(context)); - if (!CAMERA_UPLOADS.equals(CAMERA_UPLOADS_ENGLISH)) { - api.renameNode(api.getNodeByHandle(primaryHandle), CAMERA_UPLOADS, new RenameListener(context)); - } - } - } + initCUFolderFromScratch(context, isSecondary); } else { - long primaryHandle = getPrimaryFolderHandle(); - long secondaryHandle = getSecondaryFolderHandle(); - boolean shouldCUStop = false; - - //save changes to local DB - boolean isSecondary = request.getFlag(); - if (isSecondary && handleInUserAttr != secondaryHandle) { - dBH.setSecondaryFolderHandle(handleInUserAttr); - resetSecondaryTimeline(); - shouldCUStop = true; - - } else if (!isSecondary && handleInUserAttr != primaryHandle) { - dBH.setCamSyncHandle(handleInUserAttr); - resetPrimaryTimeline(); - shouldCUStop = true; - } - + boolean shouldCUStop = compareAndUpdateLocalFolderAttribute(handleInUserAttr, isSecondary); //stop CU if destination has changed if (shouldCUStop && CameraUploadsService.isServiceRunning) { JobUtil.stopRunningCameraUploadService(context); @@ -219,6 +162,20 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { } } } + } else if (e.getErrorCode() == MegaError.API_ENOENT) { + initCUFolderFromScratch(context, isSecondary); + } else { + String targetFolder = isSecondary ? SECONDARY_UPLOADS_ENGLISH : CAMERA_UPLOADS_ENGLISH; + logError("Error getting: " + targetFolder + " " + e.getErrorString() ); + } + + if (context instanceof CameraUploadsService) { + // The unique process run within shoudRun method in CameraUploadsService + if (isSecondary) { + ((CameraUploadsService) context).onGetSecondaryFolderAttribute(request, e); + } else { + ((CameraUploadsService) context).onGetPrimaryFolderAttribute(request, e); + } } break; } diff --git a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java index bb75b58d38a..0fedad965cb 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java @@ -4,19 +4,22 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; +import android.util.Log; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import java.io.File; -import java.util.ArrayList; import mega.privacy.android.app.DatabaseHandler; import mega.privacy.android.app.MegaApplication; import mega.privacy.android.app.MegaPreferences; +import mega.privacy.android.app.listeners.RenameListener; +import mega.privacy.android.app.listeners.SetAttrUserListener; import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaNode; import static mega.privacy.android.app.constants.BroadcastConstants.*; +import static mega.privacy.android.app.jobservices.CameraUploadsService.*; import static mega.privacy.android.app.jobservices.SyncRecord.TYPE_ANY; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; @@ -264,4 +267,78 @@ public static void forceUpdateCameraUploadFolderIcon(boolean isSecondary, long h intent.putExtra(EXTRA_NODE_HANDLE, handle); LocalBroadcastManager.getInstance(MegaApplication.getInstance()).sendBroadcast(intent); } + + /** + * This method is executed when the user has never set Cu attribute + * Or the original cu folder has been deleted or put into rubbish bin + * + * @param context the context where init process is executed + * @param isSecondary determine whether it is camera upload or secondary upload + */ + public static void initCUFolderFromScratch(Context context, boolean isSecondary) { + if (isSecondary) { + initSecondaryFolderFromScratch(context); + } else { + initPrimaryFolderFromScratch(context); + } + } + + private static void initPrimaryFolderFromScratch(Context context) { + MegaApiAndroid api = MegaApplication.getInstance().getMegaApi(); + // Find previous camera upload folder, whose name is "Camera Uploads" in English + long primaryHandle = findDefaultFolder(CAMERA_UPLOADS_ENGLISH); + if (primaryHandle != INVALID_HANDLE) { + api.setCameraUploadsFolder(primaryHandle, new SetAttrUserListener(context)); + // if current device language is not English, rename this folder as "Camera Uploads" in other language + if (!CAMERA_UPLOADS.equals(CAMERA_UPLOADS_ENGLISH)) { + api.renameNode(api.getNodeByHandle(primaryHandle), CAMERA_UPLOADS, new RenameListener(context)); + } + } + } + + private static void initSecondaryFolderFromScratch(Context context) { + MegaApiAndroid api = MegaApplication.getInstance().getMegaApi(); + // Find previous camera upload folder, whose name is "Media Uploads" in English + long secondaryHandle = findDefaultFolder(SECONDARY_UPLOADS_ENGLISH); + if (secondaryHandle != INVALID_HANDLE) { + // if current device language is not English, rename this folder as "Media Uploads" in other language + api.setCameraUploadsFolderSecondary(secondaryHandle, new SetAttrUserListener(context)); + Log.d("dfdf", "here is the secondaryHandle: " + secondaryHandle); + if (!SECONDARY_UPLOADS.equals(SECONDARY_UPLOADS_ENGLISH)) { + api.renameNode(api.getNodeByHandle(secondaryHandle), SECONDARY_UPLOADS, new RenameListener(context)); + } + } + } + + /** + * The method is to update local cu attribute in database + * + * @param handleInUserAttr updated folder handle + * @param isSecondary whether this is about primary or secondary upload + * @return whether camera upload services should stop since folder is changed + */ + public static boolean compareAndUpdateLocalFolderAttribute(long handleInUserAttr, boolean isSecondary) { + if (handleInUserAttr == INVALID_HANDLE) { + return false; + } + + boolean shouldCUStop = false; + + long primaryHandle = getPrimaryFolderHandle(); + long secondaryHandle = getSecondaryFolderHandle(); + + + //save changes to local DB + if (isSecondary && handleInUserAttr != secondaryHandle) { + dbH.setSecondaryFolderHandle(handleInUserAttr); + resetSecondaryTimeline(); + shouldCUStop = true; + + } else if (!isSecondary && handleInUserAttr != primaryHandle) { + dbH.setCamSyncHandle(handleInUserAttr); + resetPrimaryTimeline(); + shouldCUStop = true; + } + return shouldCUStop; + } } From 3c65f78796ae2af5cd8e5aa38de5411c36b63999 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Thu, 7 May 2020 16:33:35 +1200 Subject: [PATCH 022/100] 1. Change back to parallel checking 2. After creating cu and mu folder, upload continues --- .../app/jobservices/CameraUploadsService.java | 33 ++++++++++--------- .../SettingsFragmentLollipop.java | 1 - 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 1ecc68cb14f..5632b9a5410 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -617,6 +617,10 @@ private void startParallelUpload(List finalList,boolean isCompressed parent = cameraUploadNode; } + if (parent == null) { + continue; + } + if (file.getType() == SyncRecord.TYPE_PHOTO && !file.isCopyOnly()) { if(removeGPS) { String newPath = createTempFile(file); @@ -979,18 +983,11 @@ private int shouldRun() { //Prevent checking while app alive because it has been handled by global event logDebug("is primary/secondary attr synced: " + isPrimaryHandleSynced + "/" + isSecondaryHandleSynced + ", ignoreAttr: " + ignoreAttr); - if (!ignoreAttr) { - if (!isPrimaryHandleSynced) { - megaApi.getCameraUploadsFolder(getAttrUserListener); - } - - if (!isSecondaryHandleSynced) { - megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); - } - - if (!isPrimaryHandleSynced || !isSecondaryHandleSynced) { - return CHECKING_USER_ATTRIBUTE; - } + // Check CU attributes sequentially to prevent potential API_EEXPIRED in parallel set CU attributes + if (!ignoreAttr && !isPrimaryHandleSynced) { + logDebug("Try to get Camera Uploads primary target folder."); + megaApi.getCameraUploadsFolder(getAttrUserListener); + return CHECKING_USER_ATTRIBUTE; } int primaryFolderResult = checkPrimaryFolder(); @@ -1300,6 +1297,11 @@ public void onGetPrimaryFolderAttribute(MegaRequest request, MegaError e) { isPrimaryHandleSynced = true; long cuPrimaryHandleInUserAttr = request.getNodeHandle(); if (cameraUploadHandle != cuPrimaryHandleInUserAttr) cameraUploadHandle = cuPrimaryHandleInUserAttr; + + // start to get secondary handle. + if (!isSecondaryHandleSynced) { + megaApi.getCameraUploadsFolderSecondary(getAttrUserListener); + } } else { logWarning("Get primary handle faild, finish process."); finish(); @@ -1323,14 +1325,13 @@ public void onGetSecondaryFolderAttribute(MegaRequest request, MegaError e) { public void onSetFolderAttribute(boolean isSuccessful) { if (isSuccessful) { startWorkerThread(); - } else { - logWarning("Set handle failed, finish process."); - finish(); } } public void onCreateFolder(boolean isSuccessful) { - if (!isSuccessful) finish(); + if (!isSuccessful) { + finish(); + } } private void setLoginState(boolean b) { diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index 7717b3fbe61..f1a3d20509c 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -1832,7 +1832,6 @@ public synchronized void setCUDestinationFolder(boolean isSecondary, long handle camSyncMegaPath = camSyncMegaNode.getName(); megaCameraFolder.setSummary(camSyncMegaPath); } - rescheduleCameraUpload(context); } @Override From 950fb6c628dd5a44923f12f7bf88ec0ea1586ce2 Mon Sep 17 00:00:00 2001 From: Javier Gomez Date: Thu, 7 May 2020 13:39:58 +0200 Subject: [PATCH 023/100] Minor change to prevent issues if `fm/` URL schema changes in future --- .../main/java/mega/privacy/android/app/OpenLinkActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java b/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java index 276607e4003..91e7813d974 100644 --- a/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java +++ b/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java @@ -400,7 +400,7 @@ private void checkIfRequiresTransferSession(String url) { if (url.contains(REQUIRES_TRANSFER_SESSION)) { int start = url.indexOf(REQUIRES_TRANSFER_SESSION); if (start != -1) { - String path = url.substring(start + 3); + String path = url.substring(start + REQUIRES_TRANSFER_SESSION.length()); megaApi.getSessionTransferURL(path, new SessionTransferURLListener(this)); return; } From 1d3ea98ea485b81301a3f4a50daeb1f1865365b6 Mon Sep 17 00:00:00 2001 From: aw Date: Fri, 8 May 2020 11:41:26 +1200 Subject: [PATCH 024/100] get dynamically get the CU folder names from string resource. --- .../app/jobservices/CameraUploadsService.java | 10 +++--- .../app/listeners/CreateFolderListener.java | 7 ++-- .../adapters/MegaExplorerLollipopAdapter.java | 6 ++-- .../CameraUploadFragmentLollipop.java | 6 ++-- .../FileBrowserFragmentLollipop.java | 6 ++-- .../SettingsFragmentLollipop.java | 32 +++++++++---------- .../android/app/utils/CameraUploadUtil.java | 9 +++--- 7 files changed, 36 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 5632b9a5410..7f9a7ec4987 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -91,9 +91,7 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeRe private static final String ERROR_SOURCE_FILE_NOT_EXIST = "SOURCE_FILE_NOT_EXIST"; private static final int BATTERY_STATE_LOW = 20; private static final int LOW_BATTERY_LEVEL = 20; - public static final String CAMERA_UPLOADS = MegaApplication.getInstance().getString(R.string.section_photo_sync); public static final String CAMERA_UPLOADS_ENGLISH = "Camera Uploads"; - public static final String SECONDARY_UPLOADS = MegaApplication.getInstance().getString(R.string.section_secondary_media_uploads); public static final String SECONDARY_UPLOADS_ENGLISH = "Media Uploads"; public static final String ACTION_CANCEL = "CANCEL_SYNC"; public static final String ACTION_STOP = "STOP_SYNC"; @@ -1002,9 +1000,9 @@ private int shouldRun() { private int checkPrimaryFolder() { if (isNodeInRubbishOrDeleted(cameraUploadHandle)) { - cameraUploadHandle = findDefaultFolder(CAMERA_UPLOADS); + cameraUploadHandle = findDefaultFolder(getString(R.string.section_photo_sync)); if (cameraUploadHandle == INVALID_HANDLE) { - megaApi.createFolder(CAMERA_UPLOADS, megaApi.getRootNode(), createFolderListener); + megaApi.createFolder(getString(R.string.section_photo_sync), megaApi.getRootNode(), createFolderListener); return TARGET_FOLDER_NOT_EXIST; } else { megaApi.setCameraUploadsFolder(cameraUploadHandle, setAttrUserListener); @@ -1033,10 +1031,10 @@ private int checkSecondaryFolder() { if (secondaryEnabled) { logDebug("the secondary uploads are enabled"); if (isNodeInRubbishOrDeleted(secondaryUploadHandle)) { - secondaryUploadHandle = findDefaultFolder(SECONDARY_UPLOADS); + secondaryUploadHandle = findDefaultFolder(getString(R.string.section_secondary_media_uploads)); if (secondaryUploadHandle == INVALID_HANDLE) { logDebug("must create the folder"); - megaApi.createFolder(SECONDARY_UPLOADS, megaApi.getRootNode(), createFolderListener); + megaApi.createFolder(getString(R.string.section_secondary_media_uploads), megaApi.getRootNode(), createFolderListener); return TARGET_FOLDER_NOT_EXIST; } else { megaApi.setCameraUploadsFolderSecondary(secondaryUploadHandle, setAttrUserListener); diff --git a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java index bcafc2327f6..28a17a49988 100644 --- a/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java +++ b/app/src/main/java/mega/privacy/android/app/listeners/CreateFolderListener.java @@ -2,7 +2,6 @@ import android.content.Context; -import mega.privacy.android.app.MegaApplication; import mega.privacy.android.app.R; import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.lollipop.FileExplorerActivityLollipop; @@ -13,8 +12,6 @@ import nz.mega.sdk.MegaNode; import nz.mega.sdk.MegaRequest; -import static mega.privacy.android.app.jobservices.CameraUploadsService.CAMERA_UPLOADS; -import static mega.privacy.android.app.jobservices.CameraUploadsService.SECONDARY_UPLOADS; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -47,9 +44,9 @@ public void onRequestFinish(MegaApiJava api, MegaRequest request, MegaError e) { String name = request.getName(); if (extraAction == ExtraAction.INIT_CU && e.getErrorCode() == MegaError.API_OK) { - if (name.equals(CAMERA_UPLOADS)) { + if (name.equals(context.getString(R.string.section_photo_sync))) { api.setCameraUploadsFolder(handle, new SetAttrUserListener(context)); - } else if (name.equals(SECONDARY_UPLOADS)) { + } else if (name.equals(context.getString(R.string.section_secondary_media_uploads))) { api.setCameraUploadsFolderSecondary(handle, new SetAttrUserListener(context)); } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java index 8713477e19c..cb88070d27e 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/adapters/MegaExplorerLollipopAdapter.java @@ -751,7 +751,7 @@ private boolean isCameraUploads(MegaNode n){ } }else{ - if(n.getName().equals(CAMERA_UPLOADS)){ + if(n.getName().equals(context.getString(R.string.section_photo_sync))){ if (prefs != null){ prefs.setCamSyncHandle(String.valueOf(n.getHandle())); } @@ -762,7 +762,7 @@ private boolean isCameraUploads(MegaNode n){ } }else{ - if(n.getName().equals(CAMERA_UPLOADS)){ + if(n.getName().equals(context.getString(R.string.section_photo_sync))){ if (prefs != null){ prefs.setCamSyncHandle(String.valueOf(n.getHandle())); } @@ -791,7 +791,7 @@ private boolean isCameraUploads(MegaNode n){ } } }else{ - if(n.getName().equals(CameraUploadsService.SECONDARY_UPLOADS)){ + if(n.getName().equals(context.getString(R.string.section_secondary_media_uploads))){ if (prefs != null){ prefs.setMegaHandleSecondaryFolder(String.valueOf(n.getHandle())); } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java index 61336c93e8c..65926930dfb 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/CameraUploadFragmentLollipop.java @@ -900,7 +900,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (photosyncHandle == -1) { ArrayList nl = megaApi.getChildren(megaApi.getRootNode()); for (int i = 0; i < nl.size(); i++) { - if ((CameraUploadsService.CAMERA_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { + if ((context.getString(R.string.section_photo_sync).compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { photosyncHandle = nl.get(i).getHandle(); dbH.setCamSyncHandle(photosyncHandle); listView.setVisibility(View.VISIBLE); @@ -1099,7 +1099,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (photosyncHandle == -1) { ArrayList nl = megaApi.getChildren(megaApi.getRootNode()); for (int i = 0; i < nl.size(); i++) { - if ((CameraUploadsService.CAMERA_UPLOADS.compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { + if ((context.getString(R.string.section_photo_sync).compareTo(nl.get(i).getName()) == 0) && (nl.get(i).isFolder())) { photosyncHandle = nl.get(i).getHandle(); dbH.setCamSyncHandle(photosyncHandle); listView.setVisibility(View.VISIBLE); @@ -2009,7 +2009,7 @@ public long getPhotoSyncHandle(){ if (photosyncHandle == -1){ ArrayList nl = megaApi.getChildren(megaApi.getRootNode()); for (int i=0;i Date: Fri, 8 May 2020 11:12:04 +0200 Subject: [PATCH 025/100] Use URL separator instead of file separator checking if need session transfer --- .../main/java/mega/privacy/android/app/OpenLinkActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java b/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java index 91e7813d974..a7603c13bf4 100644 --- a/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java +++ b/app/src/main/java/mega/privacy/android/app/OpenLinkActivity.java @@ -34,7 +34,7 @@ public class OpenLinkActivity extends PinActivityLollipop implements MegaRequestListenerInterface, View.OnClickListener { - private static final String REQUIRES_TRANSFER_SESSION = "fm" + SEPARATOR; + private static final String REQUIRES_TRANSFER_SESSION = "fm/"; private DatabaseHandler dbH = null; From 091ab1164a94d982991826acca931586aad290f5 Mon Sep 17 00:00:00 2001 From: Javier Gomez Date: Fri, 8 May 2020 13:51:50 +0200 Subject: [PATCH 026/100] New approach to try avoid ANR on `UploadService` Bug #15623: Google Dev Console ANR on UploadService --- .../privacy/android/app/UploadService.java | 70 +++++++++++-------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/UploadService.java b/app/src/main/java/mega/privacy/android/app/UploadService.java index 8a61b891631..3c6f9155de0 100644 --- a/app/src/main/java/mega/privacy/android/app/UploadService.java +++ b/app/src/main/java/mega/privacy/android/app/UploadService.java @@ -51,6 +51,7 @@ import static mega.privacy.android.app.utils.CacheFolderManager.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.PermissionUtils.*; +import static mega.privacy.android.app.utils.TextUtil.isTextEmpty; import static mega.privacy.android.app.utils.Util.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -143,9 +144,14 @@ public void onCreate() { int wifiLockMode = WifiManager.WIFI_MODE_FULL_HIGH_PERF; WifiManager wifiManager = (WifiManager) getApplicationContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE); - lock = wifiManager.createWifiLock(wifiLockMode, "MegaUploadServiceWifiLock"); + if (wifiManager != null) { + lock = wifiManager.createWifiLock(wifiLockMode, "MegaUploadServiceWifiLock"); + } + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MegaUploadServicePowerLock:"); + if (pm != null) { + wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MegaUploadServicePowerLock:"); + } mBuilder = new Notification.Builder(UploadService.this); mBuilderCompat = new NotificationCompat.Builder(UploadService.this, null); @@ -240,46 +246,52 @@ private synchronized void onHandleIntent(final Intent intent) { } currentUpload ++; - final File file = new File(intent.getStringExtra(EXTRA_FILEPATH)); - if(file!=null){ - logDebug("File to manage: " + file.getAbsolutePath()); - } + String filePath = intent.getStringExtra(EXTRA_FILEPATH); + if (isTextEmpty(filePath)) { + logWarning("Error: File path is NULL or EMPTY"); + return; + } + + final File file = new File(filePath); + logDebug("File to manage: " + file.getAbsolutePath()); - long parentHandle = intent.getLongExtra(EXTRA_PARENT_HASH, 0); - String nameInMEGA = intent.getStringExtra(EXTRA_NAME); - String nameInMEGAEdited = intent.getStringExtra(EXTRA_NAME_EDITED); - long lastModified = intent.getLongExtra(EXTRA_LAST_MODIFIED, 0); - if(lastModified <= 0){ - lastModified = file.lastModified(); + long parentHandle = intent.getLongExtra(EXTRA_PARENT_HASH, 0); + String nameInMEGA = intent.getStringExtra(EXTRA_NAME); + String nameInMEGAEdited = intent.getStringExtra(EXTRA_NAME_EDITED); + long lastModified = intent.getLongExtra(EXTRA_LAST_MODIFIED, 0); + if (lastModified <= 0) { + lastModified = file.lastModified(); } + MegaNode parentNode = megaApi.getNodeByHandle(parentHandle); + acquireLock(); - if (file.isDirectory()) { - // Folder upload - totalFolderUploads++; - if (nameInMEGA != null) { - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), nameInMEGA, this); - } else { - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), this); - } - } else { + if (file.isDirectory()) { + // Folder upload + totalFolderUploads++; + if (nameInMEGA != null) { + megaApi.startUpload(file.getAbsolutePath(), parentNode, nameInMEGA, this); + } else { + megaApi.startUpload(file.getAbsolutePath(), parentNode, this); + } + } else { totalFileUploads++; - if (nameInMEGAEdited != null) { + if (nameInMEGAEdited != null) { // File upload with edited name - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), nameInMEGAEdited, this); + megaApi.startUpload(file.getAbsolutePath(), parentNode, nameInMEGAEdited, this); } else if (lastModified == 0) { if (nameInMEGA != null) { - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), nameInMEGA, this); + megaApi.startUpload(file.getAbsolutePath(), parentNode, nameInMEGA, this); } else { - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), this); + megaApi.startUpload(file.getAbsolutePath(), parentNode, this); } } else { if (nameInMEGA != null) { - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), nameInMEGA, lastModified / 1000, this); + megaApi.startUpload(file.getAbsolutePath(), parentNode, nameInMEGA, lastModified / 1000, this); } else { - megaApi.startUpload(file.getAbsolutePath(), megaApi.getNodeByHandle(parentHandle), lastModified / 1000, this); + megaApi.startUpload(file.getAbsolutePath(), parentNode, lastModified / 1000, this); } } } @@ -1001,10 +1013,10 @@ private void showStorageOverQuotaNotification(boolean isFolderTransfer){ private void acquireLock(){ logDebug("acquireLock"); - if (!wl.isHeld()) { + if (wl != null && !wl.isHeld()) { wl.acquire(); } - if (!lock.isHeld()) { + if (lock != null && !lock.isHeld()) { lock.acquire(); } } From 5e2eed4d49575d9d50d56b1a0ce2a6bff41dae13 Mon Sep 17 00:00:00 2001 From: Javier Gomez Date: Fri, 8 May 2020 14:13:47 +0200 Subject: [PATCH 027/100] New approach to try avoid ANR on `DownloadService` (ManagerActivityLollipop) Bug #15624: Google Dev Console ANR on DownloadService (ManagerActivityLollipop) --- .../android/app/lollipop/ManagerActivityLollipop.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java index 6d0d3e41d08..35cc06ac201 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java @@ -10978,8 +10978,15 @@ public void selectSortByContacts(int _orderContacts){ } public void refreshCloudDrive() { - MegaNode parentNode = megaApi.getRootNode(); - if (parentNode == null) return; + if (rootNode == null) { + rootNode = megaApi.getRootNode(); + if (rootNode == null) { + logWarning("Root node is NULL. Maybe user is not logged in"); + return; + } + } + + MegaNode parentNode = rootNode; if (isCloudAdded()) { ArrayList nodes; From b013627ec731949bf465ccea5b51f3fa23d68842 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Mon, 11 May 2020 17:07:59 +0200 Subject: [PATCH 028/100] Allow message selection to be maintained when the screen is rotated. --- .../megachat/ChatActivityLollipop.java | 93 ++++++++++++++++--- .../chatAdapters/MegaChatLollipopAdapter.java | 63 ++++++++----- 2 files changed, 120 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index b7a43ddf7c3..1dd24a51bdb 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -115,6 +115,7 @@ import mega.privacy.android.app.lollipop.LoginActivityLollipop; import mega.privacy.android.app.lollipop.ManagerActivityLollipop; import mega.privacy.android.app.lollipop.PdfViewerActivityLollipop; +import mega.privacy.android.app.lollipop.adapters.RotatableAdapter; import mega.privacy.android.app.lollipop.controllers.ChatController; import mega.privacy.android.app.lollipop.listeners.ChatLinkInfoListener; import mega.privacy.android.app.listeners.CreateChatListener; @@ -187,6 +188,8 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh private static final String PROGRESS_PLAYING = "progressVoicePlaying"; private static final String MESSAGE_HANDLE_PLAYING = "messageHandleVoicePlaying"; private static final String USER_HANDLE_PLAYING = "userHandleVoicePlaying"; + private final static String SELECTED_ITEMS = "selectedItems"; + private final static String LAST_PLACE_HOLDER_COUNT = "lastPlaceHolderCount"; private final static int NUMBER_MESSAGES_TO_LOAD = 20; private final static int NUMBER_MESSAGES_BEFORE_LOAD = 8; @@ -253,6 +256,7 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh boolean isLoadingHistory = false; private AlertDialog errorOpenChatDialog; long numberToLoad = -1; + ArrayList recoveredSelectedItems = null; private androidx.appcompat.app.AlertDialog downloadConfirmationDialog; private AlertDialog chatAlertDialog; @@ -447,6 +451,7 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh private MegaNode myChatFilesFolder; private TextUtils.TruncateAt typeEllipsize = TextUtils.TruncateAt.END; + private int lastPlaceHolderCount; @Override public void storedUnhandledData(ArrayList preservedData) { @@ -654,7 +659,7 @@ public void showGroupInfoActivity(){ } @Override - protected void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { logDebug("onCreate"); requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); @@ -767,6 +772,7 @@ protected void onCreate(Bundle savedInstanceState) { badgeDrawable = new BadgeDrawerArrowDrawable(getSupportActionBar().getThemedContext()); updateNavigationToolbarIcon(); + joinChatLinkLayout = findViewById(R.id.join_chat_layout_chat_layout); joinButton = findViewById(R.id.join_button); joinButton.setOnClickListener(this); @@ -1181,7 +1187,6 @@ private void showInputText(){ } public void initAfterIntent(Intent newIntent, Bundle savedInstanceState){ - logDebug("initAfterIntent"); if (newIntent != null){ logDebug("Intent is not null"); @@ -1204,6 +1209,7 @@ public void initAfterIntent(Intent newIntent, Bundle savedInstanceState){ myUserHandle = megaChatApi.getMyUserHandle(); if(savedInstanceState!=null) { + logDebug("Bundle is NOT NULL"); selectedMessageId = savedInstanceState.getLong("selectedMessageId", -1); logDebug("Handle of the message: " + selectedMessageId); @@ -1214,6 +1220,8 @@ public void initAfterIntent(Intent newIntent, Bundle savedInstanceState){ mOutputFilePath = savedInstanceState.getString("mOutputFilePath"); isShareLinkDialogDismissed = savedInstanceState.getBoolean("isShareLinkDialogDismissed", false); isLocationDialogShown = savedInstanceState.getBoolean("isLocationDialogShown", false); + recoveredSelectedItems = (ArrayList) savedInstanceState.getSerializable(SELECTED_ITEMS); + lastPlaceHolderCount = savedInstanceState.getInt(LAST_PLACE_HOLDER_COUNT, -1); if(visibilityMessageJump){ if(typeMessageJump == TYPE_MESSAGE_NEW_MESSAGE){ @@ -3824,7 +3832,7 @@ public void showUploadPanel(){ bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); } - private void activateActionMode() { + public void activateActionMode(){ if (!adapter.isMultipleSelect()) { adapter.setMultipleSelect(true); actionMode = startSupportActionMode(new ActionBarCallBack()); @@ -3832,7 +3840,47 @@ private void activateActionMode() { } } + public void multipleItemClick(int position) { + adapter.toggleSelection(position); + } + private void reDoTheSelectionAfterRotation() { + if (recoveredSelectedItems == null) + return; + + if (adapter == null) + return; + + if (recoveredSelectedItems.size() > 0) { + activateActionMode(); + for (int selectedItem : recoveredSelectedItems) { + multipleItemClick(transferPosition(selectedItem, adapter)); + } + } + + updateActionModeTitle(); + } + + /** + * @param originalPosition original position before rotation + * @param adapter the adapter where rotation happens + * @return the list position after rotation of adapter + */ + private int transferPosition(int originalPosition, RotatableAdapter adapter) { + int position; + + if (isScreenInPortrait(this)) { + position = originalPosition - (lastPlaceHolderCount - adapter.getPlaceholderCount()); + } else { + position = originalPosition + (adapter.getPlaceholderCount() - lastPlaceHolderCount); + } + + return position; + } + + public void activateActionModeWithItem(int positionInAdapter) { + logDebug("activateActionModeWithItem"); + activateActionMode(); if (adapter.isMultipleSelect()) { itemClick((positionInAdapter + 1), null); @@ -3940,6 +3988,8 @@ public String copyMessages(ArrayList messagesSelected){ @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { + logDebug("onCreateActionMode"); + MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.messages_chat_action, menu); @@ -3954,8 +4004,8 @@ public boolean onCreateActionMode(ActionMode mode, Menu menu) { public void onDestroyActionMode(ActionMode arg0) { logDebug("onDestroyActionMode"); adapter.setMultipleSelect(false); -// textChat.getText().clear(); editingMessage = false; + recoveredSelectedItems = null; clearSelections(); changeStatusBarColorActionMode(chatActivity, getWindow(), handler, 0); } @@ -6216,7 +6266,7 @@ public void loadBufferMessages(){ while (itr.hasNext()) { int currentIndex = itr.nextIndex(); AndroidMegaChatMessage messageToShow = itr.next(); - loadMessage(messageToShow); + loadMessage(messageToShow, currentIndex); } //Create adapter @@ -6227,6 +6277,7 @@ public void loadBufferMessages(){ adapter.loadPreviousMessages(messages, bufferMessages.size()); logDebug("addMessage: " + messages.size()); + updateActionModeTitle(); } logDebug("AFTER updateMessagesLoaded: " + messages.size() + " messages in list"); @@ -6373,8 +6424,7 @@ else if(t.getState()==MegaTransfer.STATE_FAILED){ } } - public void loadMessage(AndroidMegaChatMessage messageToShow){ - logDebug("loadMessage"); + public void loadMessage(AndroidMegaChatMessage messageToShow, int currentIndex){ messageToShow.setInfoToShow(AndroidMegaChatMessage.CHAT_ADAPTER_SHOW_ALL); messages.add(0,messageToShow); @@ -7613,9 +7663,12 @@ public void onRequestTemporaryError(MegaApiJava api, MegaRequest request, MegaEr } + protected MegaChatLollipopAdapter getAdapter() { + return adapter; + } + @Override public void onSaveInstanceState(Bundle outState){ - logDebug("onSaveInstanceState"); super.onSaveInstanceState(outState); outState.putLong("idChat", idChat); outState.putLong("selectedMessageId", selectedMessageId); @@ -7633,7 +7686,19 @@ public void onSaveInstanceState(Bundle outState){ outState.putBoolean("isHideJump",isHideJump); outState.putString("mOutputFilePath",mOutputFilePath); outState.putBoolean("isShareLinkDialogDismissed", isShareLinkDialogDismissed); - if(adapter == null) return; + + if(adapter == null) + return; + + + RotatableAdapter currentAdapter = getAdapter(); + if(currentAdapter != null & adapter.isMultipleSelect()){ + ArrayList selectedItems = (ArrayList) (currentAdapter.getSelectedItems()); + outState.putSerializable(SELECTED_ITEMS, selectedItems); + outState.putInt(LAST_PLACE_HOLDER_COUNT, currentAdapter.getPlaceholderCount()); + lastPlaceHolderCount = -1; + } + MessageVoiceClip messageVoiceClip = adapter.getVoiceClipPlaying(); if (messageVoiceClip != null) { outState.putBoolean(PLAYING, true); @@ -7812,11 +7877,12 @@ public void markAsSeen(MegaChatMessage msg) { @Override - protected void onResume(){ - logDebug("onResume"); + public void onResume(){ + logDebug("onResume"); super.onResume(); stopService(new Intent(this, KeepAliveService.class)); if(idChat!=-1 && chatRoom!=null) { + setNodeAttachmentVisible(); MegaApplication.setShowPinScreen(true); @@ -7909,6 +7975,10 @@ protected void onResume(){ if(aB != null && aB.getTitle() != null){ titleToolbar.setText(adjustForLargeFont(titleToolbar.getText().toString())); } + + reDoTheSelectionAfterRotation(); + recoveredSelectedItems = null; + updateActionModeTitle(); } } @@ -7984,7 +8054,6 @@ public void setLastMessageSeen(){ @Override protected void onPause(){ - logDebug("onPause"); super.onPause(); if (rtcAudioManager != null) rtcAudioManager.unregisterProximitySensor(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index f3f003d8d59..7f221468691 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -51,6 +51,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -63,6 +64,7 @@ import mega.privacy.android.app.components.twemoji.EmojiManager; import mega.privacy.android.app.components.twemoji.EmojiTextView; import mega.privacy.android.app.lollipop.ManagerActivityLollipop; +import mega.privacy.android.app.lollipop.adapters.RotatableAdapter; import mega.privacy.android.app.lollipop.controllers.ChatController; import mega.privacy.android.app.lollipop.listeners.ChatAttachmentAvatarListener; import mega.privacy.android.app.lollipop.listeners.ChatNonContactNameListener; @@ -102,7 +104,7 @@ import static mega.privacy.android.app.utils.TextUtil.*; import static nz.mega.sdk.MegaApiJava.INVALID_HANDLE; -public class MegaChatLollipopAdapter extends RecyclerView.Adapter implements View.OnClickListener, View.OnLongClickListener { +public class MegaChatLollipopAdapter extends RecyclerView.Adapter implements View.OnClickListener, View.OnLongClickListener, RotatableAdapter { private static int MAX_WIDTH_FILENAME_LAND = 455; private static int MAX_WIDTH_FILENAME_PORT = 180; @@ -146,10 +148,10 @@ public class MegaChatLollipopAdapter extends RecyclerView.Adapter messagesPlaying; + private int placeholderCount = 0; private Handler handlerVoiceNotes; private Runnable runnableVC; - ChatController cC; private long myUserHandle = -1; @@ -3628,8 +3630,6 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes } public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessage androidMessage, int position) { - logDebug("position: " + position); - MegaChatMessage message = androidMessage.getMessage(); if (message.getUserHandle() == myUserHandle) { logDebug("MY message handle!!: " + message.getMsgId()); @@ -6060,7 +6060,7 @@ public void setMultipleSelect(boolean multipleSelect) { } public void toggleSelection(int pos) { - logDebug("toggleSelection"); + logDebug("The position selected is "+pos); if (selectedItems.get(pos, false)) { logDebug("Delete pos: " + pos); @@ -6084,17 +6084,16 @@ public void selectAll() { } public void updateSelectionOnScroll() { - logDebug("updateSelectionOnScroll"); - List selected = getSelectedItems(); - selectedItems.clear(); +// selectedItems.clear(); +// +// for (int i = 0; i < selected.size(); i++) { +// int pos = selected.get(i); +// selectedItems.put(pos + 1, true); +// notifyItemChanged(pos); +// notifyItemChanged(pos + 1); - for (int i = 0; i < selected.size(); i++) { - int pos = selected.get(i); - selectedItems.put(pos + 1, true); - notifyItemChanged(pos); - notifyItemChanged(pos + 1); - } +// } } public void clearSelections() { @@ -6104,10 +6103,6 @@ public void clearSelections() { toggleSelection(i); } } -// if (selectedItems != null) { -// selectedItems.clear(); -// } -// notifyDataSetChanged(); } private boolean isItemChecked(int position) { @@ -6119,11 +6114,30 @@ public int getSelectedItemCount() { } public List getSelectedItems() { - List items = new ArrayList(selectedItems.size()); - for (int i = 0; i < selectedItems.size(); i++) { - items.add(selectedItems.keyAt(i)); + if (selectedItems != null) { + List items = new ArrayList<>(selectedItems.size()); + for (int i = 0; i < selectedItems.size(); i++) { + items.add(selectedItems.keyAt(i)); + } + return items; } - return items; + + return null; + } + + @Override + public int getFolderCount() { + return 0; + } + + @Override + public int getPlaceholderCount() { + return placeholderCount; + } + + @Override + public int getUnhandledItem() { + return 0; } /* @@ -6131,8 +6145,8 @@ public List getSelectedItems() { */ public AndroidMegaChatMessage getMessageAt(int positionInAdapter) { try { - if (messages != null) { - return messages.get(positionInAdapter - 1); + if (this.messages != null) { + return this.messages.get(positionInAdapter - 1); } } catch (IndexOutOfBoundsException e) { } @@ -6172,6 +6186,7 @@ public long getItemId(int position) { public void setMessages(ArrayList messages) { this.messages = messages; + placeholderCount = 0; notifyDataSetChanged(); } From 950de1411f32360c3916d5030e65197c888252e3 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Thu, 14 May 2020 13:49:59 +0200 Subject: [PATCH 029/100] Keep the message selected when I scroll through the chat history. --- .../megachat/ChatActivityLollipop.java | 60 ++--- .../chatAdapters/MegaChatLollipopAdapter.java | 241 ++++++++++-------- 2 files changed, 157 insertions(+), 144 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index 1dd24a51bdb..ef3b8f71df8 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -189,7 +189,6 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh private static final String MESSAGE_HANDLE_PLAYING = "messageHandleVoicePlaying"; private static final String USER_HANDLE_PLAYING = "userHandleVoicePlaying"; private final static String SELECTED_ITEMS = "selectedItems"; - private final static String LAST_PLACE_HOLDER_COUNT = "lastPlaceHolderCount"; private final static int NUMBER_MESSAGES_TO_LOAD = 20; private final static int NUMBER_MESSAGES_BEFORE_LOAD = 8; @@ -256,7 +255,7 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh boolean isLoadingHistory = false; private AlertDialog errorOpenChatDialog; long numberToLoad = -1; - ArrayList recoveredSelectedItems = null; + ArrayList recoveredSelectedPositions = null; private androidx.appcompat.app.AlertDialog downloadConfirmationDialog; private AlertDialog chatAlertDialog; @@ -451,7 +450,6 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh private MegaNode myChatFilesFolder; private TextUtils.TruncateAt typeEllipsize = TextUtils.TruncateAt.END; - private int lastPlaceHolderCount; @Override public void storedUnhandledData(ArrayList preservedData) { @@ -1220,8 +1218,7 @@ public void initAfterIntent(Intent newIntent, Bundle savedInstanceState){ mOutputFilePath = savedInstanceState.getString("mOutputFilePath"); isShareLinkDialogDismissed = savedInstanceState.getBoolean("isShareLinkDialogDismissed", false); isLocationDialogShown = savedInstanceState.getBoolean("isLocationDialogShown", false); - recoveredSelectedItems = (ArrayList) savedInstanceState.getSerializable(SELECTED_ITEMS); - lastPlaceHolderCount = savedInstanceState.getInt(LAST_PLACE_HOLDER_COUNT, -1); + recoveredSelectedPositions = (ArrayList) savedInstanceState.getSerializable(SELECTED_ITEMS); if(visibilityMessageJump){ if(typeMessageJump == TYPE_MESSAGE_NEW_MESSAGE){ @@ -3840,44 +3837,27 @@ public void activateActionMode(){ } } - public void multipleItemClick(int position) { - adapter.toggleSelection(position); - } private void reDoTheSelectionAfterRotation() { - if (recoveredSelectedItems == null) + if (recoveredSelectedPositions == null) return; if (adapter == null) return; - if (recoveredSelectedItems.size() > 0) { + if (recoveredSelectedPositions.size() > 0) { activateActionMode(); - for (int selectedItem : recoveredSelectedItems) { - multipleItemClick(transferPosition(selectedItem, adapter)); + + for (int position : recoveredSelectedPositions) { + AndroidMegaChatMessage msg = adapter.getMessageAtPosition(position); + if(msg != null) { + adapter.toggleSelection(msg.getMessage().getMsgId()); + } } } updateActionModeTitle(); } - /** - * @param originalPosition original position before rotation - * @param adapter the adapter where rotation happens - * @return the list position after rotation of adapter - */ - private int transferPosition(int originalPosition, RotatableAdapter adapter) { - int position; - - if (isScreenInPortrait(this)) { - position = originalPosition - (lastPlaceHolderCount - adapter.getPlaceholderCount()); - } else { - position = originalPosition + (adapter.getPlaceholderCount() - lastPlaceHolderCount); - } - - return position; - } - - public void activateActionModeWithItem(int positionInAdapter) { logDebug("activateActionModeWithItem"); @@ -4005,7 +3985,7 @@ public void onDestroyActionMode(ActionMode arg0) { logDebug("onDestroyActionMode"); adapter.setMultipleSelect(false); editingMessage = false; - recoveredSelectedItems = null; + recoveredSelectedPositions = null; clearSelections(); changeStatusBarColorActionMode(chatActivity, getWindow(), handler, 0); } @@ -4490,7 +4470,7 @@ public void itemClick(int positionInAdapter, int [] screenPosition) { logDebug("Message id: " + m.getMessage().getMsgId()); logDebug("Timestamp: " + m.getMessage().getTimestamp()); if (isSelectableMessage(m)) { - adapter.toggleSelection(positionInAdapter); + adapter.toggleSelection(m.getMessage().getMsgId()); List messages = adapter.getSelectedMessages(); if (!messages.isEmpty()) { updateActionModeTitle(); @@ -6278,6 +6258,9 @@ public void loadBufferMessages(){ logDebug("addMessage: " + messages.size()); updateActionModeTitle(); + reDoTheSelectionAfterRotation(); + recoveredSelectedPositions = null; + } logDebug("AFTER updateMessagesLoaded: " + messages.size() + " messages in list"); @@ -6434,13 +6417,11 @@ public void loadMessage(AndroidMegaChatMessage messageToShow, int currentIndex){ setShowAvatar(0); - if(adapter.isMultipleSelect()){ - adapter.updateSelectionOnScroll(); - } } public void appendMessageAnotherMS(AndroidMegaChatMessage msg){ logDebug("appendMessageAnotherMS"); + messages.add(msg); int lastIndex = messages.size()-1; @@ -7693,10 +7674,8 @@ public void onSaveInstanceState(Bundle outState){ RotatableAdapter currentAdapter = getAdapter(); if(currentAdapter != null & adapter.isMultipleSelect()){ - ArrayList selectedItems = (ArrayList) (currentAdapter.getSelectedItems()); - outState.putSerializable(SELECTED_ITEMS, selectedItems); - outState.putInt(LAST_PLACE_HOLDER_COUNT, currentAdapter.getPlaceholderCount()); - lastPlaceHolderCount = -1; + ArrayList selectedPositions= (ArrayList) (currentAdapter.getSelectedItems()); + outState.putSerializable(SELECTED_ITEMS, selectedPositions); } MessageVoiceClip messageVoiceClip = adapter.getVoiceClipPlaying(); @@ -7975,9 +7954,6 @@ public void onResume(){ if(aB != null && aB.getTitle() != null){ titleToolbar.setText(adjustForLargeFont(titleToolbar.getText().toString())); } - - reDoTheSelectionAfterRotation(); - recoveredSelectedItems = null; updateActionModeTitle(); } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index 7f221468691..59bfddb54f3 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -17,6 +17,7 @@ import androidx.core.content.ContextCompat; import androidx.exifinterface.media.ExifInterface; import androidx.recyclerview.widget.RecyclerView; + import android.text.Html; import android.text.Spannable; import android.text.SpannableString; @@ -28,7 +29,6 @@ import android.text.util.Linkify; import android.util.Base64; import android.util.DisplayMetrics; -import android.util.SparseBooleanArray; import android.util.TypedValue; import android.view.Display; import android.view.Gravity; @@ -51,9 +51,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.List; import mega.privacy.android.app.DatabaseHandler; import mega.privacy.android.app.MegaApplication; @@ -145,7 +143,8 @@ public class MegaChatLollipopAdapter extends RecyclerView.Adapter messagesSelectedInChat = new HashMap<>(); + private MegaChatLollipopAdapter megaChatAdapter; private ArrayList messagesPlaying; private int placeholderCount = 0; @@ -2631,7 +2630,7 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha holder.urlOwnMessageText.setLinksClickable(false); } - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -2746,7 +2745,7 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha ((ViewHolderMessageChat) holder).urlContactMessageText.setLinksClickable(false); } - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -3062,7 +3061,7 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat holder.urlOwnMessageWarningButtonsLayout.setVisibility(View.GONE); holder.urlOwnMessageDisableButtonsLayout.setVisibility(View.GONE); - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -3160,7 +3159,7 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat holder.forwardContactMessageLocation.setOnClickListener(this); } - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -3420,7 +3419,7 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes } } - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -3617,7 +3616,7 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes } } - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); if(!multipleSelect){ if(positionClicked != -1 && positionClicked == position){ @@ -3829,7 +3828,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa holder.contentOwnMessageText.setLinksClickable(false); } - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); }else if (message.isDeleted()) { logDebug("MY Message is deleted"); @@ -3913,7 +3912,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa holder.contentOwnMessageText.setLinksClickable(false); } - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); } } else { long userHandle = message.getUserHandle(); @@ -4001,7 +4000,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa ((ViewHolderMessageChat) holder).contentContactMessageText.setLinksClickable(false); } - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); }else if (message.isDeleted()) { logDebug("Message is deleted"); @@ -4092,7 +4091,7 @@ public void bindNormalMessage(ViewHolderMessageChat holder, AndroidMegaChatMessa ((ViewHolderMessageChat) holder).contentContactMessageText.setLinksClickable(false); } - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); } } } @@ -4199,7 +4198,7 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentOwnMessageFileName.setVisibility(View.VISIBLE); holder.contentOwnMessageFileSize.setVisibility(View.VISIBLE); - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -4512,7 +4511,7 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC holder.contentContactMessageFileSize.setVisibility(View.VISIBLE); holder.contentContactMessageContactLayout.setVisibility(View.GONE); - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -4927,7 +4926,7 @@ public void onStopTrackingTouch(SeekBar seekBar) { } holder.retryAlert.setVisibility(View.GONE); } - checkMultiselectionMode(positionInAdapter, holder, true); + checkMultiselectionMode(positionInAdapter, holder, true, message.getMsgId()); if (multipleSelect) { holder.contentOwnMessageVoiceClipPlay.setOnClickListener(null); @@ -5083,7 +5082,7 @@ public void onStopTrackingTouch(SeekBar seekBar) { } holder.contentContactMessageVoiceClipDuration.setVisibility(View.VISIBLE); holder.contentContactMessageVoiceClipSeekBar.setVisibility(View.VISIBLE); - checkMultiselectionMode(positionInAdapter, holder, false); + checkMultiselectionMode(positionInAdapter, holder, false, message.getMsgId()); if (multipleSelect) { holder.contentContactMessageVoiceClipPlay.setOnClickListener(null); @@ -5209,7 +5208,7 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.contentOwnMessageContactThumb.setImageBitmap(bitmapDefaultAvatar); } - checkMultiselectionMode(position, holder, true); + checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -5307,7 +5306,7 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe holder.contentContactMessageContactThumb.setImageBitmap(bitmap); } - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { if (positionClicked != -1 && positionClicked == position) { @@ -5473,7 +5472,7 @@ public void bindChatLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes ((ViewHolderMessageChat) holder).contactManagementMessageLayout.setVisibility(View.VISIBLE); ((ViewHolderMessageChat) holder).contactManagementMessageIcon.setVisibility(View.GONE); - checkMultiselectionMode(position, holder, false); + checkMultiselectionMode(position, holder, false, message.getMsgId()); String textToShow = ""; int messageType = message.getType(); @@ -6047,7 +6046,6 @@ public boolean isMultipleSelect() { return multipleSelect; } - public void setMultipleSelect(boolean multipleSelect) { logDebug("setMultipleSelect"); if (this.multipleSelect != multipleSelect) { @@ -6055,74 +6053,132 @@ public void setMultipleSelect(boolean multipleSelect) { notifyDataSetChanged(); } if (this.multipleSelect) { - selectedItems = new SparseBooleanArray(); + messagesSelectedInChat.clear(); } } - public void toggleSelection(int pos) { - logDebug("The position selected is "+pos); + /** + * Method for selecting or deselecting a chat message. + * + * @param msgId The messages ID. + */ + public void toggleSelection(long msgId){ + logDebug("The message selected is "+msgId); + int position = INVALID_POSITION; + for (AndroidMegaChatMessage message : messages) { + if (message.getMessage().getMsgId() == msgId) { + position = messages.indexOf(message); + } + } - if (selectedItems.get(pos, false)) { - logDebug("Delete pos: " + pos); - selectedItems.delete(pos); + if (messagesSelectedInChat.get(msgId) != null) { + logDebug("Message removed"); + messagesSelectedInChat.remove(msgId); } else { - logDebug("Put pos: " + pos); - selectedItems.put(pos, true); + logDebug("Message selected"); + messagesSelectedInChat.put(msgId, position); } - notifyItemChanged(pos); - if (selectedItems.size() == 0){ + + notifyItemChanged(position + 1); + + if (messagesSelectedInChat.isEmpty()) { ((ChatActivityLollipop) context).updateActionModeTitle(); } } + /** + * Method for selecting all chat messages. + */ public void selectAll() { - for (int i = 0; i < this.getItemCount(); i++) { - if (!isItemChecked(i)) { - toggleSelection(i); + for(AndroidMegaChatMessage message:messages){ + if(!isItemChecked(message.getMessage().getMsgId())){ + toggleSelection(message.getMessage().getMsgId()); } - } - } - - public void updateSelectionOnScroll() { - List selected = getSelectedItems(); -// selectedItems.clear(); -// -// for (int i = 0; i < selected.size(); i++) { -// int pos = selected.get(i); -// selectedItems.put(pos + 1, true); -// notifyItemChanged(pos); -// notifyItemChanged(pos + 1); -// } + } } + /** + * Method for deselecting all chat messages. + */ public void clearSelections() { - logDebug("clearSelection"); - for (int i= 0; i getSelectedItems() { + if(messagesSelectedInChat == null || messagesSelectedInChat.isEmpty()) + return null; + + ArrayList positionsMessagesSelected = new ArrayList<>(); + for (HashMap.Entry message: messagesSelectedInChat.entrySet()) { + positionsMessagesSelected.add(message.getValue()); + } + return positionsMessagesSelected; } - public List getSelectedItems() { - if (selectedItems != null) { - List items = new ArrayList<>(selectedItems.size()); - for (int i = 0; i < selectedItems.size(); i++) { - items.add(selectedItems.keyAt(i)); + /* + * Get list of all selected chats + */ + public ArrayList getSelectedMessages() { + ArrayList returnedMessages = new ArrayList<>(); + if (messagesSelectedInChat == null || messagesSelectedInChat.isEmpty()) + return messages; + + for (HashMap.Entry messageSelected : messagesSelectedInChat.entrySet()) { + for (AndroidMegaChatMessage message : messages) { + if (message.getMessage().getMsgId() == messageSelected.getKey()) { + returnedMessages.add(message); + } } - return items; } - return null; + return returnedMessages; + } + + /** + * Method get message in the array of messages. + * + * @param position The message position. + * @return The message. + */ + public AndroidMegaChatMessage getMessageAtPosition(int position) { + if (messages == null || messages.isEmpty() || messages.get(position) == null) { + return null; + } + + return messages.get(position); } @Override @@ -6140,41 +6196,6 @@ public int getUnhandledItem() { return 0; } - /* - * Get request at specified position - */ - public AndroidMegaChatMessage getMessageAt(int positionInAdapter) { - try { - if (this.messages != null) { - return this.messages.get(positionInAdapter - 1); - } - } catch (IndexOutOfBoundsException e) { - } - return null; - } - - - /* - * Get list of all selected chats - */ - public ArrayList getSelectedMessages() { - ArrayList messages = new ArrayList(); - - if(selectedItems!=null){ - for (int i = 0; i < selectedItems.size(); i++) { - if (selectedItems.valueAt(i) == true) { - - AndroidMegaChatMessage m = getMessageAt(selectedItems.keyAt(i)); - if (m != null) { - messages.add(m); - } - } - } - } - - return messages; - } - public Object getItem(int position) { return messages.get(position - 1); } @@ -6223,6 +6244,22 @@ public void removeMessage(int position, ArrayList messag } } + /** + * Get request at specified position in Adapter. + * + * @param positionInAdapter The position in adapter. + * @return The message. + */ + public AndroidMegaChatMessage getMessageAt(int positionInAdapter) { + try { + if (this.messages != null) { + return this.messages.get(positionInAdapter - 1); + } + } catch (IndexOutOfBoundsException e) { + } + return null; + } + public void loadPreviousMessages(ArrayList messages, int counter) { logDebug("counter: " + counter); this.messages = messages; @@ -7753,28 +7790,28 @@ private void setInfoToShow (int position, final ViewHolderMessageChat holder, bo } } - private void checkMultiselectionMode(int position, final ViewHolderMessageChat holder, boolean ownMessage) { - if (isHolderNull(position, holder)) + private void checkMultiselectionMode(int positionInAdapter, final ViewHolderMessageChat holder, boolean ownMessage, long messageId) { + if (isHolderNull(positionInAdapter, holder)) return; if (multipleSelect) { if (ownMessage) { holder.ownMessageSelectLayout.setVisibility(View.VISIBLE); - if (this.isItemChecked(position)) { + if (this.isItemChecked(messageId)) { holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_select_chatroom)); } else { holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_unselect_chatroom)); } } else { holder.contactMessageSelectLayout.setVisibility(View.VISIBLE); - if (this.isItemChecked(position)) { + if (this.isItemChecked(messageId)) { holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_select_chatroom)); } else { holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_unselect_chatroom)); } } - } else if (!multipleSelect && positionClicked != -1 && positionClicked == position) { + } else if (!multipleSelect && positionClicked != -1 && positionClicked == positionInAdapter) { listFragment.smoothScrollToPosition(positionClicked); } } From effb2485c8990eaf951097553e9efd2df2433020 Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Fri, 8 May 2020 15:44:05 +0200 Subject: [PATCH 030/100] New string files to show SDK and Mega Chat errors translated, define SDK errors --- app/src/main/jni/megachat/sdk | 2 +- .../main/res/values/strings_karere_errors.xml | 4 ++ .../main/res/values/strings_sdk_errors.xml | 41 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/values/strings_karere_errors.xml create mode 100644 app/src/main/res/values/strings_sdk_errors.xml diff --git a/app/src/main/jni/megachat/sdk b/app/src/main/jni/megachat/sdk index 15d08959a38..110bd4b53bc 160000 --- a/app/src/main/jni/megachat/sdk +++ b/app/src/main/jni/megachat/sdk @@ -1 +1 @@ -Subproject commit 15d08959a38dd5bce9ef343ba1ada1dcd40a1d30 +Subproject commit 110bd4b53bc990a73878294eb752e97245999a28 diff --git a/app/src/main/res/values/strings_karere_errors.xml b/app/src/main/res/values/strings_karere_errors.xml new file mode 100644 index 00000000000..0d2c4cc4098 --- /dev/null +++ b/app/src/main/res/values/strings_karere_errors.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_sdk_errors.xml b/app/src/main/res/values/strings_sdk_errors.xml new file mode 100644 index 00000000000..19ae5fe558b --- /dev/null +++ b/app/src/main/res/values/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + No error + Internal error + Invalid argument + Request failed, retrying + Rate limit exceeded + Failed permanently + Terms of Service breached + Too many concurrent connections or transfers + Out of range + Expired + Not found + Upload produces recursivity + Circular linkage detected + Access denied + Already exists + Incomplete + Invalid key/Decryption error + Bad session ID + Not accessible due to ToS/AUP violation + Blocked + Over quota + Temporarily not available + Connection overflow + Write error + Read error + Invalid application key + SSL verification failed + Not enough quota + Multi-factor authentication required + Access denied for users + Business account has expired + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Unknown error + HTTP Error + \ No newline at end of file From 1de51415be01fb7d15f2a9e5f5217a9f1446038e Mon Sep 17 00:00:00 2001 From: Yenel Rodriguez Date: Mon, 11 May 2020 12:42:36 +0200 Subject: [PATCH 031/100] Define Mega Chat errors in strings_karere_errors --- app/src/main/res/values/strings_karere_errors.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings_karere_errors.xml b/app/src/main/res/values/strings_karere_errors.xml index 0d2c4cc4098..debc1a5116f 100644 --- a/app/src/main/res/values/strings_karere_errors.xml +++ b/app/src/main/res/values/strings_karere_errors.xml @@ -1,4 +1,10 @@ - + No error + Invalid argument + Access denied + Resource does not exist + Resource already exist + Unknown error + Too many uses for this resource \ No newline at end of file From c3018d57e845a2d8165631a8cc41d33d5366a85a Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Thu, 14 May 2020 14:29:22 +0200 Subject: [PATCH 032/100] Code changes required. Added a separator line. --- .../megachat/ChatActivityLollipop.java | 101 ++++++++---------- .../chatAdapters/MegaChatLollipopAdapter.java | 24 ++--- .../GeneralChatMessageBottomSheet.java | 8 +- ...deAttachmentBottomSheetDialogFragment.java | 6 +- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 66 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index ef3b8f71df8..d27d1d9cbe7 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -371,15 +371,15 @@ public class ChatActivityLollipop extends DownloadableActivity implements MegaCh ChatActivityLollipop chatActivity; - MenuItem importIcon; - MenuItem callMenuItem; - MenuItem videoMenuItem; - MenuItem selectMenuItem; - MenuItem inviteMenuItem; - MenuItem clearHistoryMenuItem; - MenuItem contactInfoMenuItem; - MenuItem leaveMenuItem; - MenuItem archiveMenuItem; + private MenuItem importIcon; + private MenuItem callMenuItem; + private MenuItem videoMenuItem; + private MenuItem selectMenuItem; + private MenuItem inviteMenuItem; + private MenuItem clearHistoryMenuItem; + private MenuItem contactInfoMenuItem; + private MenuItem leaveMenuItem; + private MenuItem archiveMenuItem; String intentAction; MegaChatLollipopAdapter adapter; @@ -3744,18 +3744,14 @@ public void sendMessagesToUI(ArrayList messages) { } } - public void copyMessage(AndroidMegaChatMessage message) { - String text = chatC.createSingleManagementString(message, chatRoom); - - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setText(text); - } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); - clipboard.setPrimaryClip(clip); - } - showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); + /** + * Method for copying a message. + * + * @param message The message. + * @return The copied text. + */ + public String copyMessage(AndroidMegaChatMessage message) { + return chatC.createSingleManagementString(message, chatRoom); } public void editMessage(ArrayList messagesSelected) { @@ -3771,7 +3767,6 @@ public void editMessage(ArrayList messagesSelected) { if (msg.getType() == MegaChatMessage.TYPE_CONTAINS_META && meta != null && meta.getType() == MegaChatContainsMeta.CONTAINS_META_GEOLOCATION) { sendLocation(); finishMultiselectionMode(); - } else { textChat.setText(messageToEdit.getContent()); textChat.setSelection(textChat.getText().length()); @@ -3875,46 +3870,34 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { ArrayList messagesSelected = adapter.getSelectedMessages(); switch(item.getItemId()){ - case R.id.chat_cab_menu_edit:{ + case R.id.chat_cab_menu_edit: logDebug("Edit text"); editMessage(messagesSelected); break; - } - case R.id.chat_cab_menu_forward:{ + + case R.id.chat_cab_menu_forward: logDebug("Forward message"); forwardMessages(messagesSelected); break; - } - case R.id.chat_cab_menu_copy:{ + + case R.id.chat_cab_menu_copy: finishMultiselectionMode(); String text = ""; - if (messagesSelected.size() == 1) { - copyMessage(messagesSelected.get(0)); - + text = copyMessage(messagesSelected.get(0)); } else { text = copyMessages(messagesSelected); - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { - android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setText(text); - - } else { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); - clipboard.setPrimaryClip(clip); - } - showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); } - + copyToClipboard(text); break; - } - case R.id.chat_cab_menu_delete:{ + + case R.id.chat_cab_menu_delete: finishMultiselectionMode(); //Delete showConfirmationDeleteMessages(messagesSelected, chatRoom); break; - } - case R.id.chat_cab_menu_download: { + + case R.id.chat_cab_menu_download: logDebug("chat_cab_menu_download "); clearSelections(); hideMultipleSelect(); @@ -3929,13 +3912,13 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { } chatC.prepareForChatDownload(list); break; - } - case R.id.chat_cab_menu_import:{ + + case R.id.chat_cab_menu_import: finishMultiselectionMode(); chatC.importNodesFromAndroidMessages(messagesSelected); break; - } - case R.id.chat_cab_menu_offline:{ + + case R.id.chat_cab_menu_offline: finishMultiselectionMode(); if (!checkPermissionWriteStorage(REQUEST_WRITE_STORAGE_OFFLINE)) { preservedMessagesSelected = messagesSelected; @@ -3943,7 +3926,7 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { } chatC.saveForOfflineWithAndroidMessages(messagesSelected, chatRoom); break; - } + } return false; } @@ -3966,6 +3949,18 @@ public String copyMessages(ArrayList messagesSelected){ return builder.toString(); } + /** + * Method for copying a text to the clipboard. + * + * @param text The text. + */ + private void copyToClipboard(String text) { + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); + clipboard.setPrimaryClip(clip); + showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); + } + @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { logDebug("onCreateActionMode"); @@ -4789,14 +4784,10 @@ else if(m.getMessage().getType()==MegaChatMessage.TYPE_CONTACT_ATTACHMENT){ showGeneralChatMessageBottomSheet(m, positionInMessages); }else{ String url = richLinkMessage.getUrl(); - if (richLinkMessage.isChat()) { loadChatLink(url); - } else if (richLinkMessage.getNode() != null) { - openMegaLink(url, richLinkMessage.getNode().isFile()); } else { - openMegaLink(url, richLinkMessage.isFile()); - + openMegaLink(url, richLinkMessage.getNode() != null ? richLinkMessage.getNode().isFile() : richLinkMessage.isFile()); } } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index 59bfddb54f3..aeeac7b0e0a 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -528,7 +528,7 @@ public MegaChatLollipopAdapter(Context _context, MegaChatRoom chatRoom, ArrayLis logDebug("New adapter"); this.context = _context; this.messages = _messages; - this.positionClicked = -1; + this.positionClicked = INVALID_POSITION; this.chatRoom = chatRoom; this.removedMessages = _removedMessages; this.messagesPlaying = _messagesPlaying; @@ -2633,7 +2633,7 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardOwnRichLinks.setEnabled(false); } else { holder.forwardOwnRichLinks.setEnabled(true); @@ -2748,7 +2748,7 @@ public void bindContainsMetaMessage(ViewHolderMessageChat holder, AndroidMegaCha checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardContactRichLinks.setEnabled(false); } else { holder.forwardContactRichLinks.setEnabled(true); @@ -3064,7 +3064,7 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardOwnMessageLocation.setEnabled(false); } else { holder.forwardOwnMessageLocation.setEnabled(true); @@ -3162,7 +3162,7 @@ public void bindGeoLocationMessage(ViewHolderMessageChat holder, AndroidMegaChat checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardContactMessageLocation.setEnabled(false); } else { holder.forwardContactMessageLocation.setEnabled(true); @@ -3422,7 +3422,7 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardOwnRichLinks.setEnabled(false); } else { holder.forwardOwnRichLinks.setEnabled(true); @@ -3619,7 +3619,7 @@ public void bindMegaLinkMessage(ViewHolderMessageChat holder, AndroidMegaChatMes checkMultiselectionMode(position, holder, false, message.getMsgId()); if(!multipleSelect){ - if(positionClicked != -1 && positionClicked == position){ + if(positionClicked != INVALID_POSITION && positionClicked == position){ holder.forwardContactRichLinks.setEnabled(false); }else{ holder.forwardContactRichLinks.setEnabled(true); @@ -4201,7 +4201,7 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardOwnFile.setEnabled(false); holder.forwardOwnPortrait.setEnabled(false); holder.forwardOwnLandscape.setEnabled(false); @@ -4514,7 +4514,7 @@ public void bindNodeAttachmentMessage(ViewHolderMessageChat holder, AndroidMegaC checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardContactFile.setEnabled(false); holder.forwardContactPreviewPortrait.setEnabled(false); holder.forwardContactPreviewLandscape.setEnabled(false); @@ -5211,7 +5211,7 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe checkMultiselectionMode(position, holder, true, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardOwnContact.setEnabled(false); } else { holder.forwardOwnContact.setEnabled(true); @@ -5309,7 +5309,7 @@ public void bindContactAttachmentMessage(ViewHolderMessageChat holder, AndroidMe checkMultiselectionMode(position, holder, false, message.getMsgId()); if (!multipleSelect) { - if (positionClicked != -1 && positionClicked == position) { + if (positionClicked != INVALID_POSITION && positionClicked == position) { holder.forwardContactContact.setEnabled(false); } else { holder.forwardContactContact.setEnabled(true); @@ -7811,7 +7811,7 @@ private void checkMultiselectionMode(int positionInAdapter, final ViewHolderMess } } - } else if (!multipleSelect && positionClicked != -1 && positionClicked == positionInAdapter) { + } else if (positionClicked != INVALID_POSITION && positionClicked == positionInAdapter) { listFragment.smoothScrollToPosition(positionClicked); } } diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java index 224f2e0b731..a5f918604b4 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java @@ -1,5 +1,6 @@ package mega.privacy.android.app.modalbottomsheet.chatmodalbottomsheet; +import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; import android.os.Bundle; @@ -56,6 +57,7 @@ public void onCreate(Bundle savedInstanceState) { chatC = new ChatController(context); } + @SuppressLint("RestrictedApi") @Override public void setupDialog(final Dialog dialog, int style) { super.setupDialog(dialog, style); @@ -180,12 +182,6 @@ public void onClick(View view) { setStateBottomSheetBehaviorHidden(); } - @Override - public void onAttach(Context context) { - super.onAttach(context); - this.context = context; - } - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java index 2474b69c8d0..aa57be99841 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/NodeAttachmentBottomSheetDialogFragment.java @@ -228,7 +228,11 @@ public void setupDialog(final Dialog dialog, int style) { showSingleNodeSelected(); } - separatorInfo.setVisibility(optionView.getVisibility()); + if(optionView.getVisibility() == View.VISIBLE || optionImport.getVisibility() == View.VISIBLE){ + separatorInfo.setVisibility(View.VISIBLE); + }else{ + separatorRemove.setVisibility(View.GONE); + } if ((optionDownload.getVisibility() == View.GONE && optionImport.getVisibility() == View.GONE && optionForward.getVisibility() == View.GONE && optionSaveOffline.getVisibility() == View.GONE) || optionRemove.getVisibility() == View.GONE) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7ab55da3ac..7f6277c937b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2765,6 +2765,6 @@ Always save to this location? Attach from… - Select Message + Select message From c07ae404bd698ee9827ba61b1d70761f6b2a873c Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Thu, 14 May 2020 14:49:13 +0200 Subject: [PATCH 033/100] Updated icons. --- .../chatAdapters/MegaChatLollipopAdapter.java | 4 ++-- .../GeneralChatMessageBottomSheet.java | 1 - app/src/main/res/drawable-hdpi/ic_copy_grey.png | Bin 605 -> 0 bytes app/src/main/res/drawable-hdpi/ic_delete_msg.png | Bin 493 -> 0 bytes app/src/main/res/drawable-hdpi/ic_edit_msg.png | Bin 465 -> 0 bytes app/src/main/res/drawable-hdpi/ic_open_with.png | Bin 688 -> 0 bytes .../res/drawable-hdpi/ic_select_chatroom.png | Bin 840 -> 0 bytes app/src/main/res/drawable-mdpi/ic_copy_grey.png | Bin 414 -> 0 bytes app/src/main/res/drawable-mdpi/ic_delete_msg.png | Bin 371 -> 0 bytes app/src/main/res/drawable-mdpi/ic_edit_msg.png | Bin 356 -> 0 bytes app/src/main/res/drawable-mdpi/ic_open_with.png | Bin 495 -> 0 bytes .../res/drawable-mdpi/ic_select_chatroom.png | Bin 606 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_copy_grey.png | Bin 628 -> 0 bytes .../main/res/drawable-xhdpi/ic_delete_msg.png | Bin 600 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_edit_msg.png | Bin 525 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_open_with.png | Bin 839 -> 0 bytes .../res/drawable-xhdpi/ic_select_chatroom.png | Bin 1071 -> 0 bytes .../main/res/drawable-xxhdpi/ic_copy_grey.png | Bin 821 -> 0 bytes .../main/res/drawable-xxhdpi/ic_delete_msg.png | Bin 833 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_edit_msg.png | Bin 691 -> 0 bytes .../main/res/drawable-xxhdpi/ic_open_with.png | Bin 1171 -> 0 bytes .../res/drawable-xxhdpi/ic_select_chatroom.png | Bin 1558 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_copy_grey.png | Bin 1146 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_delete_msg.png | Bin 1196 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_edit_msg.png | Bin 897 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_open_with.png | Bin 1466 -> 0 bytes .../res/drawable-xxxhdpi/ic_select_chatroom.png | Bin 2097 -> 0 bytes .../bottom_sheet_contact_attachment_item.xml | 6 ++++-- .../bottom_sheet_general_chat_messages.xml | 9 ++++++--- .../layout/bottom_sheet_node_attachment_item.xml | 3 ++- 30 files changed, 14 insertions(+), 9 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_copy_grey.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_delete_msg.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_edit_msg.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_open_with.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_select_chatroom.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_copy_grey.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_delete_msg.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_edit_msg.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_open_with.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_select_chatroom.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_copy_grey.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_msg.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_edit_msg.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_open_with.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_select_chatroom.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_copy_grey.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_msg.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_edit_msg.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_open_with.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_select_chatroom.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_copy_grey.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_msg.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_edit_msg.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_open_with.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_select_chatroom.png diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index aeeac7b0e0a..196d5f399d4 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -7798,14 +7798,14 @@ private void checkMultiselectionMode(int positionInAdapter, final ViewHolderMess if (ownMessage) { holder.ownMessageSelectLayout.setVisibility(View.VISIBLE); if (this.isItemChecked(messageId)) { - holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_select_chatroom)); + holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.media_select_ic)); } else { holder.ownMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_unselect_chatroom)); } } else { holder.contactMessageSelectLayout.setVisibility(View.VISIBLE); if (this.isItemChecked(messageId)) { - holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_select_chatroom)); + holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.media_select_ic)); } else { holder.contactMessageSelectIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_unselect_chatroom)); } diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java index a5f918604b4..abd8673719d 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.app.Dialog; -import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; diff --git a/app/src/main/res/drawable-hdpi/ic_copy_grey.png b/app/src/main/res/drawable-hdpi/ic_copy_grey.png deleted file mode 100644 index caa8ab90e024839711b40f8680a5a9281f293f26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`*>O)7$B+ol zw-LMjju;5=@N=$fY;tF{DpbAC!0S=+fqlv!-uT0%92preRtPR~2v7`kXll)jeTi>rqxjExxOY?c28t;H@Vm}#PaQ@0*yq;*XFqB2cA^kOz z?BnMjzRLb{Tc_E2&%HkI=bF2E4YDt$njUDK9d=IiqP<|5aIxfrb~Q$!)to1LWW5t~ zs*SEWT`MhVb1E#Bh-u%n^@O#<_6ynEI}Su}x?0y>oAmY}Z{4Th1LF5vjP9vi<2iY` zylrM=pVdo7how1Be9OMvt&-MOto-F?czbpEv4;ov&NK<^RSUW{iFf+XxvoJ6KOI#& za-DOMm*WbBt=`VwT24<6Uf#ZdGtzu(-{vp*HVfqbgq*V3Qj(iFdqVdVo7!K$CNI^w z8Q%3pnRTI8n953#mM6bNf6ot4RXsIP$+^CofA2~jxA(6m-E~i2AaV5O;vm{oW zNme~_`FKC)l(l;#PfotQSmoNJt%bkz4lXINRNnl6O*`mdKI;Vst0OAPsfB*mh diff --git a/app/src/main/res/drawable-hdpi/ic_delete_msg.png b/app/src/main/res/drawable-hdpi/ic_delete_msg.png deleted file mode 100644 index 285930e70ea05fd1ccea70f42c01c539836eed89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`S-7W*V@L$& z+c3wzLk2uK-?((d7w|t)->^UG!Kv#4ccvXOtym@D)o`UuTi0o2i&Ii{n$gxvBCd6t zm~S?|Ik1>{pHBL{>hBU0*Der~*z{)Fnyi>}s~>)e>0OrHt#M_+wqpuw#CDZP>}I-9 zXz}q!rt8KT*|v#WEx%5kvgNicS9p$PJBQfv_cy&Bi4-}#YkHlnlTcRqDAsGvrYkE< zvN%k3Y6%u@YSDPIW=Fb8-Z7h1m0lt7NmtUjJ07Q%p3BWh7y0CUPw^UC{cm|G+x4Dq zTNN7Ygs-Y>?#fJB@!whG+|soDUoINIEcVddtQW9%(TqbX8hbXyOXau6IV{_%`c)!n zSy_NMtD(i(^+~^SUftOEL?-FczK8FlwWhIbWm9dLB%}R5c5a);AGj*k$p+poE4`ZZ?9UsAvIogBI~c^5J}P{FDi|2V O3=E#GelF{r5}E+MmAq~M diff --git a/app/src/main/res/drawable-hdpi/ic_edit_msg.png b/app/src/main/res/drawable-hdpi/ic_edit_msg.png deleted file mode 100644 index 7c477d498d8901810efa22b62eaf752692eab76f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`nYE{jV@L$& z+iBKZOojq&*V*F^cx@D}nRo2evFn;P6T?4fOfys3X11;CzrOUu3Clgjj_~|RF`qfJ z#(HMzc8yI>xt?(SDPw(gApf_G)8XScFHhe&{Q}P}$Mh3fD;s8%Gx~Zr8M>*j5OG*! z#I!6$i=(tvFUiUDQ%~}&hM5_Y%1l4MfBEdU)}N-G6+Tuon6G`?mYZe9e!NtChHTN@ z+@DDdf^GT2)h?-PdW3nJof{V&YGHD1=VbI^`m8IE7rIrbNB;_ zB;*%(CB!sxY;J4g35W= z5Hnr(q+xB|A-h6T$u|4w;uVi)Iefb9^?iMGaPW6~rXTXfO>$3TxRd#fj!s{9>*0#n hliWL*b~61BX;gRSwG-`qA^s5*oSv?JF6*2UngCkjqG$jB diff --git a/app/src/main/res/drawable-hdpi/ic_open_with.png b/app/src/main/res/drawable-hdpi/ic_open_with.png deleted file mode 100644 index d7a0e3cae82c98544af187ce389508c10ffb3f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM31Cx}ei(^Ox z=i6{=?;{QZcJdW=TB2)0)@|IhX~PE5jT?pj$WCkD@0|07Rr=teupAv7k(@0-j(pO( zTRyWcy1zZG?_{dk%^A5ZJT==lPrf-*e{=t7GpVgtL|240?rV6c{9z_bTZ7GiYtd|; zUoMUIcjX)TwUn9{N$7H}Ve~#`eEN!CPferlf=tV=H_9%&&zRjWa59G}_?BgWd|Nz+ zr16}70qw;n?=1MwP%|^|(lPOp{)S42WixWQHAK2EXt=%1yygCXlR?m}ha#~}PDauW z+!|Br4mWoPwoKLZc00C7)TsN`jOEcSJL+75xczz>*SbEFNq+zNSageo$CKzOlh*d1 zVSM!D*cOhdXXY0EH2S2gqxNdSiO6=?kY(Ox+bkzsNtgG;p?IGF#Er2>lZ!A4|_dXt@(ol z=bpZ~hO4&A{8r}D<3Z`63$FAwmvvA0clhzb?F*PfLM6TBmsm~jUVD1^|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM31Jfo?7srqY z&bKr6XNx$B9N)kBdEyg+AeM(sP7XX`SzQUq3(Lc%F|wZg%bcX#v2}sd8yC;y>{3Sq zfok7Ht-V}L5gAh#JUMVmO{)IMv7hJCzL%Ayn-}lie$hcr$9lK%=X>e*_s*<*-(Y() zRZgJxv)9YS%6C1p%vl>fOXctGT9M@&FO+|^ma+F`xWJ;*eBp)cQBhJ&FJhRV@OsD; z87X`a75J|3dUJ-EdCapNjC*t9UBtgDJ{1&S+G*%i)7Jjl;`S{6FGu4lHl}|L^jcUq zPcr9}`p(1^6Xl&`uei>YoOEwx;;rJWcTanMR_>Bpd~sITM%CQO+S{i8iv9ef=hv3i zEC2qq_DlHcEZYA}JXhTTP5jqj?JD=-l&*^r93#qj>`+iMwJiBym zx#`XZmgEfQeC31O|MQp%FF&^1oP5Z(*Q`3p=7sEy(#x-3ZrCQlU4G0jDQ896+w1z7 zr|*9~Y^WyC-^|F7DAzatm@lh|X;FoBZ=0|13H#aGf+yURKM*5n+jd*~{l^EVkDvJ% z{XEg)7|SRAQyVtlcawQGjj2dL?%YBi9u0LKN25lkpy=c!yX4QSpL-mVd*g*3!{RR< zk2yN4JAV4Cy0V9>PtGF4L9}_H=EY8_H{2OtpO>55vprl@9_;L^;a_OV%J@dYIPiCl zw4XuaA0K_YgB5W%Bls7_`NwH+EtXNa@4`F7!N*!wr6KC~S7-gVbLM^2Ej@a9g=d?C z|Bl}M8Rap-S02`e*8Kjw+kF3hvEVz!YpYD&o7pZAE}F`0?WHJ@>wL3Ilu=E9-B2+- zD`4A?m&bGN_y~1eWfcCjsntwps)taA!WzDo^6e&Sul!azoLSH(^k=ck{dbB@8?`Q6 zJ;-3|dOjsY=2p%X&6RIubwn=LZ?d>sAL`})(Cgo3#jLFLd$nyoh~Js>pHb>bjXx+A Nd%F6$taD0e0sysGUOxZ; diff --git a/app/src/main/res/drawable-mdpi/ic_copy_grey.png b/app/src/main/res/drawable-mdpi/ic_copy_grey.png deleted file mode 100644 index 5d0dafc6efa014596c28097c7c09ba0b8d516072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfjKkB#F~oy6 zIbnfef{Rf+^9eq-q&gMDl4srv4pb@ZYu9V+KHsA>Xble<%vd;%i zF_W#Ul+jRIK%McUjlw?eBN`0z`2$3R9vsj)_cxNMgJbkaBDV{{&}dZE4F6yQEOZg+RsGjcI{NoCiZn zm@^!;TltP%=zGJ=F4DsMi zPLN<#HfGt!?RB#Dq3F#o^WB}M1aLH5X}Hq#MIeZKI(z1iGs>U-bN8PRt(n%q%f5`UEEr-_dostnUj-Os6 z^~A^Ral6)j=2$kPhvF{P1Va_>kCJ>r-WQlQG>4EgmCNf)`d@5p-KZq>V%2H|!-5pyiIN-J1WptLxE-GM@WaVOQ=Zrf63iWe&3Srr n{68;hde$m?M|*Kkq97B)4b_z|($C~NfjsQ#>gTe~DWM4ff8BWv diff --git a/app/src/main/res/drawable-mdpi/ic_edit_msg.png b/app/src/main/res/drawable-mdpi/ic_edit_msg.png deleted file mode 100644 index 470ace10c9c9d08c8926aad6ceac02e9e496ac6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfUo%3{Y4DsMi zPLN=Awq^OzD0kuDbI!DyNi0uT8a~Z*$YDHU-}pmOAeo^^mqBtK;}NF-;j0Z_iWTZu zpB~m!v*@m1+x1Xk?)!!xhGxnhTN$Q5G;V0CKa$3%Z00DF^n>SrgEK$#MllX1UJv%9 zh#Adim|3|`Jhk9u*Hk*jG~wX_4%UkX4pSZ~9Bt8AaH7CTEFj0ij(bItg&y~cG>a2V zIX@fTaIi{t@NI}>_{7K~FgGee>O!Vi38RYLriWDy9~~5)xlKBLROhg&p_ZMGGXq1B WpvFp(|H*bBA9}j_xvX-|qEBeizXH{!MLPYEjJdd4} zJon@)zvNPVo9Sm$j3)b(6^EK$loy?$)w4d~b_;KWR*!tb>^9pM;>Yf9lui4cQ|Ga^ z>Amy$8@c6dhpo=sWW2qdb4wAc{2@^r2Tys4en;-8me>de_1vwRQ(bqpY*SZ7CIc=|Zy?HQCQvCzVs&aK# zA&mu-T0}GhH44i9eP>ye}zw)-HnV*qic>5C+ N*q*L_F6*2UngFgux(fgR diff --git a/app/src/main/res/drawable-mdpi/ic_select_chatroom.png b/app/src/main/res/drawable-mdpi/ic_select_chatroom.png deleted file mode 100644 index c6d7435ea0441e51f566eadebba1e52df2fbda0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf?1ZO_V~7Xu z)zFPz%#H$cZF#)}HVUvtAH2aSq|Lp!wYT@y(f=F~TxMQ%hxDeZ?d1^Uo?UY6kduKx z%L-Q(Zp8`3>EFJUnQbqx3hd@lu{O5;eedqOH`Wb-<`aJ~^}4ay$(5z{{^{H!Bi{5Y zongP?Un!rbSrg8GZ>mY@P+t-L?ZEfbLK%jePI+~>3oK%3O}gsE?l|SZciSE7=6HOV zl;CU)+ezU8vNY+H2ya>q@$C4SHDzMekI z0p_K){KkhZI~pSzC7E7Ld(Ri5ADn!x`<;Pl>nj^ABbF;&W)49nvu8HkzM89X=FHAh z8@8U5VEnrCoO&Ne-PTR4SGSv8*{$Cf)qIrWkoS{_gdmweFJ7MWxiN3wgae#!ge1?V ztG)CT6nWeJAY}D_i^e_wwv|@RFZle=OXc*PNIQkJ|kKp>gTe~DWM4f^bPIf diff --git a/app/src/main/res/drawable-xhdpi/ic_copy_grey.png b/app/src/main/res/drawable-xhdpi/ic_copy_grey.png deleted file mode 100644 index c9f0f20416648de7852275bb42ad5e9dd5490a9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?oyXWcR7?Q#I zHqzFc#ZbW3-r>)Yb8gbPN3PW?-uR)uCU=ca?v|amqCW6*{Nr=H;8krM`0>ao^9PQ3 zl{?R#OZ$HBA>SV5nJSYjPoCl1ef@Q*(M{nQojLpY{xWXhUE}&}%1ZVbA2{wX#ivf* z`?#mUvYtt&s#omV-bMASHDX^PcNHHwC0G*e@;-EJ!b80e41X$mk6b%DsZn;(>eaUz z8j}y4NSRuhl)H6-weFXtyWX%Zk~+lr3M6w^2_?u&yV?GKy;5kwIipnfhPhs|t*%PHC|Yn^B;@aCV?uk585|b-5&6*W6gB0F2&*1?oJLKu&7?Q#I zHsZA3VFQ7ZsJ`AETgv}+G5=xzBOvrgbk0Mjw-Xa=1iND<`u>sdc8QALmihMP%$vQB zk6B7TYp_h*4g6c7F_-2Q#}-G7rclT`S9653_b zJtM^ze^z9iWZ-(_N&QA+t&N_dFRcGxvNS(Y^Zw2@=|9fCsvE>44hY3O`5^sW=eoCH zq{IJ@-(GCL%j@0ZW%uO8{rLIQI!?cD^uL#&l9s^nI)^bL!g)d3+6jHh6B~jAb3Q!? z)KLg`;r?`$Dadt;lE2^vl_Vddt)Xe}%nr1&eBUhH@|kCi`)$pMuyo!jqg)i zQkdtdTK?X%=BiRC!=wzQs0r@-o~RqD{Xg!ww&B@6j{HE@Sq++>6nH-A<|lb^XFfT+ z^3$|RhACdhJ}T|g_-W%Vryh~eW~paq=I&k?zFRqTYXDcJq3hh}oomIo12|i^2|jP# z<5KF|+M&d#HBs`@T9=gjN3<$;{J8wtsZ49p^O@#lVXSE<)Bo_c7>I>!VhB65LyPCk z6R}tO?uh6gB0F2&*1?oEBAD949Q@9 zJKfuh#ZaK_IQxzZlQk+B9o=Q`D^)S&8>$!UbI7@FKb({H_P;*U++}Y=tX8Ucv39Ac zto*glD`CdXGi{{@tP*55@I|oyD_}3v+B|>3KkcOEAM*|c1wRlu;NM|;L@=rMhm%Wh z6jMw6n~8Esa=L-e4{{jp?F>k26|i5PTfXVS^bh=vQQI3!^LH+3V3}9&UM?{q$jgE2 zKij?Y44b#_d3v@)t$4{^@g-`1+7sq)ca2Wy%gXv-a#19p{kn*S`zLELjvmkR%Vq~Z zX6rf_tg_u9@W&k{aSx53f?joIEal4Ac|#hPyYMx7KiOF*EBQ0+?Vi<>wE{%v328E2 zeHhFlW>IsNrE%e>oL#2N?>HEL5a|@n;Ia#Qz{M`HaN)n4T@06`Glb?T2{ooY)KvKC ze(la?#U0W@jN89&&%bDXzuiN01(*NKyZZu<)NuS`cs^h7xL~DI^z>xuWn4T5g@3Vb qv=6&*Z4L7^#@7wtp!(r2`-5@vC(G`DSqpE1qQcYF&t;ucLK6VkZ@yvx diff --git a/app/src/main/res/drawable-xhdpi/ic_open_with.png b/app/src/main/res/drawable-xhdpi/ic_open_with.png deleted file mode 100644 index 17abc97801ec38135819a3ef6975af969bdffcd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*5QUVA|;E;uw;_ z`ZmJWU&c^i?*tA-yCuS+9wHNeXb4Q4q}J3W*U7ZhlS}I#v%Qk93$s0=)D*qiRW2(# zTpE9@a42}XP(`VU<Z1C3PpHKIoiYkt4I2=M1wRqqe#1)W-cE9~}Sj zPK@FA^#;$+E?bWo$gQ8%!p`$cE+eyb=6Bb5_w*Zr&1yPxStCB{NNeV5%x@5W(Edi_ z#=q{u=mR1P>Y4Qul;<1~W2nz5+Nr-VpJD%;G!OoN%$FOD_P5wA&uI;b<}BPk@z9xY zRsFxJxs&SIPo${U#_rE$EI2-)NJG^Bt|fjR#qPcJ@5(3J-=7rM(!9+j z;_EcC(CkyS9^Y$@1Jadjw_Y>sne@JtLGQ`>5Xrw`y8^4XGU+|>?9)H>r1xy>OXJ?i zq}#2Vj!oaVbJBB}nwz;yj~V2B?Zm*-|3MJmKbw#j@cG`qrGbl>f>VbK2vgTws+) zsfXqD7@zIAtX~ALJ?EXPIN|bzaI0C}m1o2n_PIqK3brynHt{&y^9M0OCgPXBU)ger z_ui3@S%#K@pR_)R9RAIB6b zny~5b+4zj_pw!jyeuGeDGP+tQ$6$P9x2E7|@rI$38Q+VE7_7nF!SUHx3v IIVCg!0DbCIJ^%m! diff --git a/app/src/main/res/drawable-xhdpi/ic_select_chatroom.png b/app/src/main/res/drawable-xhdpi/ic_select_chatroom.png deleted file mode 100644 index cd39b66d3f2e8133662e42eace6f9f92559e1222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1071 zcmV+~1kn45P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFnMp)JRA>e5S-)=+F%*8jHvCe> zR22znafF&buL;nT#Q6~`FpRwuWS&xC`y3TZ->mNSIk!jP z`N9x+zi$Z8H^njJi)a6nu{C1s4z&jE(wV6>+W__i8nqI&TK7b+@3Bo5@6W!H=Ut(R z%3{1<@TwPV#cwjLv zF$#GYW1N_GG48>R28L2e8y`FKz}obNs7^F^D5}IpKLe=q&P$~YaOEqilf=Ugp7DUckCS zz!7)=PeXw70L7R_fibF$7YP8P%prJ@LdRwp0rn*dO!)uO@O~(v}6O)M|x9ba9S)#AW{DCO5UvMynU&R z%dKNG5D>Zz@oHR{@U<`rT*s)m1&^q}7BqbdL3C=vKtfHY&VU!74A{)u=@;|M?e2%v z-bRf|8+~EE1wz>As4*VY-VA4&WLhymyhnI+6G5JCxFd58D z09qyFzFsk4iO^5Y1OOabCE9G$S_5?uvzy8Fe#tvslkW$4HLYS?Vla~oeMab3Z|6R{_ zdCSwcSEuEtRjvA0o>!f|?0LEE=Ig%`Q;u{A8Za?(_Ec@@t-ZE;*7EO~{Z^&rKNoSW zUm|_U`R*yj@6Q>0gP;FiGIfIAmo2s4^VfUY+un};Y4Prb=m$Oz!-ogvs$SB0DJXwS zPtQU6$(=B7KE0s*&WtBnGp5g(lgTNtOP0$cnU8^+FIwlaROuG?N7qgz{PVGhnzv?y zY*^0uqRrY(n`8>^I!Y?E&0sWg;9)$LBY1?NNcQNARa2j>DKgJ>*jQw)a^`d_>)E>| z%O#Z5%aXbc?y0c;HeAWcvD_s|eH%lI&>QjXW()duzum*uxP(*V^c~;giR(_??bBFb zH?{fIm5XvpoKGjI*u7jP=~y4fd$Rjh$!Sr6ed?kfmdrtoQ>+yXmk2R*DokZsVYp-x zgK1NU)Pi~s>mP@gPvPK*nebqpl!AFfE*y}xbN2N8 zw;F;xy&o(WSGfNFUB)IAn?Th&x6H0DDOzIHQ0(_9s@bLeKo{deUz=KvhmxCC9ba-n uWUWGbjk02v!pG#GD{Z362`o=o>KIQ>aJXhVH82U3WIbK|T-G@yGywox3`em5 diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_msg.png b/app/src/main/res/drawable-xxhdpi/ic_delete_msg.png deleted file mode 100644 index 67dcd72032859a0c03f00ebba3ddd23c4002d47e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(<^v49!D1}U6i==Pq0foZj;i(^Oy z(*EB(b>e&`?VdMxe@N#fJ}o!7tEJc|;gIQaN%7eF zrP=F`<((_P|2_7~zG+(4>uT>;`|E|hxs!09l}Tg)1FMDuBUeBJg1Nvq!L+t=Q;pr< zn0fR1ZvD&O$iH(T2UKR)CZ7H%y3ZF2oUAuqmtyj8=rIjQzU)<`7%wPY%?u&cheYSgNf5nFGQM=pSY;bkOy}0%EKX(4gQ)l!| z)4!Lvq(tA}z3OFE-B)Yn zyt-=nKYiMs*Ve~1r{?*(Jr`%G@_Ef>To}P2)b~1SP2q&YA{?yA6N?_CFm^efYMsox zf3 zIrHVakbN(gu)MWmW7TkA z#^-@XZ!8&=%Xm(|4fQ+mD)041L7u()wYM@n*V(9c=B?7lS@z4L*_rrug=+Dsbxr%< zBwuvMC_wL=Pr|;Uf&$%ZtBz_kehy4Z5^Fp(uh=T7DI%<*sOv#OO}4|bf;EgY4{v1I zqJDHi^vsB`2F}F9&Y4FUgK`xfJeYn!SY)!qQS&GNkFDq2qR*Nb36zP@RS>t>+HmK= z6^5c#W77%Nb2J+pn)6C~9EFo7<%zD&?DD;(%XeW*BVP*7mZEZhz5;<+4hIfyvO46@ z8CV+mcU>s=3Qie^Oa{~D#f(=({4y6jEAV2HJ$3fN+L-(k3@_a~Z8DN@gNhvqmXHza-U+WTIN zUHB4PQSV~jCvxl#vnv8SQVZ6l+^Ig9+xk)b?x)I&?SIdk07Lb||F-f;3`X)x8`}!9 oY)zl-=MeKijXp?BstNsI)IMD!$M)jgJWzu1boFyt=akR{02heP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS;{YgYYRCodHo4bk?K@f)53$6xU zz|2)a5$_-fZlVYVYo?|mqKS_nK7eTB@z``R8~z5P3??Qa2fmup$*V5^%vE@$H9f-MEhK&Wq4fDKW9{8S0}XV_Qx_$>8uJ)*;4qjx@A>!+#m-0uC;t8sVIPwx~H8 zCRlqA7lD#-Sj|ca9r}u%lN=7)VC_L%Axrj9a(3vm!1*~$JXSz_e2}cqp=B9XPZ0Di zDR8UL3P^kQ`D(pT;(P_1tu^%$&NTGBCQmTQ3Mg1nhZ$nv{1`T_Q3KQ|9KszXK%K)G zB|yEv85Kai!66`CJZEEke0-=|1QvHIZ9<+`8fdz^zt?t$7ar94%$=`bkhmBTIJcQ zbbkyCJ62xQV>4H-Wrq5X=GS2&8Qt>6 lPQVE`0Vm)DoIqLve*n=xnCBFZI4A%B002ovPDHLkV1fqM^E&_l diff --git a/app/src/main/res/drawable-xxhdpi/ic_select_chatroom.png b/app/src/main/res/drawable-xxhdpi/ic_select_chatroom.png deleted file mode 100644 index a57281e5f710de461e77513d6e63ce03f5c04763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1558 zcmV+x2I={UP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=fJsC_RCodHoX=|=RTRh1o&2OR zG@^-$RoqCi>PkVRA<5gRD5VvQ$wqhn0j=)TYIpwl1KjE6B@rx$qArB|Aff>UK~cno z3W}l&E3w+N$s5o2J||3H-?{hBo!?;&JTh-)&Yko9yfb(1+&L4X#u@?*frdaspdnCK z0;=%9KY#BKUA#C=Vdp*y=_sl2D3Q9E!f>3F8rSiJ;WjUC6NSG~sJ_S<5x=V^GfO~+6D?$u5Lr+fjeugp-m z`z&Y3LkwjwL0tA-mD=SD`-s%wt28^mVR!J`BOgF(D=nhEml?{mUswsfl-lG|@p)=3 ztR?ic?w&26jdyOL&d%!$X2E*oJa$lOiGq>SH1qhcSv8*>pta?Px#L~pv_G6xaDMHm zzqmtRpt&bM^z*;kE4ccr=ePCtX+EXiFCPx##}CA@=$Jh9#N5(l(DxsV(9aj%;Gmw0 zwOOG>^%fnOc!utLWXCrse?S{=Pf}<1UG8rl^gVbXeoB2x!Qcs+dEyVB(dVR#nfOI1I$9yMp*ix8>x3bmv#qKF1`QWA^B{ll4Kkl;a8!QgX1S z*o)exs6#aHXp$j-J0J`K_jbOm#-%(BQ647^jNIiqm~_tsjF3wo1f~HK`SLhPYl*&_ z|GH(+>e3uhXVu(P-L?iTmwPw23{v5_y2-c3>!`^NXrn#Lm-J%p%B`w0+yR=P&0=;y zo$!pMjrwkO&}Qy~FcWy?(l4Ar*-my<1t})ohDL8S%}kmz2-Bn$g)^iS%}?H*4mGqv zqruF8x^u_|_i{D?&dRZATE2Ul&falvx*#kXn#AO7C{lQYO~f<0Z>qIU%6S84w-^mu!W=(Hdo~G9WxFFVTvF z!y*k@Wk69OK?#rwg#&#CtummDz?{7C2rVBwP7v*4g~PD~CEsJA1cm4Zi@$L*;9$f% z6a+M^0-FD3ldgoJ=u;Y;uGYSB$r+^UbNc!?ue@h$Lc@UrM!p)BkV&P%L2w4GG9VN$ zrL=QDeN7n5MJ7Qi6^;&0)+z%+Wmg76YD37Q%n-S;a64vr43g2@?#g2`@8px~N( zb#EqB0}fAjK&xOfpl&tkmf+{Tx)%}}DlK!mDz>D#AZ(TaVJoUhbFet1lHpi2nuoVJ zPukB-Or@LbO8eubp0w9>$XsfhlX*{*W)=@?v(#FfPca07I^=_D4%+O1P^67IN6<+}j_7gVql7a!H$ScBH$Cd3^O z%KK5luFKfm8n4`5h#eXdysF?12x?K@uhesu6Yd%iVo&&rf_b1Q9eB06t#l#epIm6#SklE_Aoy{c=rM2{dIs8y^7%ZzJ}i^7X1><%PbKI z%U@Kmhv6%H_wSdHmgW<0)>kX;kY^XUbUB@+%b@tNn-}WhH2N&#@`(!eGDqAvHeyJ4 zDet3Ze^quFwBIBzpzs`Z$VHV8*XE_(I3z5i4q2Dl=J;B8pkAYy#r57pXZ1aw4C;;U zv-VB&FX1+&`NsmiY_9oUvwux-P5jM@hCoB0A`w3TmS$7 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_copy_grey.png b/app/src/main/res/drawable-xxxhdpi/ic_copy_grey.png deleted file mode 100644 index 08e09c7d5a35f80e33f6e1802ac27993c72783b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1146 zcmV-=1cm#FP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91V4wp41ONa40RR91U;qFB0I4%yP5=M{Nj8pkg2>27+dqi;;n$+;=cEFw+lVEEou4ZYUUCC}?0L1_pv6h>E@kE_dfTv;BH& zx_fqBL!q}*T~qyj)7`UEce}Hhn-#DER=^5ORe^mO13!U2S72vh8?eK$lI;gh_5t=D z_7e6DHrl2DIDk>!gk6Ox{e~3h3xYp|y&3W(L&m14DUE(xu#2!(#An`|eV1ULU>{+l zYpDQkVPq7)#l{Qb0&J8JQUGwxzYS~Y%11hT+Gru90Jwpnp58OuHh&l;g#8Ixo=fm) z#f1>=z_>4rqNM;hHj0t#BsnSw2Y2%B{NJ+s{Ck}}ePF2qDKlVc5If{6U;z2rh4eIl z5E=7>7(l*uAw3NsM8^Ce29U2^NKXR@kug6=%KL!)=>PBOdcrPUN&?_>rxxl7hmZ%K zZP6~ns@4-qEkP823w900M+L34qe$c~tlG1qQUG}6pJ_$)fAXmM?5G3)uK6ruw%n>g zC;@;4{FauTt_z_Ggc1N;Pv}C9*Gm9!J)s9ciQCX+^@In=?`uzv(T5%-1e`BNblpzy z&vq#>1G1B=+;I+J&|6dk=%+k51Ow;?z@vjgFo5L%28Cb%X#fU;U;ya=27zDz8h~&J z2A~57gqEgJOd=T;%nOm zpaBT?Hh^$RwSWeo=@ss60Gg!SghQJFgvzN0GXPz)&>jX5DyJUI05r|K2WWb=@9h~- znUMh)KxGBA(|Zrl^lIPROHgG-24Db{70^!aJwVf|eQz&8l^Gd;0aR8%JH7V+O|SO7 zy##5Ds?31zT8{Qs6iAr?pOt|2)f7kp@Ky_HZ$*I=0Iw17w-R)XeXHyN{AP+*Yboj%m`Xi?4=FiTsg(dQ zm3ji76mzUnOZh%wDPV^)r{*T?c*pUvzsy?66PWy{z7zl^whiMaN}Ym*-_9XsjmB~D z%BT3hauTQ^MD4G!%F$_eAKq&6Zilm)YreefppTmsumV=V3Rr>JAAl%Uy)4)YF#rGn M07*qoM6N<$f|o4Yt^fc4 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_msg.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_msg.png deleted file mode 100644 index 5e9e591cbb6573767530a40ffd729ab5f2855681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1196 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(;}uz(rC1}R)=9Ph`#z#``9;uuoF z_;!x}v`Y>G?bb)8<{#j-d#==HKH>BWC;mm;d(WKVz0&>S@==C;k(?W~0}Kr~mw1Gi zZ+$=Acd~<3=>6#>v;Jg0H)v$wXdn_D;9z=v^RqesX7TlIA%dl$T~m|#b_K5O{X6gM z{k7|#U9GZ;f2Odo&3^9v;4>n-#ina~HT&S{z$SF-!|MuV4~;E80)Mhz+u5wzU$A~7)a__yrVon5DFt@#$u*zrAlb-aB4^!6Fyf)}{wE1Ri36#1i;qRM%Y z^@{rX+^?O??{#}UB$)P}ObpsHcU@gw-ZSQ!87wOvFX+1DyU&vUdqU!MpQma6ChS*c zh>brUq1F_?BlYE}^$QM zm>~S;36qoe3Eq92j0;tsaNO@{*eF!gn(uXBsZfpmqD?>er+<<(Qhm+(l~vu=@cLJY z-Fq%fkG@`1%%tHlv1Q$wzUi)ewiWMrS^QazHQ>TQ6^ShHb#-#*&C{7~tnKX?8JD*T#!)h%NCe=C2Z zE#}7GHfJ)5A5Pbj^f1s)F!|%7GDAdwr;bhN45z@?iW=cy<8wcPT2{tg$UFbO&Sg&d zvt@TmO~seir(F0ySLDvUJ^M0W8GJZ+Mo=NEtnb&)L#2O>?aQj%)mS(f%l17`Tywam zE1FMI{-b!mux3nx_YEi#4`GfxS1>beFj+djXGlD>>OLsaOSkMKudjG--KMj9xr=+~svSm0pB>+}`gnJ@Y0AtbtKF-lIqeKj xe~@&EW;%NA^kzN7oYZT-1Z;@Uo~du{Yh*p z`-eL}{{D6TIGOwYlGFe4mK1kypU0f=r#orl?)eA)YlmdUF<&^6{^PaQuadxi#*D}D z6EFL&WeCfT-Ep}z`@#QJmg4@5HtH*iU3K<-Uj3+eZ5)$?(0y-)!;h*t9QP^G zWtNWhrfUy zT{*M%=g&Plx{eP&Sn_Bywj9|mbU;z`)5Pw;tY_0@EzjRu-{7pJrenu`(YWEm4_oF6 z-{$%UOjB+JobH=b+#k;H!Ifz(GsC_E&+krSl(|^(e)GrYGJLz=obcSv#qc92_RV&V z2fV%IO2_8xe*Ng2KgU*PhPp{{8`erPd=Ou7I{rG>gBfg<>g=<2zR$WjQOuNyVV_9c zruDK6AEq}v=g(&QFir1V?CPDdWhxWG7!FKd#rj){kzqfBjeY22=c-`r)8dISoUc5{?}J89d5;)){qn9fh`B>8FY)K TK8N^h040Ak7{~wrnK3(#apY!X%(#+ckYnT~W2TH1<5>4*+%5ANNvrgySlX7b&NL=I zwMYy?O{->-t1w%vR74XZH?gBnX~&!0H@)~h-{12*zvu0f_dS(_meP;{002$)bU!X; z#GX({aTS)IwiN?p9w)g1O~aT4apO)8Bu9IB0Y+kv0>EG50K{HIEDf;$0L}&hxR~JH zj1Bv58^MPE@ArcBmf=(YkkBQ&yZEJn%b`aTl+D#{cRWyOmx@;ik7ZoP)}d&slfUDn zOc4wIYwN0?@JcDo(={k5E>j05!MK4n%2j!m>Lc|)ek$oU3r}6>VkTJ(9Mc~d{D;4u zs$Vhllt|Vuj_S>qHIH;wlSf_zzlBULfgp%G;J9pJq5X6o2;R!O z%wUq*6rdMtI!9w_a|unqDg~ywX2iJ#TupZ_ZP~i*Ip8Gw@F>2zMBo7oFV|f@w`)ba z2y_Q-l6Qrz=fsza2}UQX1-nivn;wpmtqM?ErO{PC38YH2t0O5X+iCosJUiJyD=(U| zOBC@J=3Iw7fXTDF&8`k9#pUQ7U(=8l1zxr`{ieFij&aH)0(I##S5h9cb7~*fb7K+b z%$a%N0J-MP?3xpInBBNe*@z(9i z6#jrBOgc>Gf%1@|%pt@67~+qbIX_83pNloLJr2D^^IO`X3gqg@ch5#YKi(Qgq?Ovf z5!%>o1m%n)rc3+eO!~iGV)CbwgGE}C4p4DK4D^K;4XqNrVM=oj^4EG&74`W_Zz(Cq zIvKVdrgdKCLI)FA+87lf587K!6Vu~B92A4Jk1;cGMyw4&@0V^!iX*aG`v3wlTW{^ zr(hUbm2}^V{Hvqw*041?VsdB>D@-KMs;o+u(w*Nq5_N1mdZX#_6PO;e=S{Q_&&Zun zVt(%Ys5aK)1aTYahMHR69H}Bfg)dP&nVXqi(8?!tZX24tdA4U$ll^)!$1v=-lAPxK zEif%)DrmQH9ye^r)~vx(YG-%8!nbwm`Mopo>4$QP!aEOiQG;legDDi{>-v#1P)J}! zleCZClcp%lxNOwR=4Q&lF~UmkVQEf6d#gQ+;I@5cg7DNkXv_;ybbfytJTN#6EMGU6 z2004z;D?B%)WA(NgmFDK0M1VZHh=c&#M2{9%D!&vLW zn@(JYJwjIidhvbsZ|E#KCc_D=WZ#nUY=E3m#a)J{ou9_rhjZ{L)m`pN&AnrTWUDOZ s;i|B5K!m~T%b?(oAOiN=2((;N9b6o?`q(w-vG+I0N2u;it`S-P0%pK+M*si- diff --git a/app/src/main/res/drawable-xxxhdpi/ic_select_chatroom.png b/app/src/main/res/drawable-xxxhdpi/ic_select_chatroom.png deleted file mode 100644 index 3f25c3899c92346d0fefb08d1b1ffccc2e7a7d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2097 zcmY*ac{tPy7yiwdnZ`1i$rjm5C|hIS8pc?!ooin&2BU^3TdHaLtVxL*#x|0zBvF)P zyTVgqtf?`Xp?qkPjJ?4f&-XpweZD{5^Pc5Bf1E$gIhoFm)(8P90RR9Hwl+9d9tRx& z4&&L`!UO{zf#O`Pu|UI+^dc|7g?ZWH9UOpDJRc5#(jx)LfrJMs9sq!k3Ih0e3_8eB z!T+lUQThJy4}^8vfsO!hsMr=~?w$zxUg~ge8YkL6b55_=O!a|Es(_En?^H9FV=rKK zwh%0qAPlj*!*^s2EBron!`{$MV-1inn?*X~%m_*+AkS3gUW(V6-7>2+Gf#0>aptEq zdUN(drYWHb;eE37=Fds4ZOfm2;paCuv%haAo?M;hPXw2dl$rk!!^+ISpP4sytPr7_v>K1fck`^gd+Rh{xGL8gYoj>K% zfa#+3t1vP5WrXzoWmDl(!;%|G3CG&Km9a=beyBKf2R`g~NC5k>7HjZMS_` zXh|=~8nD;{58&}%BhS)>V>z*IsMLVGY9!{uV*~8-vH}jVY*j3Xm@F)@X9?@Pgn&qN zAZMk+L$a33P0BpuS5eHdkG>1#N~D=$&u-VMB@D}H5IiGM?VlbV!CCY*x#-vlv=hf(AXl&@~Z zk!^?dOuaxoVI_{#*!$L>AM=wI*yWzdePbr|N)l%AntnU=b7e8--`!H4C;W&RCEonvaEDD_ zY+Q!YS6IUSYU?{A4;u0&fHeZF`{{$sd#edpw!`R6f`*yFxdErtoOo4hd&&^Lf{~W3?DoMt{#G~2 ziVJ5O-S7gdi38mBrsJCJx;{?xIj0M$*%lil{y?_sOAJRm` z6F_JfW{R%-D-6)8Gvp6!)*^r!;YP=AGH;)s%J+iQu%a5>1m!)cbWi4zofCYQf*3VS zJ~?6$=_*o^cH1@bpjxm`mta2W6L=lR+K-a4$HmBY;HrtHIuL3gdrsK&zKBq1@P#o{ zg*LO&UAh$;OaOtKTBII$2iRLKNN+KR%`HT$c_Y;KST8Z!6fcUVIGgv1r`ADf&MvuW zlf*yaGKb`FPa)g z+=;td|G6#}ABE|Qm{Zi@eA7t@^~%spY*~wGZtw4O(>EWLJY@8CgraNx^Gj)ZbeFvo zfTO(q=#xo9t#sSv6_o*Sj?!_5ua9~NC?nWeuj@r=i~fAf2qNWp8N?}a>)BNsooMAY z8(*ic77K-duN&9Ob9~qRoxecOOnTHF1$mgNTYJZDh}7#ibi#rtZ|WAKxk8ap@7@Z! zY0{(iOP-cS4G0o~ zg Date: Thu, 14 May 2020 14:51:34 +0200 Subject: [PATCH 034/100] Update SDK and MEGAchat submodules --- app/src/main/jni/mega/sdk | 2 +- app/src/main/jni/megachat/sdk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/jni/mega/sdk b/app/src/main/jni/mega/sdk index 60b3756ddcf..c0e435d9bc4 160000 --- a/app/src/main/jni/mega/sdk +++ b/app/src/main/jni/mega/sdk @@ -1 +1 @@ -Subproject commit 60b3756ddcf82d323d10275a7e54b55ff88409b0 +Subproject commit c0e435d9bc4a5d3d18e0d0739dd41994b51d58e4 diff --git a/app/src/main/jni/megachat/sdk b/app/src/main/jni/megachat/sdk index 110bd4b53bc..7d650ea5786 160000 --- a/app/src/main/jni/megachat/sdk +++ b/app/src/main/jni/megachat/sdk @@ -1 +1 @@ -Subproject commit 110bd4b53bc990a73878294eb752e97245999a28 +Subproject commit 7d650ea578688d84c73cd9c5aaaa23ba0de6275e From b25ca1e0a1adb167c14f1399dcb4848bc810f7c4 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Thu, 14 May 2020 16:26:21 +0200 Subject: [PATCH 035/100] Task #14987-Use localized string for inactive chat titles: changes applied in MegaChatRoom. --- .../privacy/android/app/MegaApplication.java | 3 ++- .../fcm/ChatAdvancedNotificationBuilder.java | 22 +++++++++---------- .../lollipop/ContactInfoActivityLollipop.java | 9 ++++---- .../app/lollipop/ManagerActivityLollipop.java | 3 ++- .../megachat/ArchivedChatsActivity.java | 3 ++- .../megachat/ChatActivityLollipop.java | 13 ++++++----- .../GroupChatInfoActivityLollipop.java | 16 +++++++------- .../lollipop/megachat/calls/CallService.java | 5 +++-- .../megachat/calls/ChatCallActivity.java | 5 +++-- .../NodeAttachmentHistoryAdapter.java | 5 +++-- .../privacy/android/app/utils/ChatUtil.java | 18 ++++++++++++++- .../app/utils/IncomingCallNotification.java | 3 ++- app/src/main/res/values/strings.xml | 3 +++ 13 files changed, 69 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/MegaApplication.java b/app/src/main/java/mega/privacy/android/app/MegaApplication.java index 93959ed6044..5dc2f188729 100644 --- a/app/src/main/java/mega/privacy/android/app/MegaApplication.java +++ b/app/src/main/java/mega/privacy/android/app/MegaApplication.java @@ -82,6 +82,7 @@ import static mega.privacy.android.app.utils.CacheFolderManager.*; import static mega.privacy.android.app.constants.BroadcastConstants.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.DBUtil.*; import static mega.privacy.android.app.utils.IncomingCallNotification.*; @@ -1379,7 +1380,7 @@ public void launchCallActivity(MegaChatCall call) { startActivity(i); MegaChatRoom chatRoom = megaChatApi.getChatRoom(call.getChatid()); - logDebug("Launch call: " + chatRoom.getTitle()); + logDebug("Launch call: " + getTitleChat(chatRoom)); if (call.getStatus() == MegaChatCall.CALL_STATUS_REQUEST_SENT || call.getStatus() == MegaChatCall.CALL_STATUS_RING_IN) { setCallLayoutStatus(call.getChatid(), true); } diff --git a/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java b/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java index 6bcbb1c6391..3557036616f 100644 --- a/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java +++ b/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java @@ -352,21 +352,21 @@ public Notification buildNotification(Uri uriParameter, String vibration, String if (unreadMessages > 1) { String numberString = "+" + unreadMessages; - title = chat.getTitle() + " (" + numberString + " " + context.getString(R.string.messages_chat_notification) + ")"; + title = getTitleChat(chat) + " (" + numberString + " " + context.getString(R.string.messages_chat_notification) + ")"; } else { - title = chat.getTitle(); + title = getTitleChat(chat); } } else { if (unreadMessages > 1) { String numberString = unreadMessages + ""; - title = chat.getTitle() + " (" + numberString + " " + context.getString(R.string.messages_chat_notification) + ")"; + title = getTitleChat(chat) + " (" + numberString + " " + context.getString(R.string.messages_chat_notification) + ")"; } else { - title = chat.getTitle(); + title = getTitleChat(chat); } } } else { - title = chat.getTitle(); + title = getTitleChat(chat); } title = converterShortCodes(title); @@ -389,7 +389,7 @@ public Notification buildNotification(Uri uriParameter, String vibration, String .setShowWhen(true) .setGroup(groupKey) .setColor(ContextCompat.getColor(context, R.color.mega)); - messagingStyleContentO = new NotificationCompat.MessagingStyle(chat.getTitle()); + messagingStyleContentO = new NotificationCompat.MessagingStyle(getTitleChat(chat)); } else { notificationBuilder = new Notification.Builder(context) .setSmallIcon(R.drawable.ic_stat_notify) @@ -401,7 +401,7 @@ public Notification buildNotification(Uri uriParameter, String vibration, String notificationBuilder.setColor(ContextCompat.getColor(context, R.color.mega)); } - messagingStyleContent = new Notification.MessagingStyle(chat.getTitle()); + messagingStyleContent = new Notification.MessagingStyle(getTitleChat(chat)); } int sizeFor = (int) unreadMessageList.size() - 1; @@ -594,7 +594,7 @@ private Bitmap createDefaultAvatar(MegaChatRoom chat){ color = getColorAvatar(chat.getPeerHandle(0)); } - return getDefaultAvatar(color, chat.getTitle(), AVATAR_SIZE, true, true); + return getDefaultAvatar(color, getTitleChat(chat), AVATAR_SIZE, true, true); } @TargetApi(Build.VERSION_CODES.O) @@ -850,7 +850,7 @@ public void showIncomingCallNotification(MegaChatCall callToAnswer, MegaChatCall .setPriority(NotificationManager.IMPORTANCE_HIGH); if(chatToAnswer.isGroup()){ - notificationBuilderO.setContentTitle(chatToAnswer.getTitle()); + notificationBuilderO.setContentTitle(getTitleChat(chatToAnswer)); } else{ notificationBuilderO.setContentTitle(getFullName(chatToAnswer)); @@ -879,7 +879,7 @@ public void showIncomingCallNotification(MegaChatCall callToAnswer, MegaChatCall .setDeleteIntent(pendingIntentIgnore); if(chatToAnswer.isGroup()){ - notificationBuilder.setContentTitle(chatToAnswer.getTitle()); + notificationBuilder.setContentTitle(getTitleChat(chatToAnswer)); }else{ notificationBuilder.setContentTitle(getFullName(chatToAnswer)); } @@ -1008,7 +1008,7 @@ public void showMissedCallNotification(MegaChatCall call) { MegaChatRoom chat = megaChatApi.getChatRoom(call.getChatid()); String notificationContent; if (chat.isGroup()) { - notificationContent = chat.getTitle(); + notificationContent = getTitleChat(chat); } else { notificationContent = getFullName(chat); } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/ContactInfoActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/ContactInfoActivityLollipop.java index 5485ad9c3f7..d2c31bd1025 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/ContactInfoActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/ContactInfoActivityLollipop.java @@ -113,9 +113,10 @@ import static mega.privacy.android.app.constants.BroadcastConstants.*; import static mega.privacy.android.app.utils.CacheFolderManager.*; import static mega.privacy.android.app.utils.CallUtil.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.LogUtil.*; -import static mega.privacy.android.app.utils.ProgressDialogUtil.getProgressDialog; +import static mega.privacy.android.app.utils.ProgressDialogUtil.*; import static mega.privacy.android.app.utils.TimeUtils.*; import static mega.privacy.android.app.utils.Util.*; import static mega.privacy.android.app.utils.Constants.*; @@ -458,8 +459,8 @@ public void run() { checkNickname(user.getHandle()); } else { String fullName = ""; - if (!isTextEmpty(chat.getTitle())) { - fullName = chat.getTitle(); + if (!isTextEmpty(getTitleChat(chat))) { + fullName = getTitleChat(chat); } else if (userEmailExtra != null) { fullName = userEmailExtra; } @@ -1795,7 +1796,7 @@ public void onClick(DialogInterface dialog, int which) { }; AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); - String message= getResources().getString(R.string.confirmation_clear_chat,chat.getTitle()); + String message= getResources().getString(R.string.confirmation_clear_chat, getTitleChat(chat)); builder.setTitle(R.string.title_confirmation_clear_group_chat); builder.setMessage(message).setPositiveButton(R.string.general_clear, dialogClickListener) .setNegativeButton(R.string.general_cancel, dialogClickListener).show(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java index 35cc06ac201..2489e7c3760 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java @@ -242,6 +242,7 @@ import nz.mega.sdk.MegaUtilsAndroid; import static mega.privacy.android.app.constants.BroadcastConstants.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.PermissionUtils.*; import static mega.privacy.android.app.utils.billing.PaymentUtils.*; import static mega.privacy.android.app.lollipop.FileInfoActivityLollipop.NODE_HANDLE; @@ -13218,7 +13219,7 @@ else if(request.getType() == MegaChatRequest.TYPE_SET_ONLINE_STATUS){ else if(request.getType() == MegaChatRequest.TYPE_ARCHIVE_CHATROOM){ long chatHandle = request.getChatHandle(); MegaChatRoom chat = megaChatApi.getChatRoom(chatHandle); - String chatTitle = chat.getTitle(); + String chatTitle = getTitleChat(chat); if(chatTitle==null){ chatTitle = ""; diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ArchivedChatsActivity.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ArchivedChatsActivity.java index 4a85df97b3b..4ba00cb38c7 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ArchivedChatsActivity.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ArchivedChatsActivity.java @@ -46,6 +46,7 @@ import nz.mega.sdk.MegaRequestListenerInterface; import static mega.privacy.android.app.modalbottomsheet.ModalBottomSheetUtil.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.Util.*; @@ -374,7 +375,7 @@ public void onRequestFinish(MegaChatApiJava api, MegaChatRequest request, MegaCh long chatHandle = request.getChatHandle(); MegaChatRoom chat = megaChatApi.getChatRoom(chatHandle); - String chatTitle = chat.getTitle(); + String chatTitle = getTitleChat(chat); if(chatTitle==null){ chatTitle = ""; diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index cd46736d035..dd00dc2b042 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -1337,9 +1337,9 @@ private void refreshTextInput() { String title; setSizeInputText(true); if (chatRoom.hasCustomTitle()) { - title = getString(R.string.type_message_hint_with_customized_title, chatRoom.getTitle()); + title = getString(R.string.type_message_hint_with_customized_title, getTitleChat(chatRoom)); } else { - title = getString(R.string.type_message_hint_with_default_title, chatRoom.getTitle()); + title = getString(R.string.type_message_hint_with_default_title, getTitleChat(chatRoom)); } textChat.setHint(transformEmojis(title, textChat.getTextSize())); } @@ -1356,7 +1356,7 @@ public void updateNicknameInChat() { private void updateTitle() { initializeInputText(); - titleToolbar.setText(chatRoom.getTitle()); + titleToolbar.setText(getTitleChat(chatRoom)); } private void showChat(String textSnackbar){ @@ -1411,7 +1411,8 @@ public void onClick(DialogInterface dialog, int whichButton) { adapter.notifyDataSetChanged(); } setPreviewersView(); - titleToolbar.setText(chatRoom.getTitle()); + titleToolbar.setText(getTitleChat(chatRoom)); + setChatSubtitle(); if (!chatRoom.isPublic()) { privateIconToolbar.setVisibility(View.VISIBLE); @@ -7155,9 +7156,10 @@ else if(request.getType() == MegaChatRequest.TYPE_LAST_GREEN){ logDebug("TYPE_LAST_GREEN requested"); }else if(request.getType() == MegaChatRequest.TYPE_ARCHIVE_CHATROOM){ + long chatHandle = request.getChatHandle(); chatRoom = megaChatApi.getChatRoom(chatHandle); - String chatTitle = chatRoom.getTitle(); + String chatTitle = getTitleChat(chatRoom); if(chatTitle==null){ chatTitle = ""; @@ -7171,6 +7173,7 @@ else if(!chatTitle.isEmpty() && chatTitle.length()>60){ } if(e.getErrorCode()==MegaChatError.ERROR_OK){ + if(request.getFlag()){ logDebug("Chat archived"); sendBroadcastChatArchived(chatTitle); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/GroupChatInfoActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/GroupChatInfoActivityLollipop.java index a233d3951ec..ab99b18c844 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/GroupChatInfoActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/GroupChatInfoActivityLollipop.java @@ -275,7 +275,7 @@ public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int infoTitleChatText.setMaxWidthEmojis(px2dp(MAX_WIDTH_CHAT_TITLE_LAND, outMetrics)); } - infoTitleChatText.setText(chat.getTitle()); + infoTitleChatText.setText(getTitleChat(chat)); editImageView = findViewById(R.id.chat_group_contact_properties_edit_icon); editImageView.setOnClickListener(this); @@ -855,7 +855,7 @@ public void changePermissions(int newPermissions){ public void createGroupChatAvatar(){ logDebug("createGroupChatAvatar()"); - avatarImageView.setImageBitmap(getDefaultAvatar(getSpecificAvatarColor(AVATAR_GROUP_CHAT_COLOR), chat.getTitle(), AVATAR_SIZE, true)); + avatarImageView.setImageBitmap(getDefaultAvatar(getSpecificAvatarColor(AVATAR_GROUP_CHAT_COLOR), getTitleChat(chat), AVATAR_SIZE, true)); } public void showParticipantsPanel(MegaChatParticipant participant){ @@ -1038,9 +1038,9 @@ public boolean onLongClick(View v) { input.setImeOptions(EditorInfo.IME_ACTION_DONE); input.setInputType(InputType.TYPE_CLASS_TEXT); - int maxAllowed = getMaxAllowed(chat.getTitle()); + int maxAllowed = getMaxAllowed(getTitleChat(chat)); input.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxAllowed)}); - input.setText(chat.getTitle()); + input.setText(getTitleChat(chat)); AlertDialog.Builder builder = new AlertDialog.Builder(this); input.setOnEditorActionListener(new TextView.OnEditorActionListener() { @@ -1210,7 +1210,7 @@ public void onRequestFinish(MegaChatApiJava api, MegaChatRequest request, MegaCh } else if (request.getType() == MegaChatRequest.TYPE_ARCHIVE_CHATROOM) { long chatHandle = request.getChatHandle(); MegaChatRoom chat = megaChatApi.getChatRoom(chatHandle); - String chatTitle = chat.getTitle(); + String chatTitle = getTitleChat(chat); if (chatTitle == null) { chatTitle = ""; @@ -1545,7 +1545,7 @@ else if(item.hasChanged(MegaChatListItem.CHANGE_TYPE_OWN_PRIV)){ } else if(item.hasChanged(MegaChatListItem.CHANGE_TYPE_TITLE)) { logDebug("Change status: CHANGE_TYPE_TITLE"); - infoTitleChatText.setText(chat.getTitle()); + infoTitleChatText.setText(getTitleChat(chat)); createGroupChatAvatar(); } else if(item.hasChanged(MegaChatListItem.CHANGE_TYPE_CLOSED)) { @@ -1729,8 +1729,8 @@ public void createPublicGroupAndGetLink() { peers.addPeer(chat.getPeerHandle(i), chat.getPeerPrivilege(i)); } - CreateGroupChatWithPublicLink listener = new CreateGroupChatWithPublicLink(this, chat.getTitle()); - megaChatApi.createPublicChat(peers, chat.getTitle(), listener); + CreateGroupChatWithPublicLink listener = new CreateGroupChatWithPublicLink(this, getTitleChat(chat)); + megaChatApi.createPublicChat(peers, getTitleChat(chat), listener); } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/CallService.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/CallService.java index 1efa500d1fd..a2f79280ae9 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/CallService.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/CallService.java @@ -35,6 +35,7 @@ import static mega.privacy.android.app.utils.AvatarUtil.*; import static mega.privacy.android.app.utils.CacheFolderManager.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -191,7 +192,7 @@ private void showCallInProgressNotification() { long userHandle; MegaChatRoom chat = megaChatApi.getChatRoom(chatId); if (chat != null) { - title = chat.getTitle(); + title = getTitleChat(chat); if (chat.isGroup()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { @@ -246,7 +247,7 @@ private void showCallInProgressNotification() { long userHandle; MegaChatRoom chat = megaChatApi.getChatRoom(chatId); if (chat != null) { - title = chat.getTitle(); + title = getTitleChat(chat); if (chat.isGroup()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java index 7f733b38d0e..54fa0acf7cb 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java @@ -81,12 +81,13 @@ import static mega.privacy.android.app.utils.AvatarUtil.*; import static mega.privacy.android.app.utils.CacheFolderManager.*; import static mega.privacy.android.app.utils.CallUtil.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.ContactUtil.*; import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.IncomingCallNotification.*; import static mega.privacy.android.app.utils.LogUtil.*; -import static mega.privacy.android.app.utils.TextUtil.isTextEmpty; +import static mega.privacy.android.app.utils.TextUtil.*; import static mega.privacy.android.app.utils.Util.*; import static mega.privacy.android.app.utils.VideoCaptureUtils.*; import static mega.privacy.android.app.constants.BroadcastConstants.*; @@ -277,7 +278,7 @@ private void initialUI(long chatId) { this.startService(intentService); } application.createChatAudioManager(); - titleToolbar.setText(chat.getTitle()); + titleToolbar.setText(getTitleChat(chat)); updateSubTitle(); if (chat.isGroup()) { diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/NodeAttachmentHistoryAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/NodeAttachmentHistoryAdapter.java index 74e9d4fc43c..bffb8755cb0 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/NodeAttachmentHistoryAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/NodeAttachmentHistoryAdapter.java @@ -42,7 +42,8 @@ import nz.mega.sdk.MegaChatMessage; import nz.mega.sdk.MegaNode; -import static mega.privacy.android.app.utils.FileUtils.isVideoFile; +import static mega.privacy.android.app.utils.ChatUtil.*; +import static mega.privacy.android.app.utils.FileUtils.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.ThumbnailUtils.*; import static mega.privacy.android.app.utils.TimeUtils.*; @@ -626,7 +627,7 @@ public void onBindViewHolderList(ViewHolderBrowserList holder,int position) { } } else { - holder.fullNameTitle = ((NodeAttachmentHistoryActivity)context).chatRoom.getTitle(); + holder.fullNameTitle = getTitleChat(((NodeAttachmentHistoryActivity)context).chatRoom); } } diff --git a/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java b/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java index 7bdc58db06c..72f1e123f1b 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java @@ -39,6 +39,7 @@ import nz.mega.sdk.AndroidGfxProcessor; import nz.mega.sdk.MegaChatApi; import nz.mega.sdk.MegaChatApiAndroid; +import nz.mega.sdk.MegaChatListItem; import nz.mega.sdk.MegaChatMessage; import nz.mega.sdk.MegaChatRoom; import nz.mega.sdk.MegaNode; @@ -47,6 +48,7 @@ import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.TextUtil.*; +import static mega.privacy.android.app.utils.TimeUtils.*; public class ChatUtil { @@ -111,7 +113,7 @@ public static void showShareChatLinkDialog (final Context context, MegaChatRoom final AlertDialog shareLinkDialog = builder.create(); TextView nameGroup = (TextView) v.findViewById(R.id.group_name_text); - nameGroup.setText(chat.getTitle()); + nameGroup.setText(getTitleChat(chat)); TextView chatLinkText = (TextView) v.findViewById(R.id.chat_link_text); chatLinkText.setText(chatLink); @@ -485,4 +487,18 @@ public static void setContactLastGreen(Context context, int userStatus, String l contactStateText.isMarqueeIsNecessary(context); } } + + /** + * Method for obtaining the title of a chat. + * + * @param chat The chat room. + * @return String with the title. + */ + public static String getTitleChat(MegaChatRoom chat) { + if (!chat.isActive()) { + return chat.getTitle(); + } + return MegaApplication.getInstance().getString(R.string.inactive_chat_title, formatLongDateTime(chat.getCreationTs())); + } + } diff --git a/app/src/main/java/mega/privacy/android/app/utils/IncomingCallNotification.java b/app/src/main/java/mega/privacy/android/app/utils/IncomingCallNotification.java index f0f1b107cfe..4d467447a0b 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/IncomingCallNotification.java +++ b/app/src/main/java/mega/privacy/android/app/utils/IncomingCallNotification.java @@ -24,6 +24,7 @@ import nz.mega.sdk.MegaChatRoom; import static android.content.Context.NOTIFICATION_SERVICE; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.Util.isAndroid10; @@ -95,7 +96,7 @@ public static void toIncomingCall(Context context, MegaChatCall callToLaunch, Me MegaChatRoom chat = megaChatApi.getChatRoom(callToLaunch.getChatid()); if (chat != null) { - mBuilderCompat.setContentTitle(chat.getTitle()); + mBuilderCompat.setContentTitle(getTitleChat(chat)); } notificationManager.notify(INCOMING_CALL_NOTI_ID, mBuilderCompat.build()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72f18661a19..130a89ae91a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2767,4 +2767,7 @@ Always save to this location? Attach from… + + Chat created on %1$s + From c79da6ebf404e3ce46683f74e9606b9dab019061 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Thu, 14 May 2020 22:42:23 +0200 Subject: [PATCH 036/100] Added the title in MegaChatListItem and in ChatExplorerListItem. --- .../fcm/ChatAdvancedNotificationBuilder.java | 2 +- .../megachat/ChatExplorerListItem.java | 6 ++++-- .../megachat/RecentChatsFragmentLollipop.java | 3 ++- .../MegaListChatLollipopAdapter.java | 6 +++--- .../ChatBottomSheetDialogFragment.java | 8 ++++---- .../privacy/android/app/utils/ChatUtil.java | 20 ++++++++++++++++--- .../privacy/android/app/utils/TimeUtils.java | 4 ++++ 7 files changed, 35 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java b/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java index 3557036616f..4bcd383b873 100644 --- a/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java +++ b/app/src/main/java/mega/privacy/android/app/fcm/ChatAdvancedNotificationBuilder.java @@ -271,7 +271,7 @@ public int compare(MegaChatListItem c1, MegaChatListItem c2) { } CharSequence cs = " "; - String title = chats.get(i).getTitle(); + String title = getTitleChat(chats.get(i)); if (chats.get(i).isGroup()) { long lastMsgSender = message.getUserHandle(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatExplorerListItem.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatExplorerListItem.java index 179b34027b1..e253d792823 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatExplorerListItem.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatExplorerListItem.java @@ -3,6 +3,8 @@ import mega.privacy.android.app.MegaContactAdapter; import nz.mega.sdk.MegaChatListItem; +import static mega.privacy.android.app.utils.ChatUtil.*; + public class ChatExplorerListItem { private MegaContactAdapter contact; @@ -21,14 +23,14 @@ public ChatExplorerListItem (MegaContactAdapter contact) { public ChatExplorerListItem (MegaChatListItem chat) { this.contact = null; this.chat = chat; - this.title = chat.getTitle(); + this.title = getTitleChat(chat); this.id = String.valueOf(chat.getChatId()); } public ChatExplorerListItem (MegaChatListItem chat, MegaContactAdapter contact) { this.contact = contact; this.chat = chat; - this.title = chat.getTitle(); + this.title = getTitleChat(chat); this.id = String.valueOf(chat.getChatId()); } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/RecentChatsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/RecentChatsFragmentLollipop.java index 9975e2f0f2c..1f13f5ea5ab 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/RecentChatsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/RecentChatsFragmentLollipop.java @@ -74,6 +74,7 @@ import static android.app.Activity.RESULT_OK; import static mega.privacy.android.app.lollipop.AddContactActivityLollipop.FROM_RECENT; import static mega.privacy.android.app.utils.CallUtil.*; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.ContactUtil.*; import static mega.privacy.android.app.utils.LogUtil.*; @@ -1969,7 +1970,7 @@ protected Void doInBackground(String... strings) { filteredChats.clear(); } for (MegaChatListItem chat : chatsToSearch) { - if (chat.getTitle().toLowerCase().contains(strings[0].toLowerCase())) { + if (getTitleChat(chat).toLowerCase().contains(strings[0].toLowerCase())) { filteredChats.add(chat); } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaListChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaListChatLollipopAdapter.java index eed99f2d7e2..4d62581abbc 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaListChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaListChatLollipopAdapter.java @@ -260,7 +260,7 @@ public void onBindViewHolder(ViewHolderChatList holder, int position) { if (!multipleSelect) { //Multiselect OFF holder.itemLayout.setBackgroundColor(Color.WHITE); - createGroupChatAvatar(holder, chat.getTitle()); + createGroupChatAvatar(holder, getTitleChat(chat)); } else { logDebug("Multiselect ON"); @@ -272,7 +272,7 @@ public void onBindViewHolder(ViewHolderChatList holder, int position) { else{ logDebug("NOT selected"); holder.itemLayout.setBackgroundColor(Color.WHITE); - createGroupChatAvatar(holder, chat.getTitle()); + createGroupChatAvatar(holder, getTitleChat(chat)); } } } @@ -973,7 +973,7 @@ public void setTitle(int position, ViewHolderChatList holder) { if(holder!=null){ MegaChatListItem chat = chats.get(position); - String title = chat.getTitle(); + String title = getTitleChat(chat); if(title!=null){ logDebug("ChatRoom id: "+chat.getChatId()); diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ChatBottomSheetDialogFragment.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ChatBottomSheetDialogFragment.java index 48f633953c4..2947ed0e255 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ChatBottomSheetDialogFragment.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ChatBottomSheetDialogFragment.java @@ -28,7 +28,7 @@ import nz.mega.sdk.MegaChatRoom; import nz.mega.sdk.MegaUser; -import static mega.privacy.android.app.utils.ChatUtil.setContactStatus; +import static mega.privacy.android.app.utils.ChatUtil.*; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.utils.LogUtil.*; import static mega.privacy.android.app.utils.TextUtil.*; @@ -112,7 +112,7 @@ public void setupDialog(final Dialog dialog, int style) { LinearLayout separatorInfo = contentView.findViewById(R.id.separator_info); - titleNameContactChatPanel.setText(chat.getTitle()); + titleNameContactChatPanel.setText(getTitleChat(chat)); if (chat.isPreview()) { titleMailContactChatPanel.setText(getString(R.string.group_chat_label)); @@ -235,8 +235,8 @@ private void addAvatarChatPanel(String contactMail, MegaChatListItem chat) { int color; String name = null; - if (!isTextEmpty(chat.getTitle())) { - name = chat.getTitle(); + if (!isTextEmpty(getTitleChat(chat))) { + name = getTitleChat(chat); } else if (!isTextEmpty(contactMail)) { name = contactMail; } diff --git a/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java b/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java index 72f1e123f1b..f2bcd29d86d 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/ChatUtil.java @@ -489,16 +489,30 @@ public static void setContactLastGreen(Context context, int userStatus, String l } /** - * Method for obtaining the title of a chat. + * Method for obtaining the title of a MegaChatRoom. * * @param chat The chat room. * @return String with the title. */ public static String getTitleChat(MegaChatRoom chat) { - if (!chat.isActive()) { + if (chat.isActive()) { return chat.getTitle(); } - return MegaApplication.getInstance().getString(R.string.inactive_chat_title, formatLongDateTime(chat.getCreationTs())); + return MegaApplication.getInstance().getString(R.string.inactive_chat_title, formatDate(MegaApplication.getInstance().getBaseContext(), chat.getCreationTs(), DATE_YYYY_MM_DD_FORMAT)); + } + + /** + * Method for obtaining the title of a MegaChatListItem. + * + * @param chat The chat room. + * @return String with the title. + */ + public static String getTitleChat(MegaChatListItem chat) { + if (chat.isActive()) { + return chat.getTitle(); + } + + return getTitleChat(MegaApplication.getInstance().getMegaChatApi().getChatRoom(chat.getChatId())); } } diff --git a/app/src/main/java/mega/privacy/android/app/utils/TimeUtils.java b/app/src/main/java/mega/privacy/android/app/utils/TimeUtils.java index 9ade043e200..77aa77f5b4b 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/TimeUtils.java +++ b/app/src/main/java/mega/privacy/android/app/utils/TimeUtils.java @@ -25,6 +25,7 @@ public class TimeUtils implements Comparator { public static final int DATE_SHORT_FORMAT = 1; public static final int DATE_SHORT_SHORT_FORMAT = 2; public static final int DATE_MM_DD_YYYY_FORMAT = 3; + public static final int DATE_YYYY_MM_DD_FORMAT = 4; int type; @@ -145,6 +146,9 @@ public static String formatDate(Context context, long timestamp, int format){ case DATE_MM_DD_YYYY_FORMAT: df = new SimpleDateFormat("MMM d, YYYY"); break; + case DATE_YYYY_MM_DD_FORMAT: + df = new SimpleDateFormat("YYYY-MM-d HH:mm"); + break; default: df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.SHORT, Locale.getDefault()); break; From c8574e6bb9b7661481c573eb7c90f48cdb14d8e7 Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Fri, 15 May 2020 14:02:22 +0200 Subject: [PATCH 037/100] Bug #15721 - Several problems related to the Audio Manager in calls in progress. --- .../privacy/android/app/MegaApplication.java | 83 ++++++++++++++++- .../app/constants/BroadcastConstants.java | 3 +- .../megachat/calls/ChatAudioManager.java | 1 - .../megachat/calls/ChatCallActivity.java | 88 ++++++++----------- 4 files changed, 118 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/MegaApplication.java b/app/src/main/java/mega/privacy/android/app/MegaApplication.java index 93959ed6044..494126e7a61 100644 --- a/app/src/main/java/mega/privacy/android/app/MegaApplication.java +++ b/app/src/main/java/mega/privacy/android/app/MegaApplication.java @@ -49,6 +49,7 @@ import mega.privacy.android.app.fcm.KeepAliveService; import mega.privacy.android.app.lollipop.LoginActivityLollipop; import mega.privacy.android.app.lollipop.ManagerActivityLollipop; +import mega.privacy.android.app.lollipop.megachat.AppRTCAudioManager; import mega.privacy.android.app.lollipop.MyAccountInfo; import mega.privacy.android.app.lollipop.controllers.AccountController; import mega.privacy.android.app.lollipop.megachat.BadgeIntentService; @@ -157,7 +158,9 @@ public class MegaApplication extends MultiDexApplication implements MegaChatRequ private NetworkStateReceiver networkStateReceiver; private BroadcastReceiver logoutReceiver; private ChatAudioManager chatAudioManager = null; - private static MegaApplication singleApplicationInstance; + private AppRTCAudioManager rtcAudioManager = null; + + private static MegaApplication singleApplicationInstance; private PowerManager.WakeLock wakeLock; @@ -441,7 +444,8 @@ public void onReceive(Context context, Intent intent) { if (listAllCalls == null || listAllCalls.size() == 0) return; - if (callStatus == MegaChatCall.CALL_STATUS_RING_IN) { + if (callStatus == MegaChatCall.CALL_STATUS_RING_IN || callStatus == MegaChatCall.CALL_STATUS_REQUEST_SENT) { + createChatAudioManager(); setAudioManagerValues(callStatus); } @@ -1289,6 +1293,7 @@ private void checkSeveralCall(MegaHandleList listAllCalls, int callStatus) { private void removeValues(long chatId) { removeStatusVideoAndSpeaker(chatId); removeChatAudioManager(); + removeRTCAudioManager(); } private void checkCallDestroyed(long chatId) { @@ -1332,26 +1337,98 @@ private void removeStatusVideoAndSpeaker(long chatId){ hashMapVideo.remove(chatId); } + /** + * Create or update the AppRTCAudioManager for the in progress call. + * + * @param isSpeakerOn the speaker status. + */ + public void createRTCAudioManager(boolean isSpeakerOn) { + if (rtcAudioManager != null) { + logDebug("Updating RTC Audio Manager values..."); + rtcAudioManager.updateSpeakerStatus(isSpeakerOn); + return; + } + + logDebug("Creating RTC Audio Manager..."); + rtcAudioManager = AppRTCAudioManager.create(this, isSpeakerOn); + startProximitySensor(); + rtcAudioManager.setOnProximitySensorListener(isNear -> { + Intent intent = new Intent(BROADCAST_ACTION_INTENT_PROXIMITY_SENSOR); + intent.putExtra(UPDATE_PROXIMITY_SENSOR_STATUS, isNear); + LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); + }); + } + + /** + * Remove the AppRTCAudioManager. + */ + public void removeRTCAudioManager() { + if (rtcAudioManager == null) + return; + + try { + logDebug("Removing RTC Audio Manager..."); + unregisterProximitySensor(); + rtcAudioManager.stop(); + rtcAudioManager = null; + } catch (Exception e) { + logError("Exception stopping speaker audio manager", e); + } + } + + /** + * Activate the proximity sensor. + */ + public void startProximitySensor() { + if (rtcAudioManager != null) { + logDebug("Starting proximity sensor..."); + rtcAudioManager.startProximitySensor(); + } + } + + /** + * Deactivates the proximity sensor + */ + public void unregisterProximitySensor() { + if (rtcAudioManager != null) { + logDebug("Stopping proximity sensor..."); + rtcAudioManager.unregisterProximitySensor(); + } + } + + /** + * Create the ChatAudioManager for the incoming and outgoing call. + */ public void createChatAudioManager() { if (chatAudioManager != null) { return; } + logDebug("Creating Chat Audio Manager..."); chatAudioManager = ChatAudioManager.create(getApplicationContext()); } + /** + * Remove the ChatAudioManager. + */ public void removeChatAudioManager() { if (chatAudioManager == null) { return; } + logDebug("Removing Chat Audio Manager..."); chatAudioManager.stopAudioSignals(); chatAudioManager = null; } + /** + * Update the values of the ChatAudioManager depending on the call status. + * + * @param callStatus The current call status. + */ public void setAudioManagerValues(int callStatus){ - createChatAudioManager(); if(chatAudioManager != null) { + logDebug("Updating values of Chat Audio Manager..."); MegaHandleList listCallsRequest = megaChatApi.getChatCalls(MegaChatCall.CALL_STATUS_REQUEST_SENT); MegaHandleList listCallsRing = megaChatApi.getChatCalls(MegaChatCall.CALL_STATUS_RING_IN); chatAudioManager.setAudioManagerValues(callStatus, listCallsRequest, listCallsRing); diff --git a/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java b/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java index 9ed6348337f..eb22ec0a776 100644 --- a/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java +++ b/app/src/main/java/mega/privacy/android/app/constants/BroadcastConstants.java @@ -12,6 +12,7 @@ public class BroadcastConstants { public static final String BROADCAST_ACTION_INTENT_CALL_UPDATE = "INTENT_CALL_UPDATE"; public static final String BROADCAST_ACTION_INTENT_SESSION_UPDATE = "INTENT_SESSION_UPDATE"; public static final String BROADCAST_ACTION_INTENT_CU_ATTR_CHANGE = "INTENT_CU_ATTR_CHANGE"; + public static final String BROADCAST_ACTION_INTENT_PROXIMITY_SENSOR = "INTENT_PROXIMITY_SENSOR"; // Broadcasts' actions public static final String ACTION_ON_ACCOUNT_UPDATE = "ACTION_ON_ACCOUNT_UPDATE"; @@ -25,7 +26,6 @@ public class BroadcastConstants { public static final String ACTION_CHANGE_NETWORK_QUALITY = "ACTION_CHANGE_NETWORK_QUALITY"; public static final String ACTION_UPDATE_CALL = "ACTION_UPDATE_CALL"; - // Broadcasts' extras public static final String EVENT_TEXT = "EVENT_TEXT"; public static final String EVENT_NUMBER = "EVENT_NUMBER"; @@ -44,4 +44,5 @@ public class BroadcastConstants { public static final String UPDATE_SESSION_STATUS = "UPDATE_SESSION_STATUS"; public static final String UPDATE_SESSION_TERM_CODE = "UPDATE_SESSION_TERM_CODE"; public static final String EXTRA_IS_CU_SECONDARY_FOLDER = "EXTRA_IS_CU_SECONDARY_FOLDER"; + public static final String UPDATE_PROXIMITY_SENSOR_STATUS= "UPDATE_PROXIMITY_SENSOR_STATUS"; } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatAudioManager.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatAudioManager.java index 0c78eec8c1e..d733aad931b 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatAudioManager.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatAudioManager.java @@ -150,7 +150,6 @@ private void startVibration() { public void stopAudioSignals() { if (audioManager != null) { - audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); audioManager = null; } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java index 7f733b38d0e..7d061478c2f 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/calls/ChatCallActivity.java @@ -57,11 +57,9 @@ import mega.privacy.android.app.components.RoundedImageView; import mega.privacy.android.app.components.twemoji.EmojiTextView; import mega.privacy.android.app.fcm.IncomingCallService; -import mega.privacy.android.app.interfaces.OnProximitySensorListener; import mega.privacy.android.app.listeners.ChatChangeVideoStreamListener; import mega.privacy.android.app.lollipop.LoginActivityLollipop; import mega.privacy.android.app.lollipop.listeners.CallNonContactNameListener; -import mega.privacy.android.app.lollipop.megachat.AppRTCAudioManager; import mega.privacy.android.app.lollipop.megachat.chatAdapters.GroupCallAdapter; import nz.mega.sdk.MegaApiAndroid; import nz.mega.sdk.MegaApiJava; @@ -167,7 +165,6 @@ public class ChatCallActivity extends BaseActivity implements MegaChatRequestLis private ImageView avatarBigCameraGroupCallMicro; private RoundedImageView avatarBigCameraGroupCallImage; private EmojiTextView avatarBigCameraGroupCallInitialLetter; - private AppRTCAudioManager rtcAudioManager = null; private Animation shake; private LinearLayout linearFAB; private RelativeLayout relativeCall; @@ -276,7 +273,7 @@ private void initialUI(long chatId) { } else { this.startService(intentService); } - application.createChatAudioManager(); + titleToolbar.setText(chat.getTitle()); updateSubTitle(); @@ -474,6 +471,26 @@ public void onReceive(Context context, Intent intent) { } }; + private BroadcastReceiver proximitySensorReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) + return; + + boolean isNear = intent.getBooleanExtra(UPDATE_PROXIMITY_SENSOR_STATUS, false); + boolean realStatus = MegaApplication.getVideoStatus(chatId); + if (!realStatus) { + inTemporaryState = false; + } else if (isNear) { + inTemporaryState = true; + megaChatApi.disableVideo(chatId, ChatCallActivity.this); + } else { + inTemporaryState = false; + megaChatApi.enableVideo(chatId, ChatCallActivity.this); + } + } + }; + @Override protected void onCreate(Bundle savedInstanceState) { logDebug("onCreate"); @@ -732,6 +749,9 @@ protected void onCreate(Bundle savedInstanceState) { filterSession.addAction(ACTION_CHANGE_AUDIO_LEVEL); filterSession.addAction(ACTION_CHANGE_NETWORK_QUALITY); LocalBroadcastManager.getInstance(this).registerReceiver(chatSessionUpdateReceiver, filterSession); + + IntentFilter filterProximitySensor = new IntentFilter(BROADCAST_ACTION_INTENT_PROXIMITY_SENSOR); + LocalBroadcastManager.getInstance(this).registerReceiver(proximitySensorReceiver, filterProximitySensor); } private void setAvatarLayout() { @@ -970,9 +990,7 @@ private void restoreHeightAndWidth() { @Override public void onPause() { super.onPause(); - if(rtcAudioManager!=null){ - rtcAudioManager.unregisterProximitySensor(); - } + application.unregisterProximitySensor(); } @Override @@ -981,10 +999,8 @@ protected void onResume() { super.onResume(); stopService(new Intent(this, IncomingCallService.class)); restoreHeightAndWidth(); - if (rtcAudioManager != null) { - rtcAudioManager.startProximitySensor(); - } - application.createChatAudioManager(); + application.startProximitySensor(); + this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); @@ -1011,9 +1027,7 @@ private void destroyAdapters() { @Override public void onDestroy() { - if(rtcAudioManager!=null){ - rtcAudioManager.unregisterProximitySensor(); - } + application.unregisterProximitySensor(); clearHandlers(); activateChrono(false, callInProgressChrono, callChat); restoreHeightAndWidth(); @@ -1036,6 +1050,7 @@ public void onDestroy() { LocalBroadcastManager.getInstance(this).unregisterReceiver(chatCallUpdateReceiver); LocalBroadcastManager.getInstance(this).unregisterReceiver(chatSessionUpdateReceiver); + LocalBroadcastManager.getInstance(this).unregisterReceiver(proximitySensorReceiver); super.onDestroy(); } @@ -1157,18 +1172,6 @@ private void updateInfoUsersBar(String text) { infoUsersBar.animate().alpha(0).setDuration(INFO_ANIMATION); } - private void stopSpeakerAudioManger() { - if (rtcAudioManager == null) return; - logDebug("stopSpeakerAudioManger"); - - try { - rtcAudioManager.stop(); - rtcAudioManager = null; - } catch (Exception e) { - logError("Exception stopping speaker audio manager", e); - } - } - private void sendSignalPresence() { if (getCall() == null) return; if (callChat.getStatus() != MegaChatCall.CALL_STATUS_IN_PROGRESS && callChat.getStatus() != MegaChatCall.CALL_STATUS_REQUEST_SENT) @@ -1794,31 +1797,14 @@ private void updateChangesVideo(int position) { updateUI(); } - private void createAppRTCAudioManager(boolean isSpeakerOn){ - rtcAudioManager = AppRTCAudioManager.create(this, isSpeakerOn); - rtcAudioManager.setOnProximitySensorListener(isNear -> { - boolean realStatus = application.getVideoStatus(callChat.getChatid()); - if(!realStatus){ - inTemporaryState = false; - }else if(isNear){ - inTemporaryState = true; - megaChatApi.disableVideo(chatId, ChatCallActivity.this); - }else{ - inTemporaryState = false; - megaChatApi.enableVideo(chatId, ChatCallActivity.this); - } - - }); - } - + /** + * Method for updating speaker status, ON or OFF. + */ private void updateLocalSpeakerStatus() { if (getCall() == null || !statusCallInProgress(callChat.getStatus())) return; boolean isSpeakerOn = application.getSpeakerStatus(callChat.getChatid()); - if(rtcAudioManager == null){ - createAppRTCAudioManager(isSpeakerOn); - }else{ - rtcAudioManager.updateSpeakerStatus(isSpeakerOn); - } + application.createRTCAudioManager(isSpeakerOn); + application.setAudioManagerValues(callChat.getStatus()); if (isSpeakerOn) { speakerFAB.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.accentColor))); @@ -1827,11 +1813,8 @@ private void updateLocalSpeakerStatus() { speakerFAB.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.disable_fab_chat_call))); speakerFAB.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_speaker_off)); } - - application.setAudioManagerValues(callChat.getStatus()); } - private void optionsRemoteCameraFragmentFS(boolean isNecessaryCreate) { if (isNecessaryCreate) { isRemoteVideo = REMOTE_VIDEO_ENABLED; @@ -2489,7 +2472,8 @@ private void checkHangCall(long callId){ */ private void checkTerminatingCall() { clearHandlers(); - stopSpeakerAudioManger(); + application.removeChatAudioManager(); + application.removeRTCAudioManager(); MegaApplication.setSpeakerStatus(chatId, false); finishActivity(); } From 1e9d2e3f46f3a657a605f1422212d40478e7012c Mon Sep 17 00:00:00 2001 From: aw Date: Sat, 16 May 2020 11:30:49 +1200 Subject: [PATCH 038/100] 1. reminder when move CU folders to rubbish bin. 2. disable CU or MU when the target folder is removed on the exact device. 3. check the availability of the local folder. --- .../app/jobservices/CameraUploadsService.java | 49 ++++++++++++++++++- .../lollipop/FileInfoActivityLollipop.java | 4 +- .../app/lollipop/ManagerActivityLollipop.java | 43 +++++++++------- .../SettingsFragmentLollipop.java | 7 +-- app/src/main/res/values/strings.xml | 3 ++ 5 files changed, 81 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 7f9a7ec4987..65d7143f61b 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -20,10 +20,12 @@ import android.os.PowerManager; import android.os.StatFs; import android.provider.MediaStore; + import androidx.annotation.Nullable; -import androidx.exifinterface.media.ExifInterface; import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; +import androidx.documentfile.provider.DocumentFile; +import androidx.exifinterface.media.ExifInterface; import java.io.File; import java.io.IOException; @@ -952,6 +954,22 @@ private int shouldRun() { return SHOULD_RUN_STATE_FAILED; } + if (!checkPrimaryLocalFolder()) { + mNotification = createNotification(getString(R.string.section_photo_sync), getString(R.string.camera_notif_primary_local_unavailable), null, false); + mNotificationManager.notify(1909, mNotification); + return SHOULD_RUN_STATE_FAILED; + } else { + mNotificationManager.cancel(1909); + } + + if(!checkSecondaryLocalFolder()) { + mNotification = createNotification(getString(R.string.section_photo_sync), getString(R.string.camera_notif_secondary_local_unavailable), null, false); + mNotificationManager.notify(1909, mNotification); + return SHOULD_RUN_STATE_FAILED; + } else { + mNotificationManager.cancel(1909); + } + if (!localPath.endsWith(SEPARATOR)) { localPath += SEPARATOR; } @@ -998,6 +1016,35 @@ private int shouldRun() { return secondaryFolderResult; } + private boolean checkPrimaryLocalFolder() { + // check primary local folder + if (Boolean.parseBoolean(prefs.getCameraFolderExternalSDCard())) { + Uri uri = Uri.parse(prefs.getUriExternalSDCard()); + DocumentFile file = DocumentFile.fromTreeUri(this, uri); + if (file == null) { + logError("Local folder on sd card is unavailabe."); + return false; + } + return file.exists(); + } else { + return new File(localPath).exists(); + } + } + + private boolean checkSecondaryLocalFolder() { + // check secondary local folder if media upload is enabled + if (Boolean.parseBoolean(prefs.getSecondaryMediaFolderEnabled())) { + String path = prefs.getLocalPathSecondaryFolder(); + if(path == null) { + return false; + } else { + return new File(path).exists(); + } + } + // if not enable secondary + return true; + } + private int checkPrimaryFolder() { if (isNodeInRubbishOrDeleted(cameraUploadHandle)) { cameraUploadHandle = findDefaultFolder(getString(R.string.section_photo_sync)); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java index 2e402cd28e8..fb002902f12 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/FileInfoActivityLollipop.java @@ -1944,9 +1944,9 @@ public void onClick(DialogInterface dialog, int which) { if (moveToRubbish){ AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); int stringMessageID; - if (getPrimaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + if (getPrimaryFolderHandle() == handle) { stringMessageID = R.string.confirmation_move_cu_folder_to_rubbish; - } else if (getSecondaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + } else if (getSecondaryFolderHandle() == handle) { stringMessageID = R.string.confirmation_move_mu_folder_to_rubbish; } else { stringMessageID = R.string.confirmation_move_to_rubbish; diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java index 6d0d3e41d08..e00047a81ac 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/ManagerActivityLollipop.java @@ -7452,14 +7452,12 @@ public void refreshAfterMovingToRubbish(){ refreshSearch(); } - checkCameraUploadFolder(); + checkCameraUploadFolder(true); refreshRubbishBin(); setToolbarTitle(); } - private void checkCameraUploadFolder() { - if (!CameraUploadsService.uploadingInProgress) return; - + private void checkCameraUploadFolder(boolean shouldDisable) { long primaryHandle = getPrimaryFolderHandle(); long secondaryHandle = getSecondaryFolderHandle(); MegaPreferences prefs = dbH.getPreferences(); @@ -7472,19 +7470,26 @@ private void checkCameraUploadFolder() { if (isSecondaryFolderInRubbish && !isPrimaryFolderInRubbish) { logDebug("MU folder is deleted, backup settings and disable MU."); - backupTimestampsAndFolderHandle(); - disableMediaUploadProcess(); - if (getSettingsFragment() != null) { - sttFLol.disableMediaUploadUIProcess(); - - } + if (shouldDisable) { + backupTimestampsAndFolderHandle(); + disableMediaUploadProcess(); + if (getSettingsFragment() != null) { + sttFLol.disableMediaUploadUIProcess(); + } + } else { + stopRunningCameraUploadService(app); + } } else if (isPrimaryFolderInRubbish) { - logDebug("CU folder is deleted, backup settings and disable CU."); - backupTimestampsAndFolderHandle(); - disableCameraUploadSettingProcess(false); - if (getSettingsFragment() != null) { - sttFLol.disableCameraUploadUIProcess(); - } + logDebug("CU folder is deleted, backup settings and disable CU."); + if (shouldDisable) { + backupTimestampsAndFolderHandle(); + disableCameraUploadSettingProcess(false); + if (getSettingsFragment() != null) { + sttFLol.disableCameraUploadUIProcess(); + } + } else { + stopRunningCameraUploadService(app); + } } } @@ -8352,9 +8357,9 @@ public void onClick(DialogInterface dialog, int which) { setMoveToRubbish(true); AlertDialog.Builder builder = new AlertDialog.Builder(this); - if (getPrimaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + if (getPrimaryFolderHandle() == handle ) { builder.setMessage(getResources().getString(R.string.confirmation_move_cu_folder_to_rubbish)); - } else if (getSecondaryFolderHandle() == handle && CameraUploadsService.isServiceRunning) { + } else if (getSecondaryFolderHandle() == handle ) { builder.setMessage(R.string.confirmation_move_mu_folder_to_rubbish); } else { builder.setMessage(getResources().getString(R.string.confirmation_move_to_rubbish)); @@ -14754,7 +14759,7 @@ public void onNodesUpdate(MegaApiJava api, ArrayList updatedNodes) { onNodesInboxUpdate(); - checkCameraUploadFolder(); + checkCameraUploadFolder(false); cuFL = (CameraUploadFragmentLollipop) getSupportFragmentManager().findFragmentByTag(FragmentTag.CAMERA_UPLOADS.getTag()); if (cuFL != null){ diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index 85c07854f18..01b76ee2467 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -2456,9 +2456,10 @@ public void disableCameraUpload(){ */ public void disableMediaUploadUIProcess() { logDebug("changes to sec folder only"); - secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_on)); - cameraUploadCategory.removePreference(localSecondaryFolder); - cameraUploadCategory.removePreference(megaSecondaryFolder); + secondaryUpload = false; + secondaryMediaFolderOn.setTitle(getString(R.string.settings_secondary_upload_on)); + cameraUploadCategory.removePreference(localSecondaryFolder); + cameraUploadCategory.removePreference(megaSecondaryFolder); } /** * Disable CameraUpload UI related process diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72f18661a19..e43f95a5f46 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -692,6 +692,9 @@ Uploading files of media folders Checking for files to be uploaded Initializing Camera Uploads + Camera upload local folder is unavailable + Media upload local folder is unavailable + From e1eea91e9b17cff244aaef396ecf3071b64e1ad3 Mon Sep 17 00:00:00 2001 From: aw Date: Sat, 16 May 2020 11:59:34 +1200 Subject: [PATCH 039/100] 1. extract constant for notification id. 2. refactor --- .../app/jobservices/CameraUploadsService.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 65d7143f61b..2f4dca5b80a 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -20,6 +20,7 @@ import android.os.PowerManager; import android.os.StatFs; import android.provider.MediaStore; +import android.service.notification.StatusBarNotification; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; @@ -87,6 +88,7 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeReceiver.OnNetworkTypeChangeCallback, MegaChatRequestListenerInterface, MegaRequestListenerInterface, MegaTransferListenerInterface, VideoCompressionCallback { + public static final int LOCAL_FOLDER_REMINDER_NOTI_ID = 1909; private static final String OVER_QUOTA_NOTIFICATION_CHANNEL_ID = "overquotanotification"; private static final String ERROR_NOT_ENOUGH_SPACE = "ERROR_NOT_ENOUGH_SPACE"; private static final String ERROR_CREATE_FILE_IO_ERROR = "ERROR_CREATE_FILE_IO_ERROR"; @@ -955,19 +957,17 @@ private int shouldRun() { } if (!checkPrimaryLocalFolder()) { - mNotification = createNotification(getString(R.string.section_photo_sync), getString(R.string.camera_notif_primary_local_unavailable), null, false); - mNotificationManager.notify(1909, mNotification); + localFolderUnavailableNotification(R.string.camera_notif_primary_local_unavailable); return SHOULD_RUN_STATE_FAILED; } else { - mNotificationManager.cancel(1909); + mNotificationManager.cancel(LOCAL_FOLDER_REMINDER_NOTI_ID); } if(!checkSecondaryLocalFolder()) { - mNotification = createNotification(getString(R.string.section_photo_sync), getString(R.string.camera_notif_secondary_local_unavailable), null, false); - mNotificationManager.notify(1909, mNotification); + localFolderUnavailableNotification(R.string.camera_notif_secondary_local_unavailable); return SHOULD_RUN_STATE_FAILED; } else { - mNotificationManager.cancel(1909); + mNotificationManager.cancel(LOCAL_FOLDER_REMINDER_NOTI_ID); } if (!localPath.endsWith(SEPARATOR)) { @@ -1016,6 +1016,21 @@ private int shouldRun() { return secondaryFolderResult; } + private void localFolderUnavailableNotification(int resId) { + boolean isShowing = false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + for(StatusBarNotification notification : mNotificationManager.getActiveNotifications()) { + if(notification.getId() == LOCAL_FOLDER_REMINDER_NOTI_ID) { + isShowing = true; + } + } + } + if(!isShowing) { + mNotification = createNotification(getString(R.string.section_photo_sync), getString(resId), null, false); + mNotificationManager.notify(LOCAL_FOLDER_REMINDER_NOTI_ID, mNotification); + } + } + private boolean checkPrimaryLocalFolder() { // check primary local folder if (Boolean.parseBoolean(prefs.getCameraFolderExternalSDCard())) { From 7dc7f2fbdef5dca4232f8d734fd7b90a8ce7135a Mon Sep 17 00:00:00 2001 From: raquelgc6 Date: Mon, 18 May 2020 16:34:33 +0200 Subject: [PATCH 040/100] Code improvements --- .../megachat/ChatActivityLollipop.java | 34 +++++++++--------- .../chatAdapters/MegaChatLollipopAdapter.java | 23 +++--------- ...ctAttachmentBottomSheetDialogFragment.java | 3 -- .../GeneralChatMessageBottomSheet.java | 11 +++++- .../bottom_sheet_contact_attachment_item.xml | 36 ++----------------- .../bottom_sheet_general_chat_messages.xml | 2 +- .../bottom_sheet_node_attachment_item.xml | 6 ++-- app/src/main/res/values/strings.xml | 2 ++ 8 files changed, 40 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java index ba6b0625816..669d7de5ea5 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/ChatActivityLollipop.java @@ -1219,7 +1219,7 @@ public void initAfterIntent(Intent newIntent, Bundle savedInstanceState){ mOutputFilePath = savedInstanceState.getString("mOutputFilePath"); isShareLinkDialogDismissed = savedInstanceState.getBoolean("isShareLinkDialogDismissed", false); isLocationDialogShown = savedInstanceState.getBoolean("isLocationDialogShown", false); - recoveredSelectedPositions = (ArrayList) savedInstanceState.getSerializable(SELECTED_ITEMS); + recoveredSelectedPositions = savedInstanceState.getIntegerArrayList(SELECTED_ITEMS); if(visibilityMessageJump){ if(typeMessageJump == TYPE_MESSAGE_NEW_MESSAGE){ @@ -3755,6 +3755,19 @@ public String copyMessage(AndroidMegaChatMessage message) { return chatC.createSingleManagementString(message, chatRoom); } + /** + * Method for copying a text to the clipboard. + * + * @param text The text. + */ + public void copyToClipboard(String text) { + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); + clipboard.setPrimaryClip(clip); + showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); + } + + public void editMessage(ArrayList messagesSelected) { if (messagesSelected.isEmpty() || messagesSelected.get(0) == null) return; @@ -3768,7 +3781,6 @@ public void editMessage(ArrayList messagesSelected) { if (msg.getType() == MegaChatMessage.TYPE_CONTAINS_META && meta != null && meta.getType() == MegaChatContainsMeta.CONTAINS_META_GEOLOCATION) { sendLocation(); finishMultiselectionMode(); - actionMode.invalidate(); } else { textChat.setText(messageToEdit.getContent()); textChat.setSelection(textChat.getText().length()); @@ -3829,10 +3841,7 @@ public void activateActionMode(){ } private void reDoTheSelectionAfterRotation() { - if (recoveredSelectedPositions == null) - return; - - if (adapter == null) + if (recoveredSelectedPositions == null || adapter == null) return; if (recoveredSelectedPositions.size() > 0) { @@ -3945,17 +3954,6 @@ public String copyMessages(ArrayList messagesSelected){ return builder.toString(); } - /** - * Method for copying a text to the clipboard. - * - * @param text The text. - */ - private void copyToClipboard(String text) { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); - clipboard.setPrimaryClip(clip); - showSnackbar(SNACKBAR_TYPE, getString(R.string.messages_copied_clipboard), -1); - } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { @@ -7662,7 +7660,7 @@ public void onSaveInstanceState(Bundle outState){ RotatableAdapter currentAdapter = getAdapter(); if(currentAdapter != null & adapter.isMultipleSelect()){ ArrayList selectedPositions= (ArrayList) (currentAdapter.getSelectedItems()); - outState.putSerializable(SELECTED_ITEMS, selectedPositions); + outState.putIntegerArrayList(SELECTED_ITEMS, selectedPositions); } MessageVoiceClip messageVoiceClip = adapter.getVoiceClipPlaying(); diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java index 51c2276e99c..e883e458a3a 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/megachat/chatAdapters/MegaChatLollipopAdapter.java @@ -6116,11 +6116,7 @@ public void clearSelections() { * @return True, if selected. False, if not selected. */ private boolean isItemChecked(long msgId) { - if (messagesSelectedInChat.get(msgId) != null) { - return true; - } - - return false; + return messagesSelectedInChat.get(msgId) != null; } /** @@ -6154,7 +6150,7 @@ public ArrayList getSelectedItems() { public ArrayList getSelectedMessages() { ArrayList returnedMessages = new ArrayList<>(); if (messagesSelectedInChat == null || messagesSelectedInChat.isEmpty()) - return messages; + return returnedMessages; for (HashMap.Entry messageSelected : messagesSelectedInChat.entrySet()) { for (AndroidMegaChatMessage message : messages) { @@ -6174,11 +6170,7 @@ public ArrayList getSelectedMessages() { * @return The message. */ public AndroidMegaChatMessage getMessageAtPosition(int position) { - if (messages == null || messages.isEmpty() || messages.get(position) == null) { - return null; - } - - return messages.get(position); + return messages == null || messages.isEmpty() || messages.get(position) == null ? null : messages.get(position); } @Override @@ -6251,13 +6243,8 @@ public void removeMessage(int position, ArrayList messag * @return The message. */ public AndroidMegaChatMessage getMessageAt(int positionInAdapter) { - try { - if (this.messages != null) { - return this.messages.get(positionInAdapter - 1); - } - } catch (IndexOutOfBoundsException e) { - } - return null; + int position = positionInAdapter - 1; + return messages != null && positionInAdapter >= 0 && positionInAdapter < messages.size() ? messages.get(position) : null; } public void loadPreviousMessages(ArrayList messages, int counter) { diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java index 7f9e5c4bb5c..a820b563824 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/ContactAttachmentBottomSheetDialogFragment.java @@ -106,7 +106,6 @@ public void setupDialog(final Dialog dialog, int style) { LinearLayout optionInfo = contentView.findViewById(R.id.option_info_layout); LinearLayout optionStartConversation = contentView.findViewById(R.id.option_start_conversation_layout); LinearLayout optionInvite = contentView.findViewById(R.id.option_invite_layout); - LinearLayout optionRemove = contentView.findViewById(R.id.option_remove_layout); LinearLayout optionForward = contentView.findViewById(R.id.forward_layout); LinearLayout optionSelect = contentView.findViewById(R.id.select_layout); LinearLayout optionDeleteMessage = contentView.findViewById(R.id.delete_layout); @@ -124,8 +123,6 @@ public void setupDialog(final Dialog dialog, int style) { LinearLayout selectSeparator = contentView.findViewById(R.id.select_separator); LinearLayout deleteMessageSeparator = contentView.findViewById(R.id.delete_separator); - optionRemove.setVisibility(View.GONE); - if (isScreenInPortrait(context)) { titleNameContactChatPanel.setMaxWidthEmojis(px2dp(MAX_WIDTH_BOTTOM_SHEET_DIALOG_PORT, outMetrics)); titleMailContactChatPanel.setMaxWidthEmojis(px2dp(MAX_WIDTH_BOTTOM_SHEET_DIALOG_PORT, outMetrics)); diff --git a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java index abd8673719d..96eaee3e87d 100644 --- a/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java +++ b/app/src/main/java/mega/privacy/android/app/modalbottomsheet/chatmodalbottomsheet/GeneralChatMessageBottomSheet.java @@ -5,6 +5,8 @@ import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; +import android.widget.TextView; + import java.util.ArrayList; import mega.privacy.android.app.R; import mega.privacy.android.app.lollipop.controllers.ChatController; @@ -74,6 +76,7 @@ public void setupDialog(final Dialog dialog, int style) { LinearLayout optionSelect = contentView.findViewById(R.id.select_layout); LinearLayout deleteSeparator = contentView.findViewById(R.id.delete_separator); LinearLayout optionDelete = contentView.findViewById(R.id.delete_layout); + TextView textDelete = contentView.findViewById(R.id.delete_text); optionForward.setOnClickListener(this); optionEdit.setOnClickListener(this); @@ -129,6 +132,11 @@ public void setupDialog(final Dialog dialog, int style) { if (message.getMessage().getUserHandle() != megaChatApi.getMyUserHandle() || !message.getMessage().isDeletable()) { optionDelete.setVisibility(View.GONE); } else { + if (message.getMessage().getType() == MegaChatMessage.TYPE_NORMAL && message.getRichLinkMessage() == null) { + textDelete.setText(getString(R.string.delete_button)); + } else { + textDelete.setText(getString(R.string.context_remove)); + } optionDelete.setVisibility(View.VISIBLE); } } @@ -170,7 +178,8 @@ public void onClick(View view) { break; case R.id.copy_layout: - ((ChatActivityLollipop) context).copyMessage(message); + String text = ((ChatActivityLollipop) context).copyMessage(message); + ((ChatActivityLollipop) context).copyToClipboard(text); break; case R.id.delete_layout: diff --git a/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml b/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml index 22642c42db2..3768a991760 100644 --- a/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml +++ b/app/src/main/res/layout/bottom_sheet_contact_attachment_item.xml @@ -232,7 +232,7 @@ android:layout_marginLeft="18dp" android:paddingTop="2dp" android:paddingBottom="2dp" - android:text="@string/contact_properties_activity" + android:text="@string/file_properties_info_info_file" android:textColor="@color/name_my_account" android:textSize="16sp" /> @@ -292,6 +292,7 @@ android:paddingTop="2dp" android:paddingBottom="2dp" android:src="@drawable/ic_add_contact_chat_item" + android:tint="@color/mail_my_account" android:visibility="visible" /> @@ -341,37 +342,6 @@ android:layout_marginLeft="18dp" android:paddingTop="2dp" android:paddingBottom="2dp" - android:text="@string/delete_button" - android:textColor="@color/dark_primary_color" - android:textSize="16sp" /> - - - - - - - diff --git a/app/src/main/res/layout/bottom_sheet_general_chat_messages.xml b/app/src/main/res/layout/bottom_sheet_general_chat_messages.xml index 0128546f56e..2de0ac72aca 100644 --- a/app/src/main/res/layout/bottom_sheet_general_chat_messages.xml +++ b/app/src/main/res/layout/bottom_sheet_general_chat_messages.xml @@ -207,7 +207,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginRight="15dp" - android:text="@string/delete_button" + android:text="@string/context_remove" android:textColor="@color/dark_primary_color" android:textSize="16sp" /> diff --git a/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml b/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml index 5f1d0a17535..b73adb8502f 100644 --- a/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml +++ b/app/src/main/res/layout/bottom_sheet_node_attachment_item.xml @@ -112,7 +112,7 @@ android:layout_marginLeft="5dp" android:paddingTop="2dp" android:src="@drawable/ic_b_open_with" - android:tint="@color/mail_my_account" + android:alpha="0.54" android:visibility="visible" /> @@ -328,7 +328,7 @@ android:paddingBottom="2dp" android:paddingTop="2dp" android:layout_marginLeft="18dp" - android:text="@string/save_for_offline" + android:text="@string/save_to_offline" android:textColor="@color/name_my_account" android:textSize="16sp"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 86aa51e30a6..8d8e4bd9d94 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1541,6 +1541,8 @@ View files Import Save for offline + Add to Cloud + Save to Offline View contacts From 04a9c60b256ba7dcad43b21555e8e3d8a40974ab Mon Sep 17 00:00:00 2001 From: aw Date: Tue, 19 May 2020 12:30:03 +1200 Subject: [PATCH 041/100] 1. update string 2. disable CU/MU when local folder is unavailable --- .../app/constants/SettingsConstants.java | 1 + .../app/jobservices/CameraUploadsService.java | 30 +++++++++++++------ .../SettingsFragmentLollipop.java | 22 ++++++++------ .../android/app/utils/CameraUploadUtil.java | 3 +- app/src/main/res/values/strings.xml | 4 +-- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java b/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java index a3c80400ee7..d577e45435a 100644 --- a/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java +++ b/app/src/main/java/mega/privacy/android/app/constants/SettingsConstants.java @@ -2,6 +2,7 @@ public class SettingsConstants { public static final String ACTION_REFRESH_CAMERA_UPLOADS_SETTING = "ACTION_REFRESH_CAMERA_UPLOADS_SETTING"; + public static final String ACTION_REFRESH_CAMERA_UPLOADS_MEDIA_SETTING = "ACTION_REFRESH_CAMERA_UPLOADS_MEDIA_SETTING"; public static final String ACTION_REFRESH_CLEAR_OFFLINE_SETTING = "ACTION_REFRESH_CLEAR_OFFLINE_SETTING"; public static final int COMPRESSION_QUEUE_SIZE_MIN = 100; public static final int COMPRESSION_QUEUE_SIZE_MAX = 1000; diff --git a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java index 2f4dca5b80a..3f3b6943ed2 100644 --- a/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java +++ b/app/src/main/java/mega/privacy/android/app/jobservices/CameraUploadsService.java @@ -27,6 +27,7 @@ import androidx.core.content.ContextCompat; import androidx.documentfile.provider.DocumentFile; import androidx.exifinterface.media.ExifInterface; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; import java.io.File; import java.io.IOException; @@ -67,9 +68,10 @@ import nz.mega.sdk.MegaTransfer; import nz.mega.sdk.MegaTransferListenerInterface; -import static mega.privacy.android.app.constants.SettingsConstants.VIDEO_QUALITY_MEDIUM; +import static mega.privacy.android.app.constants.SettingsConstants.*; import static mega.privacy.android.app.jobservices.SyncRecord.*; import static mega.privacy.android.app.listeners.CreateFolderListener.ExtraAction.INIT_CU; +import static mega.privacy.android.app.lollipop.managerSections.SettingsFragmentLollipop.INVAILD_PATH; import static mega.privacy.android.app.utils.Constants.*; import static mega.privacy.android.app.receivers.NetworkTypeChangeReceiver.MOBILE; import static mega.privacy.android.app.utils.FileUtils.*; @@ -88,7 +90,8 @@ public class CameraUploadsService extends Service implements NetworkTypeChangeReceiver.OnNetworkTypeChangeCallback, MegaChatRequestListenerInterface, MegaRequestListenerInterface, MegaTransferListenerInterface, VideoCompressionCallback { - public static final int LOCAL_FOLDER_REMINDER_NOTI_ID = 1909; + public static final int LOCAL_FOLDER_REMINDER_PRIMARY = 1908; + public static final int LOCAL_FOLDER_REMINDER_SECONDARY = 1909; private static final String OVER_QUOTA_NOTIFICATION_CHANNEL_ID = "overquotanotification"; private static final String ERROR_NOT_ENOUGH_SPACE = "ERROR_NOT_ENOUGH_SPACE"; private static final String ERROR_CREATE_FILE_IO_ERROR = "ERROR_CREATE_FILE_IO_ERROR"; @@ -957,17 +960,26 @@ private int shouldRun() { } if (!checkPrimaryLocalFolder()) { - localFolderUnavailableNotification(R.string.camera_notif_primary_local_unavailable); + localFolderUnavailableNotification(R.string.camera_notif_primary_local_unavailable,LOCAL_FOLDER_REMINDER_PRIMARY); + disableCameraUploadSettingProcess(); + dbH.setCamSyncLocalPath(""); + dbH.setSecondaryFolderPath(INVAILD_PATH); + //refresh settings fragment UI + LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_REFRESH_CAMERA_UPLOADS_SETTING)); return SHOULD_RUN_STATE_FAILED; } else { - mNotificationManager.cancel(LOCAL_FOLDER_REMINDER_NOTI_ID); + mNotificationManager.cancel(LOCAL_FOLDER_REMINDER_PRIMARY); } if(!checkSecondaryLocalFolder()) { - localFolderUnavailableNotification(R.string.camera_notif_secondary_local_unavailable); + localFolderUnavailableNotification(R.string.camera_notif_secondary_local_unavailable,LOCAL_FOLDER_REMINDER_SECONDARY); + // disable media upload only + disableMediaUploadProcess(); + dbH.setSecondaryFolderPath(INVAILD_PATH); + LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_REFRESH_CAMERA_UPLOADS_MEDIA_SETTING)); return SHOULD_RUN_STATE_FAILED; } else { - mNotificationManager.cancel(LOCAL_FOLDER_REMINDER_NOTI_ID); + mNotificationManager.cancel(LOCAL_FOLDER_REMINDER_SECONDARY); } if (!localPath.endsWith(SEPARATOR)) { @@ -1016,18 +1028,18 @@ private int shouldRun() { return secondaryFolderResult; } - private void localFolderUnavailableNotification(int resId) { + private void localFolderUnavailableNotification(int resId, int notiId) { boolean isShowing = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { for(StatusBarNotification notification : mNotificationManager.getActiveNotifications()) { - if(notification.getId() == LOCAL_FOLDER_REMINDER_NOTI_ID) { + if(notification.getId() == notiId) { isShowing = true; } } } if(!isShowing) { mNotification = createNotification(getString(R.string.section_photo_sync), getString(resId), null, false); - mNotificationManager.notify(LOCAL_FOLDER_REMINDER_NOTI_ID, mNotification); + mNotificationManager.notify(notiId, mNotification); } } diff --git a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java index 01b76ee2467..1b06f49deb5 100644 --- a/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java +++ b/app/src/main/java/mega/privacy/android/app/lollipop/managerSections/SettingsFragmentLollipop.java @@ -55,7 +55,6 @@ import mega.privacy.android.app.components.TwoLineCheckPreference; import mega.privacy.android.app.fcm.ChatAdvancedNotificationBuilder; import mega.privacy.android.app.fragments.settingsFragments.SettingsBaseFragment; -import mega.privacy.android.app.jobservices.CameraUploadsService; import mega.privacy.android.app.jobservices.SyncRecord; import mega.privacy.android.app.listeners.SetAttrUserListener; import mega.privacy.android.app.lollipop.ChangePasswordActivityLollipop; @@ -94,7 +93,8 @@ @SuppressLint("NewApi") public class SettingsFragmentLollipop extends SettingsBaseFragment implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener { - Handler handler = new Handler(); + public static final String INVAILD_PATH = "-1"; + Handler handler = new Handler(); PreferenceCategory qrCodeCategory; SwitchPreferenceCompat qrCodeAutoAcceptSwitch; @@ -734,7 +734,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { //check if the local secondary folder exists localSecondaryFolderPath = prefs.getLocalPathSecondaryFolder(); - if(localSecondaryFolderPath==null || localSecondaryFolderPath.equals("-1")){ + if(localSecondaryFolderPath==null || localSecondaryFolderPath.equals(INVAILD_PATH)){ logWarning("Secondary ON: invalid localSecondaryFolderPath"); localSecondaryFolderPath = getString(R.string.settings_empty_folder); Toast.makeText(context, getString(R.string.secondary_media_service_error_local_folder), Toast.LENGTH_SHORT).show(); @@ -744,7 +744,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { File checkSecondaryFile = new File(localSecondaryFolderPath); if(!checkSecondaryFile.exists()){ logWarning("Secondary ON: the local folder does not exist"); - dbH.setSecondaryFolderPath("-1"); + dbH.setSecondaryFolderPath(INVAILD_PATH); //If the secondary folder does not exist Toast.makeText(context, getString(R.string.secondary_media_service_error_local_folder), Toast.LENGTH_SHORT).show(); localSecondaryFolderPath = getString(R.string.settings_empty_folder); @@ -1284,13 +1284,13 @@ else if (preference.getKey().compareTo(KEY_SECONDARY_MEDIA_FOLDER_ON) == 0){ //If the secondary folder does not exist any more Toast.makeText(context, getString(R.string.secondary_media_service_error_local_folder), Toast.LENGTH_SHORT).show(); - if(localSecondaryFolderPath==null || localSecondaryFolderPath.equals("-1")){ + if(localSecondaryFolderPath==null || localSecondaryFolderPath.equals(INVAILD_PATH)){ localSecondaryFolderPath = getString(R.string.settings_empty_folder); } } } else{ - dbH.setSecondaryFolderPath("-1"); + dbH.setSecondaryFolderPath(INVAILD_PATH); //If the secondary folder does not exist any more Toast.makeText(context, getString(R.string.secondary_media_service_error_local_folder), Toast.LENGTH_SHORT).show(); localSecondaryFolderPath = getString(R.string.settings_empty_folder); @@ -1805,9 +1805,12 @@ public void onReceive(Context context, Intent intent) { if (intent != null) { switch (intent.getAction()) { case ACTION_REFRESH_CAMERA_UPLOADS_SETTING: - cameraUpload = intent.getBooleanExtra(CAMERA_UPLOADS_STATUS, false); refreshCameraUploadsSettings(); break; + case ACTION_REFRESH_CAMERA_UPLOADS_MEDIA_SETTING: + // disable UI elements of media upload omly + disableMediaUploadUIProcess(); + break; case ACTION_REFRESH_CLEAR_OFFLINE_SETTING: taskGetSizeOffline(); break; @@ -1842,6 +1845,7 @@ public void onResume() { IntentFilter filter = new IntentFilter(BROADCAST_ACTION_INTENT_SETTINGS_UPDATED); filter.addAction(ACTION_REFRESH_CAMERA_UPLOADS_SETTING); + filter.addAction(ACTION_REFRESH_CAMERA_UPLOADS_MEDIA_SETTING); filter.addAction(ACTION_REFRESH_CLEAR_OFFLINE_SETTING); LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter); @@ -2357,7 +2361,7 @@ private void setupSecondaryUpload(){ //check if the local secondary folder exists localSecondaryFolderPath = prefs.getLocalPathSecondaryFolder(); - if (localSecondaryFolderPath == null || localSecondaryFolderPath.equals("-1")) { + if (localSecondaryFolderPath == null || localSecondaryFolderPath.equals(INVAILD_PATH)) { logWarning("Secondary ON: invalid localSecondaryFolderPath"); localSecondaryFolderPath = getString(R.string.settings_empty_folder); Toast.makeText(context, getString(R.string.secondary_media_service_error_local_folder), Toast.LENGTH_SHORT).show(); @@ -2365,7 +2369,7 @@ private void setupSecondaryUpload(){ File checkSecondaryFile = new File(localSecondaryFolderPath); if (!checkSecondaryFile.exists()) { logDebug("Secondary ON: the local folder does not exist"); - dbH.setSecondaryFolderPath("-1"); + dbH.setSecondaryFolderPath(INVAILD_PATH); //If the secondary folder does not exist Toast.makeText(context, getString(R.string.secondary_media_service_error_local_folder), Toast.LENGTH_SHORT).show(); localSecondaryFolderPath = getString(R.string.settings_empty_folder); diff --git a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java index 5e06da171f8..f7f5464378f 100644 --- a/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java +++ b/app/src/main/java/mega/privacy/android/app/utils/CameraUploadUtil.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; +import android.os.Looper; import android.util.Log; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -230,7 +231,7 @@ public static void disableMediaUploadProcess() { */ public static void disableCameraUploadSettingProcess(boolean clearCamsyncRecords) { resetCUTimestampsAndCache(clearCamsyncRecords); - new Handler().postDelayed(() -> { + new Handler(Looper.getMainLooper()).postDelayed(() -> { if (dbH.shouldClearCamsyncRecords()) { dbH.deleteAllSyncRecords(TYPE_ANY); dbH.saveShouldClearCamsyncRecords(false); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e43f95a5f46..a9195ed6a00 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -692,8 +692,8 @@ Uploading files of media folders Checking for files to be uploaded Initializing Camera Uploads - Camera upload local folder is unavailable - Media upload local folder is unavailable + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. @@ -692,6 +692,9 @@ رفع ملفات مجلدات الميديا التحقق من الملفات المراد ترفيعها تهيئة ترفيعات الكاميرا + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ شبكة الوايرلس او بيانات الموبايل شبكة الوايرلس فقط - رفع ملف @@ -917,6 +919,7 @@ السجلات تم تفعيلها السجلات تم إيقافها + Unable to setup MEGA Camera Uploads folder لم يتم تمكين السجلات لأنك رفضت منح الأذونات المطلوبة فتح الموقع @@ -1541,6 +1544,8 @@ عرض الملفات استيراد احفظ دون اتصال + Add to Cloud + Save to Offline عرض جهات الاتصال @@ -1656,6 +1661,8 @@ جار إزالة جهة الاتصال من مجلد المشاركة نقل الي سلة المهملات؟ + Are you sure you want to move this folder to the Rubbish Bin? This will disable Camera Uploads. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. نقل الي سلة المهملات؟ الحذف من MEGA؟ إذا تركت المجلد، لن تكون قادراً على الوصول إليه مرة أخرى. @@ -1873,12 +1880,12 @@ تم إنهاء حسابك بسبب مخالفة شروط الخدمة الخاصة ب MEGA، مثل إساءة استخدام حقوق الآخرين؛ مشاركة /أو استيراد البيانات غير المشروعة؛ أو إساءة استخدام النظام. لا توجد ملفات - %s بايت - %s كيلو بايت - %s ميغابايب - %s جيجابايت - %s تيرابايت - بايت + %s بايت + %s KB + %s MB + %s GB + %s TB + ميغابايب %1$d نسخة معدلة @@ -2287,7 +2294,6 @@ حدث خطأ عند تحميل رابط المحادثة. - أنت تحاول استعراض محادثة كنت عضواً فيها سابقاً. هل تريد الانضمام إلى المحادثة مرة أخرى؟ أنت تشارك بالفعل في هذه المحادثة. استعراض هذه المحادثة لم يعد متاحاً. إذا غادرت الاستعراض، فلن تتمكن من إعادة فتحه. @@ -2766,4 +2772,7 @@ هل تريد الحفظ دائماً في هذا الموقع؟ أرفق من … + Chat created on %s + Select message + diff --git a/app/src/main/res/values-ar/strings_karere_errors.xml b/app/src/main/res/values-ar/strings_karere_errors.xml new file mode 100644 index 00000000000..dd88b805139 --- /dev/null +++ b/app/src/main/res/values-ar/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + لا يوجد خطأ + محادثة غير صالحة + غير مسموح بالدخول + Resource does not exist. + Resource already exists. + خطأ غير معروف + Too many uses for this resource. + diff --git a/app/src/main/res/values-ar/strings_sdk_errors.xml b/app/src/main/res/values-ar/strings_sdk_errors.xml new file mode 100644 index 00000000000..62bd856d9fc --- /dev/null +++ b/app/src/main/res/values-ar/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + لا يوجد خطأ + خطأ داخلي + محادثة غير صالحة + فشل الطلب، إعادة المحاولة + تم تجاوز الحد الاقصي + فشلت بصفة دائمة + تم خرق شروط الخدمة + الكثير من الاتصالات المتزامنة أو عمليات النقل + خارج النطاق + انتهت + غير موجود + فشل عملية التراسل بسبب وجود عودية في بنية المجلد + Circular linkage detected + غير مسموح بالدخول + موجود مسبقا + غير كاملة + خطأ مفتاح / فك التشفير غير صالح + معرف الجلسة سي + لا يمكن الوصول إليها بسبب انتهاك شروط استخدام الخدمة أو سياسة الاستخدام المقبول + محظور + أكثر من الحصة + غير متوفرة مؤقتا + تجاوز سعة الاتصال + إرسال الخطأ + قراءة الخطأ + مفتاح التطبيق غير صالح + فشل مصادقة شهادة التشفير SSL + لا يوجد حجم متاح كافي + مطلوب مصادقة متعددة العوامل. + Access denied for users + انتهت صلاحية حساب الأعمال خاصتك + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + خطأ غير معروف + HTTP Error + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 083ea6510f6..1c0e9d03e83 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -249,7 +249,7 @@ Cloud Drive Neue/Geänderte Dateien - Medienuploads + Media-Uploads Posteingang Für Offline-Zugriff gespeichert Offline @@ -267,7 +267,7 @@ Transfers Mein Account - Kamerauploads + Kamera Uploads @@ -692,6 +692,9 @@ Hochladen von Dateien aus Medienordnern Dateien werden für den Upload geprüft Kamera-Uploads werden initialisiert + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ WLAN oder Mobildaten Nur via WLAN - Dateiupload @@ -917,6 +919,7 @@ Logging aktiviert Logging deaktiviert + Unable to setup MEGA Camera Uploads folder Logs have not been enabled because you denied the required permissions Ordner öffnen @@ -1541,6 +1544,8 @@ Dateien anzeigen Import Für Offline-Nutzung speichern + Add to Cloud + Save to Offline Kontakte anzeigen @@ -1656,6 +1661,8 @@ Der Kontakt wird aus der Ordnerfreigabe entfernt In den Papierkorb verschieben? + Are you sure you want to move this folder to the Rubbish Bin? This will disable Camera Uploads. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. In den Papierkorb verschieben? Von MEGA löschen? Wenn Sie diese Ordnerfreigabe verlassen, können Sie auf sie nicht mehr zugreifen. @@ -2168,7 +2175,7 @@ Dateiverwaltung Alle älteren Dateiversionen löschen - Alle alten Dateiversionen werden gelöscht. Dateiversionen in Ordnerfreigaben eines Kontakts müssen vom Eigentümer entfernt werden werden. + Alle alten Dateiversionen werden gelöscht. Dateiversionen in Ordnerfreigaben eines Kontakts müssen vom Eigentümer entfernt werden. Sie löschen die Versionshistorie aller Dateien. Dateiversionen in Ordnerfreigaben eines Kontakts müssen durch diesen gelöscht werden.\n\nDie aktuelle Version jeder Datei bleibt erhalte. @@ -2287,7 +2294,6 @@ Fehler bei der Initialisierung des Chats beim Laden des Chatlinks. - Sie waren früher bereits in diesem Chat. Erneut teilnehmen? Sie sind bereits in diesem Chat This chat preview is no longer available. If you leave the preview, you won’t be able to reopen it. @@ -2766,4 +2772,7 @@ Always save to this location? Attach from… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-de/strings_karere_errors.xml b/app/src/main/res/values-de/strings_karere_errors.xml new file mode 100644 index 00000000000..7f6088b9457 --- /dev/null +++ b/app/src/main/res/values-de/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Kein Fehler + Ungültiges Argument + Zugriff verweigert + Resource does not exist. + Resource already exists. + Unbekannter Fehler + Too many uses for this resource. + diff --git a/app/src/main/res/values-de/strings_sdk_errors.xml b/app/src/main/res/values-de/strings_sdk_errors.xml new file mode 100644 index 00000000000..5e467b3d965 --- /dev/null +++ b/app/src/main/res/values-de/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Kein Fehler + Interner Fehler + Ungültiges Argument + Operations fehlgeschlagen, wiederhole + Zuviele Kommandos + Endgültig fehlgeschlagen + Terms of Service breached + Zuviele gleichzeitige Verbindungen + Außerhalb des erlaubten Bereichs + Abgelaufen + Nicht gefunden + Transfer wegen Verzeichnisrekursion fehlgeschlagen + Kreisverkettung detektiert + Zugriff verweigert + Existiert bereits + Unvollständig + Krypto-Fehler + Ungültige Session-ID + Not accessible due to ToS/AUP violation + Blockiert + Über dem Limit + Vorübergehend nicht verfügbar + Zuviele gleichzeitige Verbindungen + Schreibfehler + Lesefehler + Dieses Programm ist gesperrt + SSL-Prüfung fehlgeschlagen + Sie haben Ihr Limit überschritten + Two-Factor Authentication required. + Access denied for users + Ihr Business-Account ist abgelaufen + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Unbekannter Fehler + HTTP Error + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5a62d22c445..0bc74f6fe8c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -249,7 +249,7 @@ Mi nube Recientes - Subidas multimedia + Media Uploads Buzón de entrada Sin conexión Sin conexión @@ -267,7 +267,7 @@ Transferencias Mi cuenta - Subidas de la cámara + Subidas de la cámara @@ -692,6 +692,9 @@ Subiendo archivos multimedia Comprobando archivos para la subida Iniciando Subidas de la cámara + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi o plan de datos Solo Wi-Fi - Subir archivos @@ -917,6 +919,7 @@ Logs activados Logs desactivados + Unable to setup MEGA Camera Uploads folder Los logs no se han activado porque has denegado los permisos requeridos Abrir ubicación @@ -1541,6 +1544,8 @@ Ver archivos Importar Guardar en Sin conexión + Add to Cloud + Save to Offline Ver contactos @@ -1656,6 +1661,8 @@ Eliminando contacto de la carpeta compartida ¿Mover elemento a la Papelera? + ¿Estás seguro de que quieres mover esta carpeta a la Papelera? Se desactivarán las Subídas de la cámara. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. ¿Mover elemento a la Papelera? ¿Eliminar de MEGA de forma permanente? Si abandonas la carpeta, no podrás acceder a ella de nuevo. @@ -2287,7 +2294,6 @@ No se ha podido empezar el chat al cargar el enlace del chat. - Estás intentando obtener una vista previa de un chat del que anteriormente eras miembro. ¿Quieres volver a unirte al chat? Ya eres miembro de este chat. Esta vista previa del chat ya no está disponible. Si abandonas la vista previa, no podrás volver a abrirla. @@ -2766,4 +2772,7 @@ ¿Guardar siempre en esta ubicación? Adjuntar desde… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-es/strings_karere_errors.xml b/app/src/main/res/values-es/strings_karere_errors.xml new file mode 100644 index 00000000000..92a8a004b9b --- /dev/null +++ b/app/src/main/res/values-es/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Ningún error + Argumento no válido + Acceso denegado + El recurso no existe. + El recurso ya existe. + Error desconocido + Too many uses for this resource. + diff --git a/app/src/main/res/values-es/strings_sdk_errors.xml b/app/src/main/res/values-es/strings_sdk_errors.xml new file mode 100644 index 00000000000..9a1308c6461 --- /dev/null +++ b/app/src/main/res/values-es/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Ningún error + Error interno + Argumento no válido + Petición fallida, reintentando + Se ha superado el límite + Fallo permanente + Términos de uso incumplidos + Demasiadas conexiones o transferencias simultáneas + Fuera de alcance + Caducado + No encontrado + Transferencia fallida debido a una estructura de carpetas recursiva + Enlace circular detectado + Acceso denegado + Ya existe + Incompleto + Clave incorrecta / Error de descifrado + Identificador de sesión erróneo + No accesible por infringir los Términos de servicio + Bloqueado + Límite excedido + No disponible temporalmente + Demasiadas conexiones + Error de escritura + Error de lectura + Clave de aplicación no válida + Verificación SSL fallida + Cuota insuficiente + Se requiere la autenticación de dos factores. + Access denied for users + Tu cuenta Business ha caducado + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Error desconocido + HTTP Error + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 304d31f9c0c..6134663aa5e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -249,7 +249,7 @@ Disque nuagique Récents - Téléversements des médias + Téléversements des médias Boîte de réception Enregistré Hors ligne Hors ligne @@ -267,7 +267,7 @@ Transferts Mon compte - Téléversements de l\'appareil photo + Téléversements de l\'appareil photo @@ -692,6 +692,9 @@ Téléversement des fichiers des dossiers de médias Vérification des fichiers à téléverser Initialisation des téléversements de l\'appareil photo + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi ou données mobiles Wi-Fi seulement - Téléversement de fichiers @@ -917,6 +919,7 @@ La journalisation est maintenant activée Les journaux sont maintenant désactivés + Unable to setup MEGA Camera Uploads folder Les journaux n\'ont pas été activés, car vous avez refusé l\'autorisation requise Ouvrir l\'emplacement @@ -1541,6 +1544,8 @@ Visualiser les fichiers Importer Enregistrer Hors ligne + Add to Cloud + Save to Offline Visualiser les contacts @@ -1656,6 +1661,8 @@ Suppression du contact du dossier partagé Déplacer vers la corbeille ? + Voulez-vous vraiment déplacer ce dossier vers la corbeille ? Téléversements de l\'appareil photo sera désactivée. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Déplacer vers la corbeille ? Supprimer de MEGA ? Si vous quittez le dossier, vous ne pourrez plus le voir. @@ -1874,10 +1881,10 @@ Aucun fichier %s o - %s Ko - %s Mo - %s Go - %s To + %s Ko + %s Mo + %s Go + %s To Mo @@ -2287,7 +2294,6 @@ Erreur d\'initialisation de la conversation lors du chargement du lien vers celle-ci. - Vous tentez de prévisualiser une conversation dont vous étiez membre auparavant. Souhaitez-vous vous joindre à cette conversation de nouveau ? Vous participez déjà cette conversation. L\'aperçu de cette conversation n\'est plus disponible. Si vous quittez cet aperçu, vous ne pourrez plus l\'ouvrir. @@ -2766,4 +2772,7 @@ Toujours enregistrer dans cet emplacement ? Joindre à partir de… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-fr/strings_karere_errors.xml b/app/src/main/res/values-fr/strings_karere_errors.xml new file mode 100644 index 00000000000..5ac737018c2 --- /dev/null +++ b/app/src/main/res/values-fr/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Aucune erreur + L\'argument est invalide + L\'accès a été refusé + La ressource n\'existe pas. + La ressource existe déjà. + Erreur inconnue + Too many uses for this resource. + diff --git a/app/src/main/res/values-fr/strings_sdk_errors.xml b/app/src/main/res/values-fr/strings_sdk_errors.xml new file mode 100644 index 00000000000..a0f067630a3 --- /dev/null +++ b/app/src/main/res/values-fr/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Aucune erreur + Erreur interne + L\'argument est invalide + Échec de la requête, nouvelle tentative + La limite est dépassée + Échec définitif + Non-respect des Conditions générales d\'utilisation + Trop de connexions ou transferts simultanés + Hors échelle + Expiré + Introuvable + Le transfert a échoué en raison d\'une structure de dossier récursive + Un lien circulaire a été détecté + L\'accès a été refusé + Existe déjà + Non terminé + Clé invalide/Erreur de déchiffrement + L\'ID de session est erroné + N\'est pas accessible en raison du non-respect des CGU/PUA. + Bloqué + Dépassement de quota + Temporairement non disponible + Dépassement du nombre de connexions + Erreur d\'écriture + Erreur de lecture + Clé d\'application invalide + Échec de vérification SSL + Quota insuffisant + L\'authentification à deux facteurs est exigée. + Access denied for users + Votre compte d\'entreprise est expiré + Credit card rejected + Billing failed + Rejected by fraud protection + Il y a trop de requêtes + Balance error + Erreur inconnue + HTTP Error + diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 2b746b46781..0c4c396f181 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -249,7 +249,7 @@ Cloud Drive Baru-baru ini - Upload media + Media Upload Kotak Masuk Simpan untuk Offline Offline @@ -267,7 +267,7 @@ Pemindahan Akun Saya - Upload kamera + Unggahan Kamera @@ -387,7 +387,7 @@ Tautan ini tidak akan tersedia untuk umum lagi. Tautan ini tidak akan tersedia untuk umum lagi. - These links will not be publicly available anymore. + Tautan ini tidak akan tersedia untuk umum lagi. Ubah nama Buka link @@ -692,6 +692,9 @@ Meng-upload file atau folder media Memeriksa file yang akan diunggah Inisialisasi Unggahan Kamera + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi atau data plan Hanya Wi-Fi - Unggah berkas @@ -870,7 +872,7 @@ Tanggal Tanggal pembuatan Tanggal modifikasi - Link creation date + Tautkan tanggal pembuatan terbaru tertua @@ -917,7 +919,8 @@ Logs sekarang diaktifkan Logs telah di nonaktifkan - Logs have not been enabled because you denied the required permissions + Unable to setup MEGA Camera Uploads folder + Log belum diaktifkan karena anda menolak izin yang diperlukan Buka lokasi Proses ini memakan waktu lebih lama dari yang diperkirakan. Mohon tunggu. @@ -1541,6 +1544,8 @@ Lihat file Import Simpan untuk offline + Add to Cloud + Save to Offline Lihat kontak @@ -1565,11 +1570,11 @@ Penghapusan tautan gagal. Coba lagi nanti. - Failed to remove some links. Please try again later. + Gagal menghapus beberapa tautan. Silakan coba lagi nanti. - Link removed successfully. - Links removed successfully. + Tautan berhasil dihapus. + Tautan berhasil dihapus. Link action gagal. Coba kembali lagi nanti. @@ -1656,6 +1661,8 @@ Melepaskan kontak dari folder bersama Pindahkan ke Sampah? + Anda yakin ingin memindahkan folder ini ke Bin Sampah? Ini akan menonaktifkan Unggahan Kamera. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Pindahkan ke Sampah? Hapus dari MEGA? Jika anda meninggalkan folder, anda tidak akan dapat untuk melihatnya kembali @@ -1842,7 +1849,7 @@ [B]Tidak ada [/B][A]Folder Dibagikan yang masuk[/A][B].[/B] [B]Tidak ada [/B][A]Folder Bersama yang dibagikan[/A][B].[/B] - [B]No [/B][A]Public Links[/A][B][/B] + [B]No [/B][A]Tautan Umum[/A][B][/B] Mengirim request Request diterima @@ -2287,7 +2294,6 @@ Kesalahan saat memulai obrolan saat memuat Tautan Obrolan. - Anda mencoba melihat pratinjau obrolan yang sebelumnya Anda menjadi anggotanya. Apakah Anda ingin bergabung dengan obrolan lagi? Anda sudah berpartisipasi dalam obrolan ini. Pratinjau obrolan ini tidak lagi tersedia. Jika Anda meninggalkan pratinjau, Anda tidak akan dapat membukanya kembali. @@ -2744,10 +2750,10 @@ Setel Nama Panggilan Edit Nama Panggilan - Nickname added - Nickname removed - An error occurred while trying to add the nickname - Nickname + Nama panggilan ditambahkan + Nama panggilan dihapus + Terjadi kesalahan saat mencoba menambahkan nama panggilan + Nama panggilan Menghubungkan kembali Anda kembali. @@ -2758,12 +2764,15 @@ Anda tidak memiliki izin yang diperlukan untuk mengembalikan file ini. Untuk melanjutkan, kita dapat membuat file baru dengan data yang dikembalikan. Apakah Anda ingin melanjutkan? Versi berhasil dibuat sebagai file baru. - on %1$s + pada %1$s - Are you sure you want to stop sharing these %1$d folders? + Anda yakin ingin berhenti berbagi %1$d folder? Download lokasi Selalu simpan ke lokasi ini? - Attach from… + Lampirkan dari … + Chat created on %s + Select message + diff --git a/app/src/main/res/values-in/strings_karere_errors.xml b/app/src/main/res/values-in/strings_karere_errors.xml new file mode 100644 index 00000000000..1af01c0cdf0 --- /dev/null +++ b/app/src/main/res/values-in/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Tidak ada error + Argumen salah + Akses ditolak + Sumber daya tidak ada. + Sumber daya sudah ada. + Error tidak diketahui + Too many uses for this resource. + diff --git a/app/src/main/res/values-in/strings_sdk_errors.xml b/app/src/main/res/values-in/strings_sdk_errors.xml new file mode 100644 index 00000000000..ba635d59de3 --- /dev/null +++ b/app/src/main/res/values-in/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Tidak ada error + Error internal + Argumen salah + Request gagal, mencoba kembali + Rate limit telah terlampaui + Gagal permanen + Ketentuan Layanan dilanggar + Terlalu banyak hubungan atau transfer pada waktu yang sama + Diluar jangkauan + Kadarluarsa + Tidak dapat ditemukan + Transfer gagal karena struktur direktori rekursif + Circular linkage terdeteksi + Akses ditolak + Sudah ada + Tidak selesai + Key salah/ Decryption error + Sesi ID buruk + Tidak dapat diakses karena pelanggaran ToS / AUP + Terblokir + Kuota terlebihi + Sementara tidak tersedia + Kebanjiran koneksi + Penulisan bermasalah + Baca bermasalah + Application key salah + Verifikasi SSL gagal + Kuota tidak cukup + Diperlukan Otentikasi Dua Faktor. + Access denied for users + Akun bisnis Anda kedaluwarsa + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Error tidak diketahui + HTTP Error + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 693580978b4..c9e093903a6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -249,7 +249,7 @@ Cloud Drive Recenti - Caricamenti dei media + Media caricati In arrivo Salvato in locale Offline @@ -267,7 +267,7 @@ Trasferimenti Account - Caricamenti dalla fotocamera + Camera Uploads @@ -692,6 +692,9 @@ Caricamento di file di cartelle media Controllo di file da caricare in corso Inizializzazione dei Caricamenti da fotocamera in corso + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi o connessione dati Solo Wi-Fi - Carica File @@ -917,6 +919,7 @@ I log ora sono attivati I log ora sono disattivati + Unable to setup MEGA Camera Uploads folder I log non sono stati attivati, perché hai negato l\'autorizzazione richiesta Apri posizione @@ -1541,6 +1544,8 @@ Vedi file Importa Salva per l\'Offline + Add to Cloud + Save to Offline Vedi contatti @@ -1656,6 +1661,8 @@ Rimuovi contatto dalla cartella condivisa Spostare nel Cestino? + Sei sicuro di voler spostare questa cartella nel Cestino? Questo disabiliterà i Caricamenti da fotocamera. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Spostare nel Cestino? Eliminare da MEGA? Se lasci la cartella, non sarai in grado di vederla di nuovo. @@ -2287,7 +2294,6 @@ Errore nell\'inizializzazione della chat durante il caricamento del link della chat. - Stai cercando di vedere l\'anteprima di una chat di cui facevi parte. Vuoi unirti di nuovo alla chat? Stai già partecipando a questa chat. L\'anteprima della chat non è più disponibile. Se lasci l\'anteprima, non potrai aprirla di nuovo. @@ -2766,4 +2772,7 @@ Salvare sempre in questa posizione? Allega da… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-it/strings_karere_errors.xml b/app/src/main/res/values-it/strings_karere_errors.xml new file mode 100644 index 00000000000..c3d080d1daf --- /dev/null +++ b/app/src/main/res/values-it/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Nessun errore + Argomento non valido + Accesso negato + La risorsa non esiste. + La risorsa esiste già. + Errore sconosciuto + Too many uses for this resource. + diff --git a/app/src/main/res/values-it/strings_sdk_errors.xml b/app/src/main/res/values-it/strings_sdk_errors.xml new file mode 100644 index 00000000000..04ceaf9789c --- /dev/null +++ b/app/src/main/res/values-it/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Nessun errore + Errore interno + Argomento non valido + Richiesta non riuscita, riprovo + Tasso limite superato + Fallito permanentemente + Termini di Servizio violati + Troppe connessioni simultanee o trasferimenti + Fuori dal campo + Scaduto + Non trovato + Il trasferimento è fallito a causa di una struttura ricorsiva della directory + Linkage circolare rilevato + Accesso negato + Esiste già + Incompleto + Chiave non valida/Errore di decrittazione + ID di sessione invalido + Non accessibile a causa di una violazione dei TdS o della PUA. + Bloccato + Oltre quota + Temporaneamente non disponibile + Overflow di connessione + Errore di scrittura + Errore di lettura + Chiave di applicazione non valida + Verifica SSL fallita + Non hai abbastanza banda di trasferimento + È necessaria l\'autenticazione a due fattori. + Access denied for users + Il tuo account business è scaduto + Credit card rejected + Billing failed + Rejected by fraud protection + Troppe richieste + Balance error + Errore sconosciuto + HTTP Error + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5d1357d1ce4..946e47e9f11 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -249,7 +249,7 @@ クラウド・ドライブ 最近 - メディアのアップロード + メディア・アップロード 受信 オフラインで保存 オフライン @@ -267,7 +267,7 @@ 転送 アカウント設定 - カメラアップロード + 写真アップロード @@ -692,6 +692,9 @@ メディアフォルダのファイルをアップロード アップロードされるファイルを確認中 カメラアップロードの初期化中 + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fiまたはモバイルデータ Wi-Fiのみ - ファイルアップロード @@ -917,6 +919,7 @@ ロギングが有効にしました。 ロギングが無効にしました。 + Unable to setup MEGA Camera Uploads folder 必要な権限を拒否したため、ログは有効になっていません ファイルの場所を開く @@ -1541,6 +1544,8 @@ ファイルを表示 インポート オフラインで保存 + Add to Cloud + Save to Offline 連絡先を表示 @@ -1656,6 +1661,8 @@ 共有フォルダから連絡先を削除 ゴミ箱に移しますか? + このフォルダをごみ箱に移動してもよろしいですか? これによりカメラアップロードが無効になります。 + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. ゴミ箱に移しますか? MEGAから削除しますか? 当該フォルダから去ると、再度それを見ることはできません。 @@ -2287,7 +2294,6 @@ チャットリンクの読み込み中にチャットの初期化でエラーが発生しました。 - 以前あなたがメンバーだったチャットをプレビューしようとしています。このチャットにもう一度参加しますか?  あなたはすでにこのチャットに参加しています。 このチャットのプレビューは利用できなくなりました。プレビューを終了すると、もう一度開くことはできません。 @@ -2766,4 +2772,7 @@ 常にこの場所に保存しますか? 以下から添付… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-ja/strings_karere_errors.xml b/app/src/main/res/values-ja/strings_karere_errors.xml new file mode 100644 index 00000000000..9ec14b7a411 --- /dev/null +++ b/app/src/main/res/values-ja/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + エラーなし + 引数無効 + アクセスは拒否されました。 + リソースが存在しません。 + リソースはすでに存在しています。 + 未知のエラー + Too many uses for this resource. + diff --git a/app/src/main/res/values-ja/strings_sdk_errors.xml b/app/src/main/res/values-ja/strings_sdk_errors.xml new file mode 100644 index 00000000000..6a108fdbcf8 --- /dev/null +++ b/app/src/main/res/values-ja/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + エラーなし + 内部エラー + 引数無効 + リクエスト失敗、再度トライ中 + レート上限超過 + 転送できませんでした。 + ご利用規約違反 + 同時接続又は転送が多すぎます。 + 領域外 + 失効済み + 見つかりません。 + 転送は再帰的なディレクトリ構造が原因で失敗しました + 環状連鎖あり + アクセスは拒否されました。 + 既に存在します。 + 不完全です。 + 鍵が無効/複合化エラー + セッションID不良 + ToS/AUP違反のためアクセスできません + 妨害されています + クォータ超過 + 今は使えません。 + 接続過多 + エラーを書き込む + エラーを読み取る + アプリ鍵無効 + SSL検証に失敗しました + 容量が足りません + 二要素認証が必要です。 + Access denied for users + あなたのビジネスアカウントは期限切れです + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + 未知のエラー + HTTP Error + diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 82d2438c56f..fd51b91230e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -249,7 +249,7 @@ 클라우드 드라이브 최근 - 미디어 업로드 + 미디어 업로드 수신함 오프라인으로 저장됨 오프라인 @@ -267,7 +267,7 @@ 전송 내 계정 - 카메라 업로드 + 카메라 업로드 @@ -692,6 +692,9 @@ 미디어 폴더의 파일을 업로드할 수 없습니다 업로드할 파일 확인중 카메라 업로드 초기화중 + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ 와이파이 또는 모바일 데이터 와이파이 전용 - 파일 올리기 @@ -917,6 +919,7 @@ 로그가 활성화 되었습니다. 로그가 비활성화 되었습니다. + Unable to setup MEGA Camera Uploads folder 당신이 필요한 권한을 거부했기 때문에 기록을 활성화할 수 없습니다 위치 열기 @@ -1541,6 +1544,8 @@ 파일 보기 들여오기 오프라인용으로 저장 + Add to Cloud + Save to Offline 연락처 보기 @@ -1656,6 +1661,8 @@ 공유된 폴더에서 연락처 제거중 휴지통으로 옮길까요? + 이 폴더를 휴지통에 버리시겠습니까? 이로 인해 카메라 업로드가 해제됩니다. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. 휴지통으로 옮길까요? MEGA에서 삭제할까요? 폴더를 떠나면, 다시 볼 수 없습니다. @@ -2287,7 +2294,6 @@ 대화 링크를 불러오던 중 대화 초기화 오류 발생 - 이전에 참여했었던 대화를 미리 보려고 합니다. 대화에 참여하시겠습니까? 이미 이 대화에 참여하고 있습니다. 이 대화 미리 보기는 더 이상 유효하지 않습니다. 미리 보기를 떠나면, 다시 열 수 없습니다. @@ -2766,4 +2772,7 @@ 항상 이 위치에 저장할까요? 다음에서 첨부… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-ko/strings_karere_errors.xml b/app/src/main/res/values-ko/strings_karere_errors.xml new file mode 100644 index 00000000000..64c792d9152 --- /dev/null +++ b/app/src/main/res/values-ko/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + 오류 없음 + 잘못된 인수 + 접근이 거부됨 + 리소스가 존재하지 않습니다. + 리소스가 이미 존재합니다. + 알 수 없는 오류 + Too many uses for this resource. + diff --git a/app/src/main/res/values-ko/strings_sdk_errors.xml b/app/src/main/res/values-ko/strings_sdk_errors.xml new file mode 100644 index 00000000000..271caaf7e83 --- /dev/null +++ b/app/src/main/res/values-ko/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + 오류 없음 + 내부 오류 + 잘못된 인수 + 요청이 실패함, 재시도중 + 비율 제한 초과 + 영구적으로 실패함 + 이용 약관 침해됨 + 너무 많은 동시 연결 또는 전송 + 범위를 벗어남 + 만료됨 + 발견되지 않음 + 재귀적 경로 구조로 인하여 전송 실패 + 순환 연결 감지 + 접근이 거부됨 + 이미 존재합니다 + 완료되지 않음 + 잘못된 키/해독 오류 + 세션 ID 오류 + 이용 약관 위반으로 인하여 접근 불가 + 차단됨 + 할당량 초과 + 일시적으로 이용이 불가능합니다 + 연결 초과 + 쓰기 오류 + 읽기 오류 + 잘못된 어플리케이션 키 + SSL 인증 실패 + 충분하지 않은 할당량 + 2단계 인증이 필요합니다. + Access denied for users + 당신의 비즈니스 계정이 만료되었습니다 + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + 알 수 없는 오류 + HTTP Error + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 223c41ca0bc..f5c18fffc27 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -249,7 +249,7 @@ Cloud Schijf Recent - Media uploads + Media uploads Inbox Opgeslagen voor Offline gebruik Offline @@ -267,7 +267,7 @@ Overdrachten Mijn Account - Camera uploads + Camera Uploads @@ -692,6 +692,9 @@ Bestanden uploaden van media mappen Bezig met zoeken naar te uploaden bestanden Camera-uploads initialiseren + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi of mobiele data Alleen Wi-Fi - Upload Bestand @@ -917,6 +919,7 @@ Logs zijn niet ingeschakeld Logs zijn nu uitgeschakeld + Unable to setup MEGA Camera Uploads folder Logboeken zijn niet ingeschakeld omdat u de vereiste rechten heeft geweigerd Open locatie @@ -1541,6 +1544,8 @@ Bestanden weergeven Importeren Opslaan voor offline + Add to Cloud + Save to Offline Contacten weergeven @@ -1656,6 +1661,8 @@ Verwijderen van gedeelde map Verplaatsen naar prullenbak? + Weet u zeker dat u deze map naar de Prullenbak wilt verplaatsen? Dit schakelt de Camera Uploads uit. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Verplaatsen naar prullenbak? Verwijderen van MEGA? Als u de map verlaat, bent u niet in staat het weer te zien. @@ -2287,7 +2294,6 @@ Fout bij initialiseren van het gesprek bij het laden van de Gesprekskoppeling. - U probeert een voorbeeld weer te geven van een gesprek waarvan u eerder lid was. Wilt u opnieuw deelnemen aan het gesprek? U neemt al deel aan dit gesprek. Deze chat weergave is niet langer beschikbaar. Als u deze weergave verlaat, bent u niet in staat het te heropenen. @@ -2766,4 +2772,7 @@ Altijd op deze locatie opslaan? Bijvoegen vanaf … + Chat created on %s + Select message + diff --git a/app/src/main/res/values-nl/strings_karere_errors.xml b/app/src/main/res/values-nl/strings_karere_errors.xml new file mode 100644 index 00000000000..e8437ee3f3a --- /dev/null +++ b/app/src/main/res/values-nl/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Geen fout + Ongeldige invoer + Toegang geweigerd + Bron bestaat niet. + Bron bestaat al. + Onbekende fout + Too many uses for this resource. + diff --git a/app/src/main/res/values-nl/strings_sdk_errors.xml b/app/src/main/res/values-nl/strings_sdk_errors.xml new file mode 100644 index 00000000000..36253561f3b --- /dev/null +++ b/app/src/main/res/values-nl/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Geen fout + Interne fout + Ongeldige invoer + Verzoek mislukt, opnieuw proberen + Snelheidslimiet overschreden + Permanent mislukt + Service Voorwaarden geschonden + Teveel gelijktijdige verbindingen of overdrachten + Buiten bereik + Verlopen + Niet gevonden + Overdracht is mislukt vanwege een recursieve mapstructuur + Circulaire koppeling gedetecteerd + Toegang geweigerd + Bestaat al + Incompleet + Ongeldige sleutel/Decryptie fout + Bad session ID + Niet toegangelijk door ToS/AUP schending + Geblokkeerd + Over tegoed + Tijdelijk niet beschikbaar + Connectie overfloop + Schrijffout + Leesfout + Ongeldige toepassingssleutel + SSL verificatie mislukt + Niet genoeg tegoed + 2-Factor Authenticatie vereist. + Access denied for users + Uw zakelijke account is verlopen + Credit card rejected + Billing failed + Rejected by fraud protection + Te veel verzoeken + Balance error + Onbekende fout + HTTP Error + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fc75c7058cf..27d217e7741 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -249,7 +249,7 @@ Dysk Niedawne - Wgranie mediów + Wgrywanie plików Skrzynka Zapisane offline Niedostępny @@ -267,7 +267,7 @@ Ruch Moje konto - Wgranie z kamery + Wgrywanie zdjęć @@ -692,6 +692,9 @@ Wgrywanie plików Sprawdzanie plików do przesłania Inicjowanie przesyłania z kamery + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi lub komórkowa transmisja danych Tylko Wi-Fi - Wgraj plik @@ -917,6 +919,7 @@ Logowanie jest uruchomione Logowanie jest zablokowane + Unable to setup MEGA Camera Uploads folder Dzienniki nie zostały włączone, ponieważ odmówiono wymaganych uprawnień Otwórz łącze @@ -1541,6 +1544,8 @@ Zobacz pliki Importuj Zapisz lokalnie + Add to Cloud + Save to Offline Pokaż kontakty @@ -1656,6 +1661,8 @@ Usuwanie kontaktu z udostępnionego katalogu Przenieść do kosza? + Czy na pewno chcesz przenieść ten folder do Kosza na śmieci? Spowoduje to wyłączenie przesyłania z aparatu. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Przenieść do kosza? Usunąć z MEGA? Jeśli opuścisz folder, nie będziesz go więcej widzieć. @@ -2287,7 +2294,6 @@ Błąd inicjowania czatu podczas ładowania łącza czatu. - Próbujesz wyświetlić podgląd czatu, którego wcześniej byłeś członkiem. Czy chcesz ponownie dołączyć do czatu? Uczestniczysz już w tym czacie. Ten podgląd czatu nie jest już dostępny. Jeśli opuścisz podgląd, nie będziesz mógł go ponownie otworzyć. @@ -2766,4 +2772,7 @@ Czy zawsze zapisywać w tej lokalizacji? Załącz z… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-pl/strings_karere_errors.xml b/app/src/main/res/values-pl/strings_karere_errors.xml new file mode 100644 index 00000000000..6edd52321b3 --- /dev/null +++ b/app/src/main/res/values-pl/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Brak błędów + Nieprawidłowy argument + Dostęp zabroniony + Element nie istnieje. + Element już istnieje. + Nieznany błąd + Too many uses for this resource. + diff --git a/app/src/main/res/values-pl/strings_sdk_errors.xml b/app/src/main/res/values-pl/strings_sdk_errors.xml new file mode 100644 index 00000000000..29dc457cc09 --- /dev/null +++ b/app/src/main/res/values-pl/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Brak błędów + Błąd wewnętrztny + Nieprawidłowy argument + Żądanie nie powiodło się, ponowić próbę? + Limit został przekroczony + Nie powiodło się + Naruszono warunki korzystania z usługi + Za dużo równoległych połączeń + Poza zasięgiem + Wygasło + Nie znaleziono + Przesyłanie nie powiodło się z powodu rekurencyjnej struktury katalogów + Wykryto linki rekurencyjne + Dostęp zabroniony + Już istnieje + Nie zakończone + Błędny klucz/Błąd deszyfrowania + Zły numer sesji + Niedostępny z powodu naruszenia ToS / AUP + Zablokowane + Przekroczono limit + Chwilowo niedostępne + Przepełnienie połączeń + Błąd zapisu + Błąd odczytu + Błędny klucz aplikacji + Niepowodzenie weryfikacji SSL + Za mało miejsca + Wymagane jest uwierzytelnianie dwuskładnikowe. + Access denied for users + Twoje konto biznesowe wygasło + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Nieznany błąd + HTTP Error + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 4d58fa3cab9..7a9b6f746bc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -249,7 +249,7 @@ Nuvem de arquivos Atividades recentes - Uploads de mídia + Upload de mídias Caixa de entrada Offline Offline @@ -267,7 +267,7 @@ Transferências Minha conta - Uploads da câmera + Uploads da câmera @@ -426,7 +426,7 @@ --> Salvar em Esvaziar a lixeira - Você vai remover permanentemente os itens da sua lixeira. + Você vai remover permanentemente todos os itens da sua Lixeira. @@ -692,6 +692,9 @@ Enviando imagens da câmera Verificando arquivos pendentes de upload Iniciando os Uploads da câmera + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi ou dados móveis Somente Wi-Fi - Upload de arquivo @@ -917,6 +919,7 @@ Os logs estão ativos Os logs foram desativados + Unable to setup MEGA Camera Uploads folder Os logs não foram ativados porque você não proporcionou as permissões necessárias Abrir localização @@ -1541,6 +1544,8 @@ Ver arquivos Importar Salvar para uso offline + Add to Cloud + Save to Offline Ver contatos @@ -1656,6 +1661,8 @@ Removendo o contato da pasta compartilhada Mover para a lixeira? + Você tem certeza de quera mover esta pasta para a Lixeira? Fazer isso desativará os Uploads da câmera. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Mover para a lixeira? Deletar do MEGA? Se você sair desta pasta, não será possível acessá-la novamente. @@ -1998,7 +2005,7 @@ Não foi possível acessar o MEGA. Por favor, verifique a sua conexão ou tente novamente mais tarde. Servidores ocupados. Por favor, aguarde. Este processo está demorando mais do que o esperado. Por favor, espere. - Muitas solicitações. Por favor, aguarde. + Solicitações em excesso. Por favor, aguarde. Cancelando o processo de login. Por favor, espere… Erro. O arquivo é corrupto ou não existe. @@ -2287,7 +2294,6 @@ Não foi possível carregar o link do chat. - Você está tentando visualizar um chat do qual você já participou. Você quer se unir ao chat novamente? Você já está participando deste chat. A visualização deste chat já não está disponível. Se você sair da visualização, não será possível reabri-la. @@ -2766,4 +2772,7 @@ Salvar sempre nesta pasta? Anexar de… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-pt-rBR/strings_karere_errors.xml b/app/src/main/res/values-pt-rBR/strings_karere_errors.xml new file mode 100644 index 00000000000..8f0a5957f03 --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Nenhum erro + Argumento inválido + Acesso negado + O recurso não existe. + O recurso já existe. + Erro desconhecido + Too many uses for this resource. + diff --git a/app/src/main/res/values-pt-rBR/strings_sdk_errors.xml b/app/src/main/res/values-pt-rBR/strings_sdk_errors.xml new file mode 100644 index 00000000000..176a9992d20 --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Nenhum erro + Erro interno + Argumento inválido + Solicitação falhou, tentando novamente + Limite de transferências excedido + Falhou permanentemente + Infração dos termos de serviço + Muitas conexões ou transferências + Fora de alcance + Expirado + Não encontrado + Não foi possível fazer a transferência devido a uma estrutura de diretório recursiva + Ligação circular detectada + Acesso negado + Já existe + Incompleto + Chave inválida/Erro de decodificação + ID de sessão inválido + Não acessível por infringir os termos de serviço + Bloqueado + Limite excedido + Temporariamente não disponível + Conexão sobrecarregada + Erro de escrita + Erro de leitura + Chave de aplicação inválida + Falha na verificação SSL + Cota insuficiente + Autenticação de dois fatores necessária. + Access denied for users + A sua conta business expirou + Credit card rejected + Billing failed + Rejected by fraud protection + Solicitações em excesso. + Balance error + Erro desconhecido + HTTP Error + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index cf62fb614d8..8333204a6fb 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -249,7 +249,7 @@ Unitate cloud Recente - Încărcări media + Încărcări media Conținut media primit Salvate pentru offline Offline @@ -267,7 +267,7 @@ Transferuri Contul meu - Încărcări cameră + Încărcări cameră @@ -387,7 +387,7 @@ Acest link nu va mai fi disponibil publicului. Acest link nu va mai fi disponibil publicului. - These links will not be publicly available anymore. + Aceste linkuri nu vor mai fi disponibile publicului. Redenumește Deschide un link @@ -692,6 +692,9 @@ Încărcarea fișierelor din folderele media Se verifică fișierele care să fie încărcate Se inițializează încărcări cameră + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi sau plan de date Numai Wi-Fi - Încarcă fișier(e) @@ -870,7 +872,7 @@ Dată Data creării Data modificării - Link creation date + Data creării linkului Cele mai noi Cele mai vechi @@ -917,6 +919,7 @@ Jurnalele sunt acum activate Jurnalele sunt acum dezactivate + Unable to setup MEGA Camera Uploads folder Logs have not been enabled because you denied the required permissions Deschide locația @@ -1541,6 +1544,8 @@ Vezi fișierele Importă Salvează pentru offline + Add to Cloud + Save to Offline Vezi contactele @@ -1656,6 +1661,8 @@ Eliminarea contactului de la folderul partajat Muți în coșul de gunoi? + Sigur vrei să muți acest folder în coșul de gunoi? Acest lucru va dezactiva Încărcări cameră. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Muți în coșul de gunoi? Ștergi de pe MEGA? Dacă părăsești folderul, nu vei putea să îl vezi din nou. @@ -1842,7 +1849,7 @@ [B]Niciun [/B][A]folder partajat primit[/A][B].[/B] [B]Niciun [/B][A]folder partajat trimis[/A][B].[/B] - [B]No [/B][A]Public Links[/A][B][/B] + [B]Niciun [/B][A]link public[/A][B][/B] Cereri trimise Cereri primite @@ -2287,7 +2294,6 @@ Eroare de inițializare a chatului la încărcarea linkului chatului. - Încerci să previzualizezi un chat în care ai fost anterior membru. Vrei să te alături din nou chatului? Participi deja la acest chat. Această previzualizare a chatului nu mai este disponibilă. Dacă părăsești previzualizarea, nu vei mai putea să o redeschizi. @@ -2512,7 +2518,7 @@ %1$s . %2$s Încă poți acorda permisiuni MEGA în setările dispozitivului. - If you allow MEGA to access your address book, you will be able to discover your contacts more easily. MEGA will not use this data for any other purpose and will never interact with your contacts without your consent. + Dacă permiți MEGA să îți acceseze agenda de adrese, vei putea să îți descoperi mai ușor contactele. MEGA nu va folosi aceste date în alt scop și nu va interacționa niciodată cu contactele fără consimțământul tău. Mesaj redirecționat @@ -2746,7 +2752,7 @@ Editează pseudonimul Pseudonim adăugat Pseudonim eliminat - An error occurred while trying to add the nickname + A apărut o eroare la încercarea de adăugare a pseudonimului Pseudonim Se reconectează @@ -2758,12 +2764,15 @@ Nu ai permisiunile necesare pentru a reveni la versiunea anterioară pentru acest fișier. Pentru a continua, putem crea un nou fișier cu datele readuse la versiunea anterioară. Dorești să continui? Versiunea a fost creată cu succes ca un fișier nou. - on %1$s + în data de %1$s - Are you sure you want to stop sharing these %1$d folders? + Sigur vrei să oprești partajarea acestor %1$d foldere? Locație de descărcare Salvezi întotdeauna în această locație? - Attach from… + Atașează de pe… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-ro/strings_karere_errors.xml b/app/src/main/res/values-ro/strings_karere_errors.xml new file mode 100644 index 00000000000..89863a10e50 --- /dev/null +++ b/app/src/main/res/values-ro/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Nicio eroare + Argument nevalid + Acces interzis + Resource does not exist. + Resource already exists. + Eroare necunoscută + Too many uses for this resource. + diff --git a/app/src/main/res/values-ro/strings_sdk_errors.xml b/app/src/main/res/values-ro/strings_sdk_errors.xml new file mode 100644 index 00000000000..584c0ae8090 --- /dev/null +++ b/app/src/main/res/values-ro/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Nicio eroare + Eroare internă + Argument nevalid + Cerere eșuată, se reîncearcă + Limita de rată depășită + Eșec definitiv + Au fost încălcați Termenii de utilizare a serviciului + Prea multe conexiuni sau transferuri simultane + În afara intervalului + Expirat + Negăsit + Transferul a eșuat din cauza unei structuri recursive a directoarelor + Legătură circulară detectată + Acces interzis + Există deja + Incomplet + Cheie nevalidă/eroare de decriptare + ID-ul sesiunii greșit + Indisponibil din cauza încălcării ToS/AUP + Blocat + Cotă depășită + Temporar indisponibil + Conexiune excedentă + Eroare la scriere + Eroare la citire + Cheia aplicației nevalidă + Verificarea SSL a eșuat + Cotă insuficientă + Two-Factor Authentication required. + Access denied for users + Contul tău business a expirat + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Eroare necunoscută + HTTP Error + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 33da912e806..6ed37a502e5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -249,7 +249,7 @@ Облачный диск Недавние - Загрузки медиа + Загрузки медиафайлов Входящие Сохранено локально На устройстве @@ -267,7 +267,7 @@ Передачи Мой аккаунт - Загрузки камеры + Загрузки с камеры @@ -692,6 +692,9 @@ Загрузить файлы или медиапапки Проверка файлов для загрузки Инициализация загрузок из камеры + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi или мобильные данные Только Wi-Fi - Загрузить файл @@ -917,6 +919,7 @@ Журнал включён Журнал отключён + Unable to setup MEGA Camera Uploads folder Журналы не были включены, потому что вы отказали в необходимых разрешениях Расположение @@ -1541,6 +1544,8 @@ Просмотр файлов Импортировать Сохранить локально + Add to Cloud + Save to Offline Просмотр контактов @@ -1656,6 +1661,8 @@ Удаление контакта из общей папки Переместить в корзину? + Вы действительно хотите переместить эту папку в корзину? Это отключит загрузки из камеры. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Переместить в корзину? Удалить с MEGA? Если вы закроете папку, вы не сможете зайти в неё снова. @@ -2287,7 +2294,6 @@ Ошибка инициализации чата при загрузке ссылки на чат. - Вы пытаетесь просмотреть чат, участником которого вы были ранее. Хотите снова присоединиться к чату? Вы уже участвуете в этом чате. Это превью чата больше не доступно. Покинув превью, вы не сможете открыть его снова. @@ -2766,4 +2772,7 @@ Всегда сохранять в эту папку? Прикрепить из… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-ru/strings_karere_errors.xml b/app/src/main/res/values-ru/strings_karere_errors.xml new file mode 100644 index 00000000000..e0f7fbab749 --- /dev/null +++ b/app/src/main/res/values-ru/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Ошибок нет + Неверный аргумент + Доступ запрещен + Ресурс не существует. + Ресурс уже существует. + Неизвестная ошибка + Too many uses for this resource. + diff --git a/app/src/main/res/values-ru/strings_sdk_errors.xml b/app/src/main/res/values-ru/strings_sdk_errors.xml new file mode 100644 index 00000000000..8911bb16cce --- /dev/null +++ b/app/src/main/res/values-ru/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Ошибок нет + Внутренняя ошибка + Неверный аргумент + Не удалось выполнить запрос, повтор запроса + Превышено ограничение пропускной способности + Окончательная ошибка + Нарушены условия предоставления услуг + Слишком много одновременных соединений или пересылок + Вне диапазона + Истекло + Не найдено + Передача не удалась из-за рекурсивной структуры директорий + Обнаружена циклическая ссылка + Доступ запрещен + Уже существует + Неполный + Неверный ключ/Ошибка расшифровки + Неверный идентификатор сессии + Недоступно из-за нарушения условий предоставления услуг/политики допустимого использования + Заблокировано + Превышение квоты + Временно недоступно + Избыток подключений + Ошибка записи + Ошибка чтения + Неверный ключ приложения + Сбой проверки SSL + Недостаточно квоты + Требуется двухфакторная аутентификация. + Access denied for users + Срок действия вашего бизнес-аккаунта истёк + Credit card rejected + Billing failed + Rejected by fraud protection + Слишком много запросов + Balance error + Неизвестная ошибка + HTTP Error + diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 6ffe61e3e87..596eca2cb4c 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -249,7 +249,7 @@ คลาวด์ไดรฟ์ เมื่อเร็ว ๆ นี้ - การอัปโหลดมีเดีย + อัปโหลดสื่อ กล่องขาเข้า บันทึกออฟไลน์ ออฟไลน์ @@ -267,7 +267,7 @@ การถ่ายโอน บัญชีของฉัน - การอัปโหลดจากกล้อง + อัปโหลดจากกล้อง @@ -692,6 +692,9 @@ อัปโหลดไฟล์ในโฟลเดอร์ของสื่อ กำลังตรวจสอบไฟล์ที่จะอัปโหลด เริ่มต้นการอัปโหลดจากกล้อง + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ WiFi หรือข้อมูลมือถือ Wi-Fi เท่านั้น - อัปโหลดไฟล์ @@ -917,6 +919,7 @@ รายการบันทึกจะถูกเปิดใช้งานในขณะนี้ รายการบันทึกจะถูกปิดใช้งานในขณะนี้ + Unable to setup MEGA Camera Uploads folder ไฟล์บันทึกยังไม่ได้เปิดใช้งาน เนื่องจากคุณปฏิเสธสิทธิ์ดังกล่าว เปิดตำแหน่งที่ตั้ง @@ -1541,6 +1544,8 @@ ดูไฟล์ นำเข้า บันทึกไว้สำหรับออฟไลน์ + Add to Cloud + Save to Offline ดูรายชื่อติดต่อ @@ -1656,6 +1661,8 @@ นำที่อยู่ติดต่อออกจากโฟลเดอร์แชร์ ย้ายไปถังขยะหรือไม่ + Are you sure you want to move this folder to the Rubbish Bin? This will disable Camera Uploads. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. ย้ายไปถังขยะหรือไม่ ลบออกจาก MEGA หรือไม่ หากคุณออกจากโฟลเดอร์ นี้คุณจะไม่สามารถดูได้อีก @@ -2287,7 +2294,6 @@ เกิดข้อผิดพลาดในการเริ่มต้นแชทเมื่อโหลดลิงก์แชท - คุณกำลังพยายามดูตัวอย่างแชทที่คุณเคยเป็นสมาชิก คุณต้องการเข้าร่วมการแชทอีกครั้งหรือไม่ คุณได้เข้าร่วมแชทนี้แล้ว ตัวอย่างแชทนี้ไม่สามารถใช้ได้อีกต่อไป หากคุณออกจากหน้าตัวอย่าง คุณจะไม่สามารถเปิดอีกครั้งได้ @@ -2766,4 +2772,7 @@ บันทึกไปยังตําแหน่งนี้เสมอหรือไม่ แนบจาก… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-th/strings_karere_errors.xml b/app/src/main/res/values-th/strings_karere_errors.xml new file mode 100644 index 00000000000..8acc7ef0599 --- /dev/null +++ b/app/src/main/res/values-th/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + ไม่มีข้อผิดพลาด + อาร์กิวเมนต์ไม่ถูกต้อง + การเข้าถึงถูกปฏิเสธ + Resource does not exist. + Resource already exists. + ข้อผิดพลาดที่ไม่รู้จัก + Too many uses for this resource. + diff --git a/app/src/main/res/values-th/strings_sdk_errors.xml b/app/src/main/res/values-th/strings_sdk_errors.xml new file mode 100644 index 00000000000..c3e64de0f08 --- /dev/null +++ b/app/src/main/res/values-th/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + ไม่มีข้อผิดพลาด + ผิดพลาดภายใน + อาร์กิวเมนต์ไม่ถูกต้อง + คำขอไม่สำเร็จ กำลังลองใหม่ + เกินจำกัดการให้คะแนนแล้ว + ไม่ประสบผลสำเร็จอย่างถาวร + ละเมิดข้อกำหนดในการให้บริการ + มีการเชื่อมต่อหรือถ่ายโอนพร้อมกันมากเกินไป + เกินขอบเขตที่กำหนด + หมดอายุแล้ว + ไม่พบข้อมูล + การถ่ายโอนล้มเหลวเนื่องจากมีโครงสร้างของไดเรกทอรีที่ซ้ำกัน + ตรวจพบการลิงก์แบบวงกลม + การเข้าถึงถูกปฏิเสธ + มีอยู่แล้ว + ไม่สมบูรณ์ + คีย์ไม่ถูกต้อง/การถอดรหัสผิดพลาด + ID เซสชั่นไม่ถูกต้อง + ไม่สามารถเข้าถึงได้เนื่องจากการละเมิด ToS/AUP + บล็อกแล้ว + เกินโควต้า + ใช้ไม่ได้ชั่วคราว + เชื่อมต่อมากไป + เขียนผิดพลาด + อ่านผิดพลาด + คีย์แอปพลิเคชันไม่ถูกต้อง + ยืนยัน SSL ไม่สำเร็จ + โควต้าไม่เพียงพอ + Two-Factor Authentication required. + Access denied for users + บัญชีธุรกิจของคุณหมดอายุแล้ว + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + ข้อผิดพลาดที่ไม่รู้จัก + HTTP Error + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f0d271bc9a2..890c842eeea 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -2162,7 +2162,6 @@ Sohbet Bağlantısını yüklerken sohbeti başlatma hatası. - Daha önce üye olduğunuz bir sohbeti önizlemeye çalışıyorsunuz. Sohbete tekrar katılmak ister misiniz? Bu sohbete zaten katıldınız. Bu sohbet önizlemesi artık mevcut değil. Önizlemeyi terk ederseniz, tekrar açamayacaksınız. diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e0de5397409..0d47413fb2c 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -249,7 +249,7 @@ Ổ Mây Lịch sử hoạt động - Media uploads + Media Uploads Hộp Thư Lưu về Ngoại Tuyến Ngoại tuyến @@ -267,7 +267,7 @@ Các Phiên Truyền Tải Trang Tài Khoản - Camera uploads + Camera Uploads @@ -692,6 +692,9 @@ Đang tải lên hình ảnh từ các thư mục chứa media Checking for files to be uploaded Initializing Camera Uploads + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Dùng WiFi và mạng di động Chỉ lúc dùng Wi-Fi - Tải lên Tệp Tin @@ -917,6 +919,7 @@ Bản ghi chép đã được bật Bản ghi chép đã được tắt + Unable to setup MEGA Camera Uploads folder Logs have not been enabled because you denied the required permissions Đi đến vị trí chứa tệp tin @@ -1541,6 +1544,8 @@ Xem tệp tin Chuyển nhập Lưu để dùng ngoại tuyến + Add to Cloud + Save to Offline Xem danh bạ @@ -1656,6 +1661,8 @@ Đang loại bỏ tên liên lạc khỏi mục chia sẻ Bỏ vào thùng rác? + Are you sure you want to move this folder to the Rubbish Bin? This will disable Camera Uploads. + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. Bỏ vào thùng rác? Xóa khỏi MEGA? Nếu rời khỏi thư mục này, bạn sẽ không bao giờ tìm lại được nữa. @@ -2287,7 +2294,6 @@ Lỗi khởi tạo chát phát sinh khi tải đường liên kết cuộc chát. - Bạn đang cố thử xem qua tổng quan của phòng chát mà bạn đã từng là thành viên. Bạn có muốn tham gia vào lại phòng chát hay không? Bạn đã là thành viên trong cuộc chát này. Phần xem tổng quan của phòng chát không còn tồn tại. Nếu bạn thoát ra, bạn sẽ không mở lại được nữa. @@ -2766,4 +2772,7 @@ Always save to this location? Attach from… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-vi/strings_karere_errors.xml b/app/src/main/res/values-vi/strings_karere_errors.xml new file mode 100644 index 00000000000..173f9218a33 --- /dev/null +++ b/app/src/main/res/values-vi/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + Không có lỗi + Thông số không hợp lệ + Truy cập bị từ chối + Resource does not exist. + Resource already exists. + Lỗi không xác định được + Too many uses for this resource. + diff --git a/app/src/main/res/values-vi/strings_sdk_errors.xml b/app/src/main/res/values-vi/strings_sdk_errors.xml new file mode 100644 index 00000000000..157c1c627ed --- /dev/null +++ b/app/src/main/res/values-vi/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + Không có lỗi + Nỗi nội bộ + Thông số không hợp lệ + Yêu cầu thất bại, đang thử lại + Đã vượt quá giới hạn + Thất bại hoàn toàn + Phát hiện vi phạm Điều Khoản Dịch Vụ + Quá nhiều kết nối/truyền tải cùng lúc + Quá kích thước + Hết + Không tìm thấy + Transfer failed due to a recursive directory structure + Phát hiện lỗi liên kết vòng lặp + Truy cập bị từ chối + Đã tồn tại sẵn + Chưa hoàn thoành + Khóa không hợp lệ/Lỗi giải mã + Bad session ID + Không truy cập được do vi phạm Điều Khoản Sử Dụng và Dịch Vụ + Bị chặn + Quá giới hạn + Tạm thời không khả dụng + Quá tải số lượng kết nối + Lỗi ghi tệp + Lỗi đọc tệp tin + Application key không hợp lệ + Xác thực SSL bị thất bại + Không đủ băng thông + Two-Factor Authentication required. + Access denied for users + Tài khoản doanh nghiệp của quý khách đã hết hạn + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + Lỗi không xác định được + HTTP Error + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 901bb5cbced..613f904ed3b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -249,7 +249,7 @@ 云盘 近期 - 多媒体文件上传 + 媒体上传 收件箱 保存为离线 离线 @@ -267,7 +267,7 @@ 传输 我的账号 - 相机上传 + 相机上传 @@ -692,6 +692,9 @@ 正在上传媒体文件夹中的文件 检查待上传的文件 正在初始化相机上传 + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi或移动数据 仅限Wi-Fi - 文件上传 @@ -917,6 +919,7 @@ 日志已启用 日志已关闭 + Unable to setup MEGA Camera Uploads folder 日志尚未启用,由于您未开启所需的权限 开启位置 @@ -1541,6 +1544,8 @@ 查看文件 输入 离线储存 + Add to Cloud + Save to Offline 查看联系人 @@ -1656,6 +1661,8 @@ 正删除该文件夹的共享联系人 要移至垃圾桶吗? + 您确定要将此文件夹移到“垃圾桶”吗?这将禁用相机上传功能。 + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. 要移至垃圾桶吗? 确定从MEGA删除吗? 离开此文件夹后将无法再次查看 @@ -2287,7 +2294,6 @@ 加载聊天链接时初始化聊天出错。 - 您正在预览之前的群聊记录。您想要再次加入聊天吗? 您已加入此聊天。 该聊天预览已不可用。退出预览后您无法再次打开。 @@ -2766,4 +2772,7 @@ 总是保存到此位置? 添加附件…… + Chat created on %s + Select message + diff --git a/app/src/main/res/values-zh-rCN/strings_karere_errors.xml b/app/src/main/res/values-zh-rCN/strings_karere_errors.xml new file mode 100644 index 00000000000..af62a60defd --- /dev/null +++ b/app/src/main/res/values-zh-rCN/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + 无误 + 无效参数 + 进入遭拒 + Resource does not exist. + Resource already exists. + 未知的错误 + Too many uses for this resource. + diff --git a/app/src/main/res/values-zh-rCN/strings_sdk_errors.xml b/app/src/main/res/values-zh-rCN/strings_sdk_errors.xml new file mode 100644 index 00000000000..b83e8f1efd4 --- /dev/null +++ b/app/src/main/res/values-zh-rCN/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + 无误 + 内部错误 + 无效参数 + 请求失败,重试中 + 超过速度限制 + 已失败 + 已违反服务条款 + 过多并行链接或传输 + 超出范围 + 已过期 + 未找到 + 递归目录结构时出现错误,传输失败 + 检测到循环连动SDK + 进入遭拒 + 已存在 + 未完成 + 无效金钥/解密错误 + 恶意session ID + 由于违反ToS服务条款或AUP可接受的使用政策而无法访问 + 封锁 + 超过额度 + 暂时无法取得 + 连接过量 + 写入错误 + 读取错误 + 无效应用程序金钥 + SSL验证失败 + 流量不足 + 需要双重验证。 + Access denied for users + 您的企业帐户已到期 + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + 未知的错误 + HTTP Error + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e9979b65dff..37cc8d75732 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -249,7 +249,7 @@ 雲端硬碟 近期的 - 媒體上傳 + 媒體上傳 收件夾 離線儲存 離線 @@ -267,7 +267,7 @@ 傳輸 我的帳號 - 相機上傳 + 相機上傳 @@ -692,6 +692,9 @@ 正在上傳媒體資料夾中的檔案 正在確認要上傳的檔案 初始化相機上傳 + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable. + @@ -762,7 +765,6 @@ Wi-Fi或行動網路 只在WiFi連線 - 檔案上傳 @@ -917,6 +919,7 @@ 日誌已啟用 日誌已關閉 + Unable to setup MEGA Camera Uploads folder 因為您拒絕所需要的權限,因此未啟用日誌功能。 開啟位置 @@ -1541,6 +1544,8 @@ 查看檔案 匯入 離線儲存 + Add to Cloud + Save to Offline 查看聯絡人 @@ -1656,6 +1661,8 @@ 刪除共享資料夾的聯絡人共享者 要移至垃圾桶嗎? + 您確定要將此資料夾移至垃圾筒嗎?這將會停用相機上傳。 + Are you sure you want to move this folder to the Rubbish Bin? This will disable Media Uploads. 要移至垃圾桶嗎? 確定從MEGA刪除嗎? 如果您離開此資料夾,您將無法再看到它。 @@ -1874,10 +1881,10 @@ 沒有檔案 %s B - %s KB - %s MB - %s GB - %s TB + %sKB + %sMB + %sGB + %sTB MB @@ -2046,10 +2053,10 @@ 寫訊息給“%s”… 寫訊息給“%s”… - 兩階段驗證功能 - 兩階段身份驗證是您帳戶的第二層安全保護。 - 為什麼需要兩階段安全驗證? - 兩階段身份驗證是您帳戶的第二層安全保護。這代表著,即使某人持有您的密碼,如果他無法知道只有您會有的六位碼,也無法登入您的帳戶。 + 雙重驗證 + 雙重驗證是您帳戶的第二層安全保護。 + 為什麼需要雙重驗證? + 雙重驗證是您帳戶的第二層安全保護。這代表著,即使某人持有您的密碼,如果他無法知道只有您會有的六位碼,也無法登入您的帳戶。 開始設定 掃描或複製種子到您的驗證器應用程式。 請務必將此種子備份於安全的地方,以防您的裝置遺失。 @@ -2057,30 +2064,30 @@ 確認 次一 生成種子或QR碼時出錯,請再試一次。 - 已啟用兩階段驗證 + 已啟用雙重驗證 下次登入您的帳戶時,系統會要求您輸入驗證程式提供的6位碼。 If you lose access to your account after enabling 2FA and you have not backed up your Recovery Key, MEGA can\'t help you gain access to it again.\n備份您的還原金鑰 無效的條碼 您的驗證設備不見了? 登入驗證 - 兩階段身份驗證\n更改密碼 - 兩階段身份驗證\n取消帳戶 - 兩階段身份驗證\n更改電子郵件地址 - 停用兩階段驗證 + 雙重驗證\n更改密碼 + 雙重驗證\n取消帳戶 + 雙重驗證\n更改電子郵件地址 + 停用雙重驗證 您的驗證設備不見了? - 嘗試停用兩階段身份驗證時發生錯誤。請再試一次。 - 嘗試啟用兩階段身份驗證時發生錯誤。請再試一次。 - 啟用兩階段驗證功能 - 已停用兩階段驗證 + 嘗試停用雙重驗證時發生錯誤。請再試一次。 + 嘗試啟用雙重驗證時發生錯誤。請再試一次。 + 啟用雙重驗證 + 已停用雙重驗證 開啟於 - 在您的設備上,沒有任何可用的應用程式可以用來啟用兩階段身份驗證 + 在您的設備上,沒有任何可用的應用程式可以用來啟用雙重驗證 關閉 匯出你的還原金鑰後就完成了 驗證器應用程式 您想開啟Google Play來安裝驗證程式嗎? 應用商店 - 您需要驗證用的應用程式才能在MEGA上啟用2FA認證。您在手機或平板電腦裡下載並安裝Google Authenticator、Duo Mobile,Authy或Microsoft Authenticator app。 + 您需要驗證用的應用程式才能在MEGA上啟用雙重驗證。您在手機或平板電腦裡下載並安裝Google Authenticator、Duo Mobile,Authy或Microsoft Authenticator app。 已成功分享%d個檔案 @@ -2287,7 +2294,6 @@ 當加載聊天連結初始化聊天時發生錯誤。 - 您正在嘗試預覽您之前身為當中一員的對談。你想再次加入對談嗎? 您已加入此對談。 此對談預覽已不再可用。如果您退出預覽,將無法再開啟它。 @@ -2766,4 +2772,7 @@ 總是儲存在此位置? 附加自⋯ + Chat created on %s + Select message + diff --git a/app/src/main/res/values-zh-rTW/strings_karere_errors.xml b/app/src/main/res/values-zh-rTW/strings_karere_errors.xml new file mode 100644 index 00000000000..3543a897bca --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_karere_errors.xml @@ -0,0 +1,10 @@ + + + 無誤 + 無效參數 + 進入遭拒 + 資源不存在。 + 資源已經存在。 + 未知的錯誤 + Too many uses for this resource. + diff --git a/app/src/main/res/values-zh-rTW/strings_sdk_errors.xml b/app/src/main/res/values-zh-rTW/strings_sdk_errors.xml new file mode 100644 index 00000000000..fd0468a8789 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_sdk_errors.xml @@ -0,0 +1,41 @@ + + + 無誤 + 內部錯誤 + 無效參數 + 請求失敗,重試中 + 超過速度限制 + 已失敗 + 已違反服務條款 + 過多併行連結或傳輸 + 超出範圍 + 過期 + 未找到 + 由於遞迴目錄結構,所以傳輸失敗 + 偵測到循環連動SDK + 進入遭拒 + 已存在 + 未完成 + 無效金鑰/解密錯誤 + 惡意session ID + 由於ToS/AUP違規而無法存取 + 封鎖 + 超過額度 + 暫時無法取得 + 連接過量 + 寫入錯誤 + 讀取錯誤 + 無效應用程式金鑰 + SSL驗證失敗 + 配額不足 + 需要雙重驗證。 + Access denied for users + 您的商業帳戶已過期 + Credit card rejected + Billing failed + Rejected by fraud protection + Too many requests + Balance error + 未知的錯誤 + HTTP Error + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b3bdcd793c..5e6f1d6d4ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -692,8 +692,8 @@ Uploading files of media folders Checking for files to be uploaded Initializing Camera Uploads - Camera Uploads has been disabled. Your local folder is unavailable. - Media Uploads has been disabled. Your local folder is unavailable. + Camera Uploads has been disabled. Your local folder is unavailable. + Media Uploads has been disabled. Your local folder is unavailable.