Support filter emoticons

This commit is contained in:
NekoInverter 2020-04-26 14:50:44 +08:00
parent b511d66c3c
commit 0ed8a8afc2
No known key found for this signature in database
GPG Key ID: 280D6CCCF95715F9
7 changed files with 111 additions and 13 deletions

View File

@ -364,6 +364,7 @@ public class MessagesController extends BaseController implements NotificationCe
public ArrayList<Integer> neverShow = new ArrayList<>();
public LongSparseArray<Integer> pinnedDialogs = new LongSparseArray<>();
public ArrayList<TLRPC.Dialog> dialogs = new ArrayList<>();
public String emoticon;
}
private DialogFilter sortingDialogFilter;

View File

@ -302,7 +302,7 @@ public class MessagesStorage extends BaseController {
database.executeFast("CREATE INDEX IF NOT EXISTS folder_id_idx_dialogs ON dialogs(folder_id);").stepThis().dispose();
database.executeFast("CREATE INDEX IF NOT EXISTS flags_idx_dialogs ON dialogs(flags);").stepThis().dispose();
database.executeFast("CREATE TABLE dialog_filter(id INTEGER PRIMARY KEY, ord INTEGER, unread_count INTEGER, flags INTEGER, title TEXT)").stepThis().dispose();
database.executeFast("CREATE TABLE dialog_filter_neko(id INTEGER PRIMARY KEY, ord INTEGER, unread_count INTEGER, flags INTEGER, title TEXT, emoticon TEXT)").stepThis().dispose();
database.executeFast("CREATE TABLE dialog_filter_ep(id INTEGER, peer INTEGER, PRIMARY KEY (id, peer))").stepThis().dispose();
database.executeFast("CREATE TABLE dialog_filter_pin_v2(id INTEGER, peer INTEGER, pin INTEGER, PRIMARY KEY (id, peer))").stepThis().dispose();
@ -418,6 +418,11 @@ public class MessagesStorage extends BaseController {
FileLog.e(e2);
}
}
try {
database.executeFast("CREATE TABLE IF NOT EXISTS dialog_filter_neko(id INTEGER PRIMARY KEY, ord INTEGER, unread_count INTEGER, flags INTEGER, title TEXT, emoticon TEXT)").stepThis().dispose();
} catch (Exception e) {
FileLog.e(e);
}
if (version < LAST_DB_VERSION) {
updateDbToLastVersion(version);
}
@ -1591,7 +1596,7 @@ public class MessagesStorage extends BaseController {
usersToLoad.add(getUserConfig().getClientUserId());
SQLiteCursor filtersCursor = database.queryFinalized("SELECT id, ord, unread_count, flags, title FROM dialog_filter WHERE 1");
SQLiteCursor filtersCursor = database.queryFinalized("SELECT id, ord, unread_count, flags, title, emoticon FROM dialog_filter_neko WHERE 1");
boolean updateCounters = false;
while (filtersCursor.next()) {
@ -1601,6 +1606,7 @@ public class MessagesStorage extends BaseController {
filter.pendingUnreadCount = filter.unreadCount = -1;//filtersCursor.intValue(2);
filter.flags = filtersCursor.intValue(3);
filter.name = filtersCursor.stringValue(4);
filter.emoticon = filtersCursor.stringValue(5);
dialogFilters.add(filter);
dialogFiltersMap.put(filter.id, filter);
filtersById.put(filter.id, filter);
@ -2058,12 +2064,17 @@ public class MessagesStorage extends BaseController {
dialogFiltersMap.put(filter.id, filter);
}
SQLitePreparedStatement state = database.executeFast("REPLACE INTO dialog_filter VALUES(?, ?, ?, ?, ?)");
SQLitePreparedStatement state = database.executeFast("REPLACE INTO dialog_filter_neko VALUES(?, ?, ?, ?, ?, ?)");
state.bindInteger(1, filter.id);
state.bindInteger(2, filter.order);
state.bindInteger(3, filter.unreadCount);
state.bindInteger(4, filter.flags);
state.bindString(5, filter.name);
if (filter.emoticon != null) {
state.bindString(6, filter.emoticon);
} else {
state.bindNull(6);
}
state.step();
state.dispose();
if (peers) {
@ -2164,6 +2175,10 @@ public class MessagesStorage extends BaseController {
changed = true;
filter.name = newFilter.title;
}
if (!TextUtils.equals(filter.emoticon, newFilter.emoticon)) {
changed = true;
filter.emoticon = newFilter.emoticon;
}
if (filter.flags != newFlags) {
filter.flags = newFlags;
changed = true;
@ -2310,6 +2325,7 @@ public class MessagesStorage extends BaseController {
filter.id = newFilter.id;
filter.flags = newFlags;
filter.name = newFilter.title;
filter.emoticon = newFilter.emoticon;
filter.pendingUnreadCount = -1;
for (int c = 0; c < 2; c++) {
if (c == 0) {
@ -2472,7 +2488,7 @@ public class MessagesStorage extends BaseController {
try {
dialogFilters.remove(filter);
dialogFiltersMap.remove(filter.id);
database.executeFast("DELETE FROM dialog_filter WHERE id = " + filter.id).stepThis().dispose();
database.executeFast("DELETE FROM dialog_filter_neko WHERE id = " + filter.id).stepThis().dispose();
database.executeFast("DELETE FROM dialog_filter_ep WHERE id = " + filter.id).stepThis().dispose();
database.executeFast("DELETE FROM dialog_filter_pin_v2 WHERE id = " + filter.id).stepThis().dispose();
} catch (Exception e) {
@ -2502,7 +2518,7 @@ public class MessagesStorage extends BaseController {
public void saveDialogFiltersOrderInternal() {
try {
SQLitePreparedStatement state = database.executeFast("UPDATE dialog_filter SET ord = ?, flags = ? WHERE id = ?");
SQLitePreparedStatement state = database.executeFast("UPDATE dialog_filter_neko SET ord = ?, flags = ? WHERE id = ?");
for (int a = 0, N = dialogFilters.size(); a < N ;a++) {
MessagesController.DialogFilter filter = dialogFilters.get(a);
state.requery();

View File

@ -2959,7 +2959,18 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
filterTabsView.removeTabs();
if (!NekoConfig.hideAllTab) filterTabsView.addTab(Integer.MAX_VALUE, LocaleController.getString("FilterAllChats", R.string.FilterAllChats));
for (int a = 0, N = filters.size(); a < N; a++) {
filterTabsView.addTab(a, filters.get(a).name);
MessagesController.DialogFilter dialogFilter = filters.get(a);
switch (NekoConfig.tabsTitleType) {
case NekoConfig.TITLE_TYPE_TEXT:
filterTabsView.addTab(a, dialogFilter.name);
break;
case NekoConfig.TITLE_TYPE_ICON:
filterTabsView.addTab(a, dialogFilter.emoticon != null ? dialogFilter.emoticon : "📂");
break;
case NekoConfig.TITLE_TYPE_MIX:
filterTabsView.addTab(a, dialogFilter.emoticon != null ? dialogFilter.emoticon + " " + dialogFilter.name : "📂 " + dialogFilter.name);
break;
}
}
id = filterTabsView.getCurrentTabId();
if (id >= 0) {

View File

@ -15,6 +15,10 @@ import org.telegram.messenger.SharedConfig;
@SuppressLint("ApplySharedPref")
public class NekoConfig {
public static final int TITLE_TYPE_TEXT = 0;
public static final int TITLE_TYPE_ICON = 1;
public static final int TITLE_TYPE_MIX = 2;
private static final Object sync = new Object();
public static boolean useIPv6 = false;
public static boolean showHiddenFeature = false;
@ -31,6 +35,7 @@ public class NekoConfig {
public static int mapPreviewProvider = 0;
public static float stickerSize = 14.0f;
public static int translationProvider = 1;
public static int tabsTitleType = TITLE_TYPE_TEXT;
public static boolean showAddToSavedMessages = true;
public static boolean showReport = false;
@ -108,6 +113,7 @@ public class NekoConfig {
editor.putInt("translationProvider", translationProvider);
editor.putInt("eventType", eventType);
editor.putInt("actionBarDecoration", actionBarDecoration);
editor.putInt("tabsTitleType", tabsTitleType);
editor.commit();
} catch (Exception e) {
FileLog.e(e);
@ -160,6 +166,7 @@ public class NekoConfig {
chatMessageAnimation = preferences.getBoolean("chatMessageAnimation", false);
rearVideoMessages = preferences.getBoolean("rearVideoMessages", false);
hideAllTab = preferences.getBoolean("hideAllTab", false);
tabsTitleType = preferences.getInt("tabsTitleType", TITLE_TYPE_TEXT);
configLoaded = true;
}
}
@ -470,4 +477,12 @@ public class NekoConfig {
editor.putBoolean("hideAllTab", hideAllTab);
editor.commit();
}
public static void setTabsTitleType(int type) {
tabsTitleType = type;
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("nekoconfig", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("tabsTitleType", tabsTitleType);
editor.commit();
}
}

View File

@ -85,6 +85,7 @@ public class NekoSettingsActivity extends BaseFragment {
private int stickerSizeRow;
private int translationProviderRow;
private int messageMenuRow;
private int tabsTitleTypeRow;
private int chat2Row;
private int settingsRow;
@ -537,6 +538,40 @@ public class NekoSettingsActivity extends BaseFragment {
((TextCheckCell) view).setChecked(NekoConfig.hideAllTab);
}
getNotificationCenter().postNotificationName(NotificationCenter.dialogFiltersUpdated);
} else if (position == tabsTitleTypeRow) {
ArrayList<String> arrayList = new ArrayList<>();
ArrayList<Integer> types = new ArrayList<>();
arrayList.add(LocaleController.getString("TabTitleTypeText", R.string.TabTitleTypeText));
types.add(NekoConfig.TITLE_TYPE_TEXT);
arrayList.add(LocaleController.getString("TabTitleTypeIcon", R.string.TabTitleTypeIcon));
types.add(NekoConfig.TITLE_TYPE_ICON);
arrayList.add(LocaleController.getString("TabTitleTypeMix", R.string.TabTitleTypeMix));
types.add(NekoConfig.TITLE_TYPE_MIX);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(LocaleController.getString("TabTitleType", R.string.TabTitleType));
builder.setMessage(LocaleController.getString("TabTitleTypeTip", R.string.TabTitleTypeTip));
final LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
builder.setView(linearLayout);
for (int a = 0; a < arrayList.size(); a++) {
RadioColorCell cell = new RadioColorCell(context);
cell.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0);
cell.setTag(a);
cell.setCheckColor(Theme.getColor(Theme.key_radioBackground), Theme.getColor(Theme.key_dialogRadioBackgroundChecked));
cell.setTextAndValue(arrayList.get(a), NekoConfig.tabsTitleType == types.get(a));
linearLayout.addView(cell);
cell.setOnClickListener(v -> {
Integer which = (Integer) v.getTag();
NekoConfig.setTabsTitleType(types.get(which));
listAdapter.notifyItemChanged(tabsTitleTypeRow);
getNotificationCenter().postNotificationName(NotificationCenter.dialogFiltersUpdated);
builder.getDismissRunnable().run();
});
}
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showDialog(builder.create());
}
});
@ -573,6 +608,7 @@ public class NekoSettingsActivity extends BaseFragment {
stickerSizeRow = rowCount++;
messageMenuRow = rowCount++;
translationProviderRow = rowCount++;
tabsTitleTypeRow = rowCount++;
chat2Row = rowCount++;
settingsRow = rowCount++;
hidePhoneRow = rowCount++;
@ -1027,7 +1063,21 @@ public class NekoSettingsActivity extends BaseFragment {
value = LocaleController.getString("ProviderLingocloud", R.string.ProviderLingocloud);
break;
}
textCell.setTextAndValue(LocaleController.getString("TranslationProvider", R.string.TranslationProvider), value, false);
textCell.setTextAndValue(LocaleController.getString("TranslationProvider", R.string.TranslationProvider), value, true);
} else if (position == tabsTitleTypeRow) {
String value;
switch (NekoConfig.tabsTitleType) {
case NekoConfig.TITLE_TYPE_TEXT:
value = LocaleController.getString("TabTitleTypeText", R.string.TabTitleTypeText);
break;
case NekoConfig.TITLE_TYPE_ICON:
value = LocaleController.getString("TabTitleTypeIcon", R.string.TabTitleTypeIcon);
break;
case NekoConfig.TITLE_TYPE_MIX:
default:
value = LocaleController.getString("TabTitleTypeMix", R.string.TabTitleTypeMix);
}
textCell.setTextAndValue(LocaleController.getString("TabTitleType", R.string.TabTitleType), value, false);
}
break;
}
@ -1123,7 +1173,7 @@ public class NekoSettingsActivity extends BaseFragment {
position == disablePhotoSideActionRow || position == unlimitedPinnedDialogsRow || position == openArchiveOnPullRow ||
position == experimentRow || position == hideKeyboardOnChatScrollRow || position == avatarAsDrawerBackgroundRow ||
position == showTabsOnForwardRow || position == chatMessageAnimationRow || position == rearVideoMessagesRow ||
position == hideAllTabRow;
position == hideAllTabRow || position == tabsTitleTypeRow;
}
@Override
@ -1168,7 +1218,8 @@ public class NekoSettingsActivity extends BaseFragment {
if (position == connection2Row || position == chat2Row || position == experiment2Row) {
return 1;
} else if (position == nameOrderRow || position == mapPreviewRow || position == stickerSizeRow || position == messageMenuRow ||
position == deleteAccountRow || position == translationProviderRow || position == eventTypeRow || position == actionBarDecorationRow) {
position == deleteAccountRow || position == translationProviderRow || position == eventTypeRow || position == actionBarDecorationRow ||
position == tabsTitleTypeRow) {
return 2;
} else if (position == ipv6Row || position == hidePhoneRow || position == inappCameraRow ||
position == transparentStatusBarRow || position == hideProxySponsorChannelRow ||

View File

@ -61,7 +61,6 @@
<string name="MessageDetails">Details</string>
<string name="ExportAsJson">Export as JSON</string>
<string name="Translate">Translate</string>
<string name="ServiceByGoogle">Translation service is provided by Google</string>
<string name="JoinedFormatted">joined %1$s</string>
<string name="JoinedDateFormatted">joined on %1$s</string>
<string name="DeleteAccount">Delete Telegram account</string>
@ -72,7 +71,7 @@
<string name="ProviderGoogleTranslateCN">Google Translate CN</string>
<string name="ProviderGoogleTranslateCNWeb">Google Translate CN (Web)</string>
<string name="ProviderBaiduFanyiWeb">Baidu Translate (Web)</string>
<string name="TranslateApiUnsupported">The translation provider you selected don\'t support your language</string>
<string name="TranslateApiUnsupported">The translation provider you selected don\'t support your language.</string>
<string name="ProviderLingocloud">Lingocloud</string>
<string name="UndoTranslate">Undo translate</string>
<string name="CopyDetails">Copy Details</string>
@ -91,5 +90,10 @@
<string name="ChatMessageAnimation">Animate new messages</string>
<string name="RearVideoMessages">Rear camera in Video Messages</string>
<string name="HideAllTab">Hide \"All Chats\" tab</string>
<string name="HideAllTabAbout">Press \"Back\" on home page to open it</string>
<string name="HideAllTabAbout">Press \"Back\" on home page to open it.</string>
<string name="TabTitleType">Show on tabs</string>
<string name="TabTitleTypeTip">Emoticons are cloud-synced by Telegram.</string>
<string name="TabTitleTypeText">Titles</string>
<string name="TabTitleTypeIcon">Emoticons</string>
<string name="TabTitleTypeMix">Emoticons with titles</string>
</resources>

View File

@ -6,7 +6,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0-beta04'
classpath 'com.android.tools.build:gradle:4.0.0-beta05'
classpath 'com.google.gms:google-services:4.3.3'
}
}