From 1196facc4d0b44d0df34a5cdc5ac2fe29827bb25 Mon Sep 17 00:00:00 2001 From: Nick <64551534+null-nick@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:07:33 +0100 Subject: [PATCH 1/7] Init --- .../challegram/navigation/DrawerController.java | 3 +++ .../java/org/thunderdog/challegram/telegram/Tdlib.java | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java index f65f6422ee..a5043ddac7 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java @@ -797,6 +797,9 @@ public boolean onLongClick (View v) { } }); } + } else if (itemId == R.id.btn_calls) { + tdlib.clearCallsHistory(); + UI.showToast("LONG_PRESS_TO_CLEAR_CALL_HISTORY", Toast.LENGTH_LONG); } return false; } diff --git a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java index f4d500d7c8..413f0b0e5a 100644 --- a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java +++ b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java @@ -10679,6 +10679,15 @@ public boolean canEditSlowMode (long chatId) { return false; } + public void clearCallsHistory () { + tdlib().send(new TdApi.DeleteAllCallMessages(true), (result, error) -> { + if (result != null) { + UI.showToast(String.format("%s",result), Toast.LENGTH_SHORT); + } else { + UI.showToast(String.format("%s", error), Toast.LENGTH_SHORT); + }}); + } + public boolean isBroadcastGroup (long chatId) { TdApi.Supergroup supergroup = chatToSupergroup(chatId); return supergroup != null && supergroup.isBroadcastGroup; From 62d0121b2e91cb98e7e7b37335ede9f19d876e56 Mon Sep 17 00:00:00 2001 From: Nick <64551534+null-nick@users.noreply.github.com> Date: Mon, 8 Jan 2024 03:41:33 +0100 Subject: [PATCH 2/7] update --- .../navigation/DrawerController.java | 19 +++++++++++++++++-- .../thunderdog/challegram/telegram/Tdlib.java | 4 ++-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java index a5043ddac7..8f4f6daf3c 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java @@ -785,6 +785,7 @@ public boolean onLongClick (View v) { if (item == null) { return false; } + android.util.Log.e("ITEM_ID", String.format("%s",item.getId())); final int itemId = item.getId(); if (itemId != R.id.account) { if (itemId == R.id.btn_addAccount) { @@ -798,8 +799,22 @@ public boolean onLongClick (View v) { }); } } else if (itemId == R.id.btn_calls) { - tdlib.clearCallsHistory(); - UI.showToast("LONG_PRESS_TO_CLEAR_CALL_HISTORY", Toast.LENGTH_LONG); + showSettings(new SettingsWrapBuilder(R.id.btn_delete) + .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) + .setRawItems( + new ListItem[]{ + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) + }) + .setIntDelegate((id, result) -> { + if (id == R.id.btn_delete) { + boolean value = result.get(R.id.btn_deleteAll) != 0; + UI.showToast(String.format("VALUE: %b", value), Toast.LENGTH_SHORT); + // TODO: Fix crash (tdlib.clearCallsHistory(value);) + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative) + ); } return false; } diff --git a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java index 413f0b0e5a..24e426a038 100644 --- a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java +++ b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java @@ -10679,8 +10679,8 @@ public boolean canEditSlowMode (long chatId) { return false; } - public void clearCallsHistory () { - tdlib().send(new TdApi.DeleteAllCallMessages(true), (result, error) -> { + public void clearCallsHistory (boolean revoke) { + tdlib().send(new TdApi.DeleteAllCallMessages(revoke), (result, error) -> { if (result != null) { UI.showToast(String.format("%s",result), Toast.LENGTH_SHORT); } else { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 41f12af399..459a2ee0cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5003,4 +5003,5 @@ Your account %1$s (%2$s) is now deleted from Telegram servers, and can no longer be restored.\n\nUsing the same phone number will create a new account. View once + Do you want to delete all recent calls? From 89a68ebbc3ca417f4e03640eba2c7daa8ec49fc1 Mon Sep 17 00:00:00 2001 From: Nick <64551534+null-nick@users.noreply.github.com> Date: Mon, 8 Jan 2024 17:25:00 +0100 Subject: [PATCH 3/7] update (todo: need to show the options) --- .../navigation/DrawerController.java | 37 ++++++++++--------- .../navigation/ViewPagerTopView.java | 29 ++++++++++++++- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java index 8f4f6daf3c..20e386387b 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java @@ -785,7 +785,6 @@ public boolean onLongClick (View v) { if (item == null) { return false; } - android.util.Log.e("ITEM_ID", String.format("%s",item.getId())); final int itemId = item.getId(); if (itemId != R.id.account) { if (itemId == R.id.btn_addAccount) { @@ -799,22 +798,7 @@ public boolean onLongClick (View v) { }); } } else if (itemId == R.id.btn_calls) { - showSettings(new SettingsWrapBuilder(R.id.btn_delete) - .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) - .setRawItems( - new ListItem[]{ - new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) - }) - .setIntDelegate((id, result) -> { - if (id == R.id.btn_delete) { - boolean value = result.get(R.id.btn_deleteAll) != 0; - UI.showToast(String.format("VALUE: %b", value), Toast.LENGTH_SHORT); - // TODO: Fix crash (tdlib.clearCallsHistory(value);) - } - }) - .setSaveStr(R.string.Delete) - .setSaveColorId(ColorId.textNegative) - ); + clearRecentCalls(); } return false; } @@ -826,6 +810,25 @@ public boolean onLongClick (View v) { return false; } + public void clearRecentCalls () { + showSettings(new SettingsWrapBuilder(R.id.btn_delete) + .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) + .setRawItems( + new ListItem[]{ + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) + }) + .setIntDelegate((id, result) -> { + if (id == R.id.btn_delete) { + boolean value = result.get(R.id.btn_deleteAll) != 0; + UI.showToast(String.format("VALUE: %b", value), Toast.LENGTH_SHORT); + // TODO: Fix crash (tdlib.clearCallsHistory(value);) + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative) + ); + } + @Override public void onClick (View v) { int viewId = v.getId(); diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java b/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java index d228dc6e2e..9577222431 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java @@ -27,6 +27,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.widget.Toast; import androidx.annotation.Dimension; import androidx.annotation.DrawableRes; @@ -36,6 +37,7 @@ import androidx.annotation.Nullable; import androidx.annotation.Px; +import org.thunderdog.challegram.R; import org.thunderdog.challegram.U; import org.thunderdog.challegram.component.sticker.TGStickerObj; import org.thunderdog.challegram.core.Lang; @@ -50,7 +52,10 @@ import org.thunderdog.challegram.tool.Drawables; import org.thunderdog.challegram.tool.Paints; import org.thunderdog.challegram.tool.Screen; +import org.thunderdog.challegram.tool.UI; import org.thunderdog.challegram.tool.Views; +import org.thunderdog.challegram.ui.ListItem; +import org.thunderdog.challegram.unsorted.Settings; import org.thunderdog.challegram.util.DrawableProvider; import org.thunderdog.challegram.util.text.Counter; import org.thunderdog.challegram.util.text.Text; @@ -350,15 +355,37 @@ private BackgroundView newBackgroundView (int i) { public boolean onLongClick (View v) { if (listener != null && v instanceof BackgroundView) { BackgroundView backgroundView = (BackgroundView) v; + int bgViewIndex = backgroundView.index; + if (!Settings.instance().chatFoldersEnabled() && bgViewIndex == 1) { + clearRecentCalls(); + } if (backgroundView.inSlideOff()) { return false; } backgroundView.cancelSlideOff(); - return listener.onPagerItemLongClick(backgroundView.index); + return listener.onPagerItemLongClick(bgViewIndex); } return false; } + public void clearRecentCalls () { + // TODO: show the settings + new SettingsWrapBuilder(R.id.btn_delete) + .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) + .setRawItems( + new ListItem[]{ + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) + }) + .setIntDelegate((id, result) -> { + if (id == R.id.btn_delete) { + boolean value = result.get(R.id.btn_deleteAll) != 0; + UI.showToast(String.format("VALUE: %b", value), Toast.LENGTH_SHORT); + // TODO: Fix crash (tdlib.clearCallsHistory(value);) + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative); + } private int totalWidth; public void setItems (String[] stringItems) { From 022de5fff3d2a42607837a2e7adfb08e3f1fbbea Mon Sep 17 00:00:00 2001 From: nick <64551534+null-nick@users.noreply.github.com> Date: Thu, 13 Mar 2025 01:03:53 +0100 Subject: [PATCH 4/7] implemented clear recent --- .../navigation/DrawerController.java | 11 ++-- .../navigation/ViewPagerTopView.java | 29 +-------- .../thunderdog/challegram/telegram/Tdlib.java | 22 +++++-- .../challegram/ui/CallListController.java | 60 ++++++++++++++++++- .../challegram/ui/MainController.java | 29 +++++++++ app/src/main/res/values/ids.xml | 4 ++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 116 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java index b5b370a6a2..3faab3f398 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java @@ -796,6 +796,7 @@ public boolean onLongClick (View v) { }); } else if (itemId == R.id.btn_calls) { clearRecentCalls(); + return true; } return false; } @@ -816,9 +817,11 @@ public void clearRecentCalls () { }) .setIntDelegate((id, result) -> { if (id == R.id.btn_delete) { - boolean value = result.get(R.id.btn_deleteAll) != 0; - UI.showToast(String.format("VALUE: %b", value), Toast.LENGTH_SHORT); - // TODO: Fix crash (tdlib.clearCallsHistory(value);) + context.currentTdlib().clearCallsHistory(result.get(R.id.btn_deleteAll) != 0, success -> { + if (success) { + UI.showToast(R.string.Done, Toast.LENGTH_SHORT); + } + }); } }) .setSaveStr(R.string.Delete) @@ -1458,4 +1461,4 @@ public static DrawerHolder create (Context context, int viewType, View.OnClickLi throw new IllegalArgumentException("viewType == " + viewType); } }*/ -} +} \ No newline at end of file diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java b/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java index e98f6264fa..4835822504 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/ViewPagerTopView.java @@ -35,7 +35,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; -import android.widget.Toast; import androidx.annotation.CheckResult; import androidx.annotation.Dimension; @@ -47,7 +46,6 @@ import androidx.annotation.Px; import androidx.core.view.ViewCompat; -import org.thunderdog.challegram.R; import org.thunderdog.challegram.BuildConfig; import org.thunderdog.challegram.U; import org.thunderdog.challegram.component.sticker.TGStickerObj; @@ -63,10 +61,7 @@ import org.thunderdog.challegram.tool.Drawables; import org.thunderdog.challegram.tool.Paints; import org.thunderdog.challegram.tool.Screen; -import org.thunderdog.challegram.tool.UI; import org.thunderdog.challegram.tool.Views; -import org.thunderdog.challegram.ui.ListItem; -import org.thunderdog.challegram.unsorted.Settings; import org.thunderdog.challegram.util.DrawableProvider; import org.thunderdog.challegram.util.text.Counter; import org.thunderdog.challegram.util.text.IconSpan; @@ -513,37 +508,15 @@ private BackgroundView newBackgroundView (int i) { public boolean onLongClick (View v) { if (listener != null && v instanceof BackgroundView) { BackgroundView backgroundView = (BackgroundView) v; - int bgViewIndex = backgroundView.index; - if (!Settings.instance().chatFoldersEnabled() && bgViewIndex == 1) { - clearRecentCalls(); - } if (backgroundView.inSlideOff()) { return false; } backgroundView.cancelSlideOff(); - return listener.onPagerItemLongClick(bgViewIndex); + return listener.onPagerItemLongClick(backgroundView.index); } return false; } - public void clearRecentCalls () { - // TODO: show the settings - new SettingsWrapBuilder(R.id.btn_delete) - .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) - .setRawItems( - new ListItem[]{ - new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) - }) - .setIntDelegate((id, result) -> { - if (id == R.id.btn_delete) { - boolean value = result.get(R.id.btn_deleteAll) != 0; - UI.showToast(String.format("VALUE: %b", value), Toast.LENGTH_SHORT); - // TODO: Fix crash (tdlib.clearCallsHistory(value);) - } - }) - .setSaveStr(R.string.Delete) - .setSaveColorId(ColorId.textNegative); - } private int totalWidth; private int maxStableWidth; diff --git a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java index 480534cc9a..2bb5fa0582 100644 --- a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java +++ b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java @@ -34,6 +34,7 @@ import androidx.collection.LongSparseArray; import androidx.collection.SparseArrayCompat; import androidx.core.os.CancellationSignal; +import androidx.core.util.Consumer; import androidx.core.util.Pair; import com.google.android.gms.tasks.Task; @@ -99,6 +100,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Queue; import java.util.Set; @@ -10701,13 +10703,21 @@ public boolean canEditSlowMode (long chatId) { return false; } - public void clearCallsHistory (boolean revoke) { - tdlib().send(new TdApi.DeleteAllCallMessages(revoke), (result, error) -> { - if (result != null) { - UI.showToast(String.format("%s",result), Toast.LENGTH_SHORT); + public void clearCallsHistory(boolean revoke, Consumer callback) { + var _TAG = "ClearCallsHistory"; + client().send(new TdApi.DeleteAllCallMessages(revoke), object -> { + if (object instanceof TdApi.Ok) { + Log.d(_TAG, "Call history cleared successfully." + (revoke ? " All call messages have been revoked." : "")); + callback.accept(true); + } else if (object instanceof TdApi.Error) { + TdApi.Error error = (TdApi.Error) object; + Log.e(_TAG, String.format(Locale.US, "Error clearing call history: Code %d, Message: %s", error.code, error.message)); + callback.accept(false); } else { - UI.showToast(String.format("%s", error), Toast.LENGTH_SHORT); - }}); + Log.w(_TAG, "Unexpected response from TDLib: " + object); + callback.accept(false); + } + }); } public boolean isBroadcastGroup (long chatId) { diff --git a/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java b/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java index 3ed303fe58..e33273cb49 100644 --- a/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java +++ b/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java @@ -16,7 +16,9 @@ import android.content.Context; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; @@ -33,6 +35,8 @@ import org.thunderdog.challegram.data.CallItem; import org.thunderdog.challegram.data.CallSection; import org.thunderdog.challegram.data.TGFoundChat; +import org.thunderdog.challegram.navigation.HeaderView; +import org.thunderdog.challegram.navigation.MoreDelegate; import org.thunderdog.challegram.navigation.SettingsWrapBuilder; import org.thunderdog.challegram.navigation.ViewController; import org.thunderdog.challegram.telegram.DateChangeListener; @@ -41,6 +45,7 @@ import org.thunderdog.challegram.telegram.TdlibOptionListener; import org.thunderdog.challegram.theme.ColorId; import org.thunderdog.challegram.tool.Screen; +import org.thunderdog.challegram.tool.UI; import org.thunderdog.challegram.tool.Views; import org.thunderdog.challegram.unsorted.Settings; import org.thunderdog.challegram.util.StringList; @@ -65,6 +70,7 @@ public class CallListController extends RecyclerViewController implements View.OnClickListener, Client.ResultHandler, MessageListener, + MoreDelegate, DateChangeListener, View.OnLongClickListener, BaseView.ActionListProvider, TdlibOptionListener { @@ -82,6 +88,56 @@ public CharSequence getName () { return Lang.getString(R.string.Calls); } + @Override + protected int getMenuId () { + return messages != null && !messages.isEmpty() ? R.id.menu_btn_more : 0; + } + + @Override + public void fillMenuItems (int id, HeaderView header, LinearLayout menu) { + if (id == R.id.menu_btn_more) { + header.addMoreButton(menu, this); + } + } + + @Override + public void onMenuItemPressed (int id, View view) { + if (id == R.id.menu_btn_more) { + showMore(new int[] {R.id.btn_clear_recent_calls}, new String[] {Lang.getString(R.string.ClearRecentCalls)}); + } + } + + @Override + public void onMoreItemPressed (int id) { + if (id == R.id.btn_clear_recent_calls) { + showClearCallsConfirmationDialog(); + } + } + + public boolean hasRecentCalls() { + return messages != null && !messages.isEmpty(); + } + + private void showClearCallsConfirmationDialog() { + showSettings(new SettingsWrapBuilder(R.id.btn_delete) + .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) + .setRawItems(new ListItem[] { + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) + }) + .setIntDelegate((_id, result) -> { + if (_id == R.id.btn_delete) { + context.currentTdlib().clearCallsHistory(result.get(R.id.btn_deleteAll) != 0, success -> { + if (success) { + UI.showToast(R.string.Done, Toast.LENGTH_SHORT); + } + }); + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative) + ); + } + private SettingsAdapter adapter; @Override @@ -279,7 +335,7 @@ private ListItem newPeopleItem () { } private void removeTopChat (final TGFoundChat chat) { - showOptions(Lang.getStringBold(R.string.ChatHintsDelete, chat.getTitle()), new int[]{R.id.btn_delete, R.id.btn_cancel}, new String[]{Lang.getString(R.string.Delete), Lang.getString(R.string.Cancel)}, new int[]{OptionColor.RED, OptionColor.NORMAL}, new int[]{R.drawable.baseline_delete_sweep_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { + showOptions(Lang.getStringBold(R.string.ChatHintsDelete, chat.getTitle()), new int[] {R.id.btn_delete, R.id.btn_cancel}, new String[] {Lang.getString(R.string.Delete), Lang.getString(R.string.Cancel)}, new int[] {OptionColor.RED, OptionColor.NORMAL}, new int[] {R.drawable.baseline_delete_sweep_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { if (id == R.id.btn_delete) { tdlib.client().send(new TdApi.RemoveTopChat(new TdApi.TopChatCategoryCalls(), chat.getChatId()), tdlib.okHandler()); if (hasTopChats()) { @@ -617,7 +673,7 @@ public boolean onLongClick (View v) { final long chatId = call.getChatId(); final long[] messageIdsToDelete = call.getMessageIds(); if (messageIdsToDelete != null) { - showOptions(null, new int[]{R.id.btn_deleteAll, R.id.btn_openChat, R.id.btn_cancel}, new String[]{Lang.getString(R.string.DeleteEntry), Lang.getString(R.string.OpenChat), Lang.getString(R.string.Cancel)}, new int[]{OptionColor.RED, OptionColor.NORMAL, OptionColor.NORMAL}, new int[]{R.drawable.baseline_delete_sweep_24, R.drawable.baseline_chat_bubble_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { + showOptions(null, new int[] {R.id.btn_deleteAll, R.id.btn_openChat, R.id.btn_cancel}, new String[] {Lang.getString(R.string.DeleteEntry), Lang.getString(R.string.OpenChat), Lang.getString(R.string.Cancel)}, new int[] {OptionColor.RED, OptionColor.NORMAL, OptionColor.NORMAL}, new int[] {R.drawable.baseline_delete_sweep_24, R.drawable.baseline_chat_bubble_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { if (id == R.id.btn_deleteAll) { tdlib.deleteMessages(chatId, messageIdsToDelete, false); } else if (id == R.id.btn_openChat) { diff --git a/app/src/main/java/org/thunderdog/challegram/ui/MainController.java b/app/src/main/java/org/thunderdog/challegram/ui/MainController.java index c8d48a8793..cee7fd851b 100644 --- a/app/src/main/java/org/thunderdog/challegram/ui/MainController.java +++ b/app/src/main/java/org/thunderdog/challegram/ui/MainController.java @@ -1455,10 +1455,39 @@ public boolean onPagerItemLongClick (int index) { TdApi.ChatList chatList = pagerChatLists.get(index); showChatListOptions(chatList); return true; + } else if (index == POSITION_CALLS) { + ViewController controller = getCachedControllerForPosition(index); + if (controller instanceof CallListController) { + CallListController callListController = (CallListController) controller; + if (callListController.hasRecentCalls()) { + showClearCallsConfirmationDialog(); + return true; + } + } } return false; } + private void showClearCallsConfirmationDialog() { + showSettings(new SettingsWrapBuilder(R.id.btn_delete) + .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) + .setRawItems(new ListItem[] { + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) + }) + .setIntDelegate((_id, result) -> { + if (_id == R.id.btn_delete) { + context.currentTdlib().clearCallsHistory(result.get(R.id.btn_deleteAll) != 0, success -> { + if (success) { + UI.showToast(R.string.Done, Toast.LENGTH_SHORT); + } + }); + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative) + ); + } + private ChatsController newChatsController (TdApi.ChatList chatList, @Filter int filter) { ChatsController chats = new ChatsController(this.context, tdlib).setParent(this); ChatFilter chatFilter; diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 97cfeb9b7f..5bd5109c0e 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1410,4 +1410,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c763273d36..dc287ea3ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5568,4 +5568,5 @@ %1$s monthly users Do you want to delete all recent calls? + Clear recent calls From 2da5fc650154a3df335fff25f20b74838c994936 Mon Sep 17 00:00:00 2001 From: nick <64551534+null-nick@users.noreply.github.com> Date: Thu, 13 Mar 2025 01:08:38 +0100 Subject: [PATCH 5/7] fixed broken indent --- .../java/org/thunderdog/challegram/ui/CallListController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java b/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java index e33273cb49..985ed466f8 100644 --- a/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java +++ b/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java @@ -335,7 +335,7 @@ private ListItem newPeopleItem () { } private void removeTopChat (final TGFoundChat chat) { - showOptions(Lang.getStringBold(R.string.ChatHintsDelete, chat.getTitle()), new int[] {R.id.btn_delete, R.id.btn_cancel}, new String[] {Lang.getString(R.string.Delete), Lang.getString(R.string.Cancel)}, new int[] {OptionColor.RED, OptionColor.NORMAL}, new int[] {R.drawable.baseline_delete_sweep_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { + showOptions(Lang.getStringBold(R.string.ChatHintsDelete, chat.getTitle()), new int[]{R.id.btn_delete, R.id.btn_cancel}, new String[]{Lang.getString(R.string.Delete), Lang.getString(R.string.Cancel)}, new int[]{OptionColor.RED, OptionColor.NORMAL}, new int[]{R.drawable.baseline_delete_sweep_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { if (id == R.id.btn_delete) { tdlib.client().send(new TdApi.RemoveTopChat(new TdApi.TopChatCategoryCalls(), chat.getChatId()), tdlib.okHandler()); if (hasTopChats()) { @@ -673,7 +673,7 @@ public boolean onLongClick (View v) { final long chatId = call.getChatId(); final long[] messageIdsToDelete = call.getMessageIds(); if (messageIdsToDelete != null) { - showOptions(null, new int[] {R.id.btn_deleteAll, R.id.btn_openChat, R.id.btn_cancel}, new String[] {Lang.getString(R.string.DeleteEntry), Lang.getString(R.string.OpenChat), Lang.getString(R.string.Cancel)}, new int[] {OptionColor.RED, OptionColor.NORMAL, OptionColor.NORMAL}, new int[] {R.drawable.baseline_delete_sweep_24, R.drawable.baseline_chat_bubble_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { + showOptions(null, new int[]{R.id.btn_deleteAll, R.id.btn_openChat, R.id.btn_cancel}, new String[]{Lang.getString(R.string.DeleteEntry), Lang.getString(R.string.OpenChat), Lang.getString(R.string.Cancel)}, new int[]{OptionColor.RED, OptionColor.NORMAL, OptionColor.NORMAL}, new int[]{R.drawable.baseline_delete_sweep_24, R.drawable.baseline_chat_bubble_24, R.drawable.baseline_cancel_24}, (itemView, id) -> { if (id == R.id.btn_deleteAll) { tdlib.deleteMessages(chatId, messageIdsToDelete, false); } else if (id == R.id.btn_openChat) { From f833580e22e5a4278724048784b330891f5c8c6f Mon Sep 17 00:00:00 2001 From: "nick." <64551534+null-nick@users.noreply.github.com> Date: Sun, 31 May 2026 15:00:24 +0200 Subject: [PATCH 6/7] Deduplicate clear call history confirmation into `TdlibUi` --- .../navigation/DrawerController.java | 25 ++-------------- .../thunderdog/challegram/telegram/Tdlib.java | 19 ++---------- .../challegram/telegram/TdlibUi.java | 18 ++++++++++++ .../challegram/ui/CallListController.java | 26 ++--------------- .../challegram/ui/MainController.java | 29 ++----------------- app/src/main/res/values/ids.xml | 3 +- 6 files changed, 28 insertions(+), 92 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java index 8a73f72bfb..4e551ac864 100644 --- a/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java +++ b/app/src/main/java/org/thunderdog/challegram/navigation/DrawerController.java @@ -819,7 +819,7 @@ public boolean onLongClick (View v) { } }); } else if (itemId == R.id.btn_calls) { - clearRecentCalls(); + context.currentTdlib().ui().showClearCallHistoryOptions(this); return true; } return false; @@ -832,27 +832,6 @@ public boolean onLongClick (View v) { return false; } - public void clearRecentCalls () { - showSettings(new SettingsWrapBuilder(R.id.btn_delete) - .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) - .setRawItems( - new ListItem[]{ - new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) - }) - .setIntDelegate((id, result) -> { - if (id == R.id.btn_delete) { - context.currentTdlib().clearCallsHistory(result.get(R.id.btn_deleteAll) != 0, success -> { - if (success) { - UI.showToast(R.string.Done, Toast.LENGTH_SHORT); - } - }); - } - }) - .setSaveStr(R.string.Delete) - .setSaveColorId(ColorId.textNegative) - ); - } - @Override public void onClick (View v) { int viewId = v.getId(); @@ -1525,4 +1504,4 @@ public static DrawerHolder create (Context context, int viewType, View.OnClickLi throw new IllegalArgumentException("viewType == " + viewType); } }*/ -} \ No newline at end of file +} diff --git a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java index d211ee8952..dbae291599 100644 --- a/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java +++ b/app/src/main/java/org/thunderdog/challegram/telegram/Tdlib.java @@ -34,7 +34,6 @@ import androidx.collection.LongSparseArray; import androidx.collection.SparseArrayCompat; import androidx.core.os.CancellationSignal; -import androidx.core.util.Consumer; import androidx.core.util.Pair; import com.google.android.gms.tasks.Task; @@ -100,7 +99,6 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Queue; import java.util.Set; @@ -10944,21 +10942,8 @@ public boolean canEditSlowMode (long chatId) { return false; } - public void clearCallsHistory(boolean revoke, Consumer callback) { - var _TAG = "ClearCallsHistory"; - client().send(new TdApi.DeleteAllCallMessages(revoke), object -> { - if (object instanceof TdApi.Ok) { - Log.d(_TAG, "Call history cleared successfully." + (revoke ? " All call messages have been revoked." : "")); - callback.accept(true); - } else if (object instanceof TdApi.Error) { - TdApi.Error error = (TdApi.Error) object; - Log.e(_TAG, String.format(Locale.US, "Error clearing call history: Code %d, Message: %s", error.code, error.message)); - callback.accept(false); - } else { - Log.w(_TAG, "Unexpected response from TDLib: " + object); - callback.accept(false); - } - }); + public void clearCallsHistory (boolean revoke, @Nullable Runnable after) { + send(new TdApi.DeleteAllCallMessages(revoke), okHandler(after)); } public boolean isBroadcastGroup (long chatId) { diff --git a/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java b/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java index 6bcaffb7b0..948a871464 100644 --- a/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java +++ b/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java @@ -595,6 +595,24 @@ public void showDeleteOptions (ViewController context, MessageWithProperties showDeleteOptions(context, new MessageWithProperties[] {message}, null); } + public void showClearCallHistoryOptions (ViewController context) { + context.showSettings(new SettingsWrapBuilder(R.id.btn_delete) + .addHeaderItem(Lang.getString(R.string.AreYouSureClearCalls)) + .setRawItems(new ListItem[] { + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) + }) + .setIntDelegate((id, result) -> { + if (id == R.id.btn_delete) { + boolean revoke = result.get(R.id.btn_deleteAll) != 0; + tdlib.clearCallsHistory(revoke, () -> + UI.showToast(R.string.Done, Toast.LENGTH_SHORT) + ); + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative)); + } + public void showDeleteOptions (final ViewController context, final MessageWithProperties[] messages, final @Nullable Runnable after) { if (context != null && messages != null && messages.length > 0) { if (deleteSuperGroupMessages(context, messages, after)) { diff --git a/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java b/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java index 91bc057964..da79db929f 100644 --- a/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java +++ b/app/src/main/java/org/thunderdog/challegram/ui/CallListController.java @@ -18,7 +18,6 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; @@ -45,7 +44,6 @@ import org.thunderdog.challegram.telegram.TdlibOptionListener; import org.thunderdog.challegram.theme.ColorId; import org.thunderdog.challegram.tool.Screen; -import org.thunderdog.challegram.tool.UI; import org.thunderdog.challegram.tool.Views; import org.thunderdog.challegram.unsorted.Settings; import org.thunderdog.challegram.util.StringList; @@ -111,34 +109,14 @@ public void onMenuItemPressed (int id, View view) { @Override public void onMoreItemPressed (int id) { if (id == R.id.btn_clear_recent_calls) { - showClearCallsConfirmationDialog(); + tdlib.ui().showClearCallHistoryOptions(this); } } - public boolean hasRecentCalls() { + public boolean hasRecentCalls () { return messages != null && !messages.isEmpty(); } - private void showClearCallsConfirmationDialog() { - showSettings(new SettingsWrapBuilder(R.id.btn_delete) - .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) - .setRawItems(new ListItem[] { - new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) - }) - .setIntDelegate((_id, result) -> { - if (_id == R.id.btn_delete) { - context.currentTdlib().clearCallsHistory(result.get(R.id.btn_deleteAll) != 0, success -> { - if (success) { - UI.showToast(R.string.Done, Toast.LENGTH_SHORT); - } - }); - } - }) - .setSaveStr(R.string.Delete) - .setSaveColorId(ColorId.textNegative) - ); - } - private SettingsAdapter adapter; @Override diff --git a/app/src/main/java/org/thunderdog/challegram/ui/MainController.java b/app/src/main/java/org/thunderdog/challegram/ui/MainController.java index 06085ceae5..d713b3e4e8 100644 --- a/app/src/main/java/org/thunderdog/challegram/ui/MainController.java +++ b/app/src/main/java/org/thunderdog/challegram/ui/MainController.java @@ -1484,37 +1484,14 @@ public boolean onPagerItemLongClick (int index) { return true; } else if (index == POSITION_CALLS) { ViewController controller = getCachedControllerForPosition(index); - if (controller instanceof CallListController) { - CallListController callListController = (CallListController) controller; - if (callListController.hasRecentCalls()) { - showClearCallsConfirmationDialog(); - return true; - } + if (controller instanceof CallListController && ((CallListController) controller).hasRecentCalls()) { + tdlib.ui().showClearCallHistoryOptions(this); + return true; } } return false; } - private void showClearCallsConfirmationDialog() { - showSettings(new SettingsWrapBuilder(R.id.btn_delete) - .setHeaderItem(new ListItem(ListItem.TYPE_INFO, R.id.text_title, 0, R.string.AreYouSureClearCalls, false)) - .setRawItems(new ListItem[] { - new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) - }) - .setIntDelegate((_id, result) -> { - if (_id == R.id.btn_delete) { - context.currentTdlib().clearCallsHistory(result.get(R.id.btn_deleteAll) != 0, success -> { - if (success) { - UI.showToast(R.string.Done, Toast.LENGTH_SHORT); - } - }); - } - }) - .setSaveStr(R.string.Delete) - .setSaveColorId(ColorId.textNegative) - ); - } - private ChatsController newChatsController (TdApi.ChatList chatList, @Filter int filter) { ChatsController chats = new ChatsController(this.context, tdlib).setParent(this); ChatFilter chatFilter; diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index a0ffcf09b8..cb92d0290f 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1416,7 +1416,6 @@ - - \ No newline at end of file + From 9ca3666cce6afb5d2fd562976689b2c7c7229436 Mon Sep 17 00:00:00 2001 From: "nick." <64551534+null-nick@users.noreply.github.com> Date: Sun, 12 Jul 2026 23:46:42 +0200 Subject: [PATCH 7/7] Skip clear-calls-history dialog when there are no recent calls --- .../challegram/telegram/TdlibUi.java | 37 +++++++++++-------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java b/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java index 3a67c910c3..9ed61a32bc 100644 --- a/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java +++ b/app/src/main/java/org/thunderdog/challegram/telegram/TdlibUi.java @@ -596,21 +596,28 @@ public void showDeleteOptions (ViewController context, MessageWithProperties } public void showClearCallHistoryOptions (ViewController context) { - context.showSettings(new SettingsWrapBuilder(R.id.btn_delete) - .addHeaderItem(Lang.getString(R.string.AreYouSureClearCalls)) - .setRawItems(new ListItem[] { - new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteForEveryone, false) - }) - .setIntDelegate((id, result) -> { - if (id == R.id.btn_delete) { - boolean revoke = result.get(R.id.btn_deleteAll) != 0; - tdlib.clearCallsHistory(revoke, () -> - UI.showToast(R.string.Done, Toast.LENGTH_SHORT) - ); - } - }) - .setSaveStr(R.string.Delete) - .setSaveColorId(ColorId.textNegative)); + tdlib.send(new TdApi.SearchCallMessages("", 1, false), (result, error) -> { + if (error != null || result.messages.length == 0) { + return; + } + context.runOnUiThreadOptional(() -> + context.showSettings(new SettingsWrapBuilder(R.id.btn_delete) + .addHeaderItem(Lang.getString(R.string.AreYouSureClearCalls)) + .setRawItems(new ListItem[] { + new ListItem(ListItem.TYPE_CHECKBOX_OPTION, R.id.btn_deleteAll, 0, R.string.DeleteCallsForEveryone, false) + }) + .setIntDelegate((id, result2) -> { + if (id == R.id.btn_delete) { + boolean revoke = result2.get(R.id.btn_deleteAll) != 0; + tdlib.clearCallsHistory(revoke, () -> + UI.showToast(R.string.Done, Toast.LENGTH_SHORT) + ); + } + }) + .setSaveStr(R.string.Delete) + .setSaveColorId(ColorId.textNegative)) + ); + }); } public void showDeleteOptions (final ViewController context, final MessageWithProperties[] messages, final @Nullable Runnable after) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9f34fbb85..a203a5956d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5724,6 +5724,7 @@ Do you want to delete all recent calls? Clear recent calls + Delete for everyone Restricted Content Sensitive Content