added Compatibility sections in each screen and moved each option where it belongs, instead of keeping them all on the Initial Setup screen
This commit is contained in:
parent
72a26c920d
commit
2760a30af2
13 changed files with 97 additions and 106 deletions
|
|
@ -8,7 +8,7 @@ import java.util.LinkedHashMap;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.util.Logger;
|
import io.github.sspanak.tt9.util.Logger;
|
||||||
|
|
||||||
public class ItemDropDown {
|
abstract public class ItemDropDown {
|
||||||
private final DropDownPreference item;
|
private final DropDownPreference item;
|
||||||
private LinkedHashMap<String, String> values;
|
private LinkedHashMap<String, String> values;
|
||||||
|
|
||||||
|
|
@ -27,6 +27,8 @@ public class ItemDropDown {
|
||||||
populate(stringifiedValues);
|
populate(stringifiedValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract public ItemDropDown populate();
|
||||||
|
|
||||||
protected void populate(LinkedHashMap<String, String> values) {
|
protected void populate(LinkedHashMap<String, String> values) {
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
Logger.w("ItemDropDown.populate", "Cannot populate a NULL item. Ignoring.");
|
Logger.w("ItemDropDown.populate", "Cannot populate a NULL item. Ignoring.");
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ package io.github.sspanak.tt9.preferences.screens.appearance;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.R;
|
import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
||||||
|
import io.github.sspanak.tt9.preferences.items.ItemDropDown;
|
||||||
|
import io.github.sspanak.tt9.preferences.items.ItemSwitch;
|
||||||
import io.github.sspanak.tt9.preferences.screens.BaseScreenFragment;
|
import io.github.sspanak.tt9.preferences.screens.BaseScreenFragment;
|
||||||
|
|
||||||
public class AppearanceScreen extends BaseScreenFragment {
|
public class AppearanceScreen extends BaseScreenFragment {
|
||||||
|
|
@ -15,32 +17,34 @@ public class AppearanceScreen extends BaseScreenFragment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate() {
|
protected void onCreate() {
|
||||||
(new ItemSelectTheme(activity, findPreference(ItemSelectTheme.NAME)))
|
createMainSection();
|
||||||
.populate()
|
createHacksSection();
|
||||||
.preview()
|
|
||||||
.enableClickHandler();
|
|
||||||
|
|
||||||
(new ItemSelectLayoutType(activity, findPreference(ItemSelectLayoutType.NAME)))
|
|
||||||
.populate()
|
|
||||||
.preview()
|
|
||||||
.enableClickHandler();
|
|
||||||
|
|
||||||
(new ItemStatusIcon(findPreference(ItemStatusIcon.NAME), activity.getSettings())).populate();
|
|
||||||
|
|
||||||
(new ItemSelectSettingsFontSize(findPreference(ItemSelectSettingsFontSize.NAME), this))
|
|
||||||
.populate()
|
|
||||||
.preview()
|
|
||||||
.enableClickHandler();
|
|
||||||
|
|
||||||
(new ItemCandidatesView(findPreference(ItemCandidatesView.NAME), activity.getSettings()))
|
|
||||||
.populate()
|
|
||||||
.enableClickHandler();
|
|
||||||
|
|
||||||
(new ItemClearInsets(findPreference(ItemClearInsets.NAME), activity.getSettings()))
|
|
||||||
.populate()
|
|
||||||
.enableClickHandler();
|
|
||||||
|
|
||||||
|
|
||||||
resetFontSize(true);
|
resetFontSize(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createMainSection() {
|
||||||
|
(new ItemStatusIcon(findPreference(ItemStatusIcon.NAME), activity.getSettings())).populate();
|
||||||
|
|
||||||
|
ItemDropDown[] items = {
|
||||||
|
new ItemSelectTheme(findPreference(ItemSelectTheme.NAME), activity),
|
||||||
|
new ItemSelectLayoutType(findPreference(ItemSelectLayoutType.NAME), activity),
|
||||||
|
new ItemSelectSettingsFontSize(findPreference(ItemSelectSettingsFontSize.NAME), this)
|
||||||
|
};
|
||||||
|
|
||||||
|
for (ItemDropDown item : items) {
|
||||||
|
item.populate().preview().enableClickHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createHacksSection() {
|
||||||
|
ItemSwitch[] items = {
|
||||||
|
new ItemAlternativeSuggestionScrolling(findPreference(ItemAlternativeSuggestionScrolling.NAME), activity.getSettings()),
|
||||||
|
new ItemCandidatesView(findPreference(ItemCandidatesView.NAME), activity.getSettings()),
|
||||||
|
new ItemClearInsets(findPreference(ItemClearInsets.NAME), activity.getSettings())
|
||||||
|
};
|
||||||
|
|
||||||
|
for (ItemSwitch item : items) {
|
||||||
|
item.populate().enableClickHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package io.github.sspanak.tt9.preferences.screens.appearance;
|
||||||
|
|
||||||
|
import androidx.preference.SwitchPreferenceCompat;
|
||||||
|
|
||||||
|
import io.github.sspanak.tt9.preferences.items.ItemSwitch;
|
||||||
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
|
|
||||||
|
public class ItemAlternativeSuggestionScrolling extends ItemSwitch {
|
||||||
|
public static final String NAME = "pref_alternative_suggestion_scrolling";
|
||||||
|
|
||||||
|
private final SettingsStore settings;
|
||||||
|
|
||||||
|
public ItemAlternativeSuggestionScrolling(SwitchPreferenceCompat item, SettingsStore settings) {
|
||||||
|
super(item);
|
||||||
|
this.settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean getDefaultValue() {
|
||||||
|
return settings.getSuggestionScrollingDelay() > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,8 +14,7 @@ public class ItemSelectLayoutType extends ItemDropDown {
|
||||||
|
|
||||||
private final PreferencesActivity activity;
|
private final PreferencesActivity activity;
|
||||||
|
|
||||||
public ItemSelectLayoutType(PreferencesActivity activity, DropDownPreference item) {
|
public ItemSelectLayoutType(DropDownPreference item, PreferencesActivity activity) {
|
||||||
|
|
||||||
super(item);
|
super(item);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ class ItemSelectTheme extends ItemDropDown {
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
ItemSelectTheme(Context context, DropDownPreference item) {
|
ItemSelectTheme(DropDownPreference item, Context context) {
|
||||||
super(item);
|
super(item);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.github.sspanak.tt9.preferences.screens.setup;
|
package io.github.sspanak.tt9.preferences.screens.keypad;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
|
|
@ -7,27 +7,30 @@ import androidx.preference.DropDownPreference;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.R;
|
import io.github.sspanak.tt9.R;
|
||||||
|
import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
||||||
import io.github.sspanak.tt9.preferences.items.ItemDropDown;
|
import io.github.sspanak.tt9.preferences.items.ItemDropDown;
|
||||||
|
|
||||||
class ItemKeyPadDebounceTime extends ItemDropDown {
|
class ItemKeyPadDebounceTime extends ItemDropDown {
|
||||||
public static final String NAME = "pref_key_pad_debounce_time";
|
public static final String NAME = "pref_key_pad_debounce_time";
|
||||||
|
|
||||||
private final Context context;
|
private final PreferencesActivity activity;
|
||||||
|
|
||||||
ItemKeyPadDebounceTime(Context context, DropDownPreference item) {
|
ItemKeyPadDebounceTime(DropDownPreference item, PreferencesActivity activity) {
|
||||||
super(item);
|
super(item);
|
||||||
this.context = context;
|
this.activity = activity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemDropDown populate() {
|
public ItemDropDown populate() {
|
||||||
LinkedHashMap<String, String> dropDownOptions = new LinkedHashMap<>();
|
LinkedHashMap<String, String> dropDownOptions = new LinkedHashMap<>();
|
||||||
dropDownOptions.put("0", context.getString(R.string.pref_hack_key_pad_debounce_off));
|
dropDownOptions.put("0", activity.getString(R.string.pref_hack_key_pad_debounce_off));
|
||||||
|
|
||||||
String[] values = new String[] { "20", "30", "50", "75", "100", "150", "250", "350" };
|
String[] values = new String[] { "20", "30", "50", "75", "100", "150", "250", "350" };
|
||||||
for (String value : values) {
|
for (String value : values) {
|
||||||
dropDownOptions.put(value, value + " ms");
|
dropDownOptions.put(value, value + " ms");
|
||||||
}
|
}
|
||||||
|
|
||||||
super.populate(dropDownOptions);
|
super.populate(dropDownOptions);
|
||||||
|
super.setValue(String.valueOf(activity.getSettings().getKeyPadDebounceTime()));
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,7 @@ package io.github.sspanak.tt9.preferences.screens.keypad;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.R;
|
import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
import io.github.sspanak.tt9.preferences.PreferencesActivity;
|
||||||
|
import io.github.sspanak.tt9.preferences.items.ItemDropDown;
|
||||||
import io.github.sspanak.tt9.preferences.screens.BaseScreenFragment;
|
import io.github.sspanak.tt9.preferences.screens.BaseScreenFragment;
|
||||||
|
|
||||||
public class KeyPadScreen extends BaseScreenFragment {
|
public class KeyPadScreen extends BaseScreenFragment {
|
||||||
|
|
@ -15,15 +16,15 @@ public class KeyPadScreen extends BaseScreenFragment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate() {
|
protected void onCreate() {
|
||||||
(new ItemSelectZeroKeyCharacter(findPreference(ItemSelectZeroKeyCharacter.NAME), activity))
|
ItemDropDown[] items = {
|
||||||
.populate()
|
new ItemSelectZeroKeyCharacter(findPreference(ItemSelectZeroKeyCharacter.NAME), activity),
|
||||||
.enableClickHandler()
|
new ItemSelectABCAutoAccceptTime(findPreference(ItemSelectABCAutoAccceptTime.NAME), activity),
|
||||||
.preview();
|
new ItemKeyPadDebounceTime(findPreference(ItemKeyPadDebounceTime.NAME), activity)
|
||||||
|
};
|
||||||
|
|
||||||
(new ItemSelectABCAutoAccceptTime(findPreference(ItemSelectABCAutoAccceptTime.NAME), activity))
|
for (ItemDropDown item : items) {
|
||||||
.populate()
|
item.populate().enableClickHandler().preview();
|
||||||
.enableClickHandler()
|
}
|
||||||
.preview();
|
|
||||||
|
|
||||||
resetFontSize(false);
|
resetFontSize(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
package io.github.sspanak.tt9.preferences.screens.setup;
|
|
||||||
|
|
||||||
import androidx.preference.SwitchPreferenceCompat;
|
|
||||||
|
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
|
||||||
|
|
||||||
public class ItemAlternativeSuggestionScrolling {
|
|
||||||
public static final String NAME = "pref_alternative_suggestion_scrolling";
|
|
||||||
|
|
||||||
private final SwitchPreferenceCompat item;
|
|
||||||
private final SettingsStore settings;
|
|
||||||
|
|
||||||
public ItemAlternativeSuggestionScrolling(SwitchPreferenceCompat item, SettingsStore settings) {
|
|
||||||
this.item = item;
|
|
||||||
this.settings = settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ItemAlternativeSuggestionScrolling populate() {
|
|
||||||
if (item != null) {
|
|
||||||
item.setChecked(settings.getSuggestionScrollingDelay() > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEnabled(boolean yes) {
|
|
||||||
if (item != null) {
|
|
||||||
item.setEnabled(yes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -48,10 +48,6 @@ public class SetupScreen extends BaseScreenFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createHacksSection(boolean isTT9On) {
|
private void createHacksSection(boolean isTT9On) {
|
||||||
(new ItemAlternativeSuggestionScrolling(findPreference(ItemAlternativeSuggestionScrolling.NAME), activity.getSettings()))
|
|
||||||
.populate()
|
|
||||||
.setEnabled(isTT9On);
|
|
||||||
|
|
||||||
Preference hackGoogleChat = findPreference("pref_hack_google_chat");
|
Preference hackGoogleChat = findPreference("pref_hack_google_chat");
|
||||||
if (hackGoogleChat != null) {
|
if (hackGoogleChat != null) {
|
||||||
hackGoogleChat.setEnabled(isTT9On);
|
hackGoogleChat.setEnabled(isTT9On);
|
||||||
|
|
@ -61,13 +57,5 @@ public class SetupScreen extends BaseScreenFragment {
|
||||||
if (hackFBMessenger != null) {
|
if (hackFBMessenger != null) {
|
||||||
hackFBMessenger.setEnabled(isTT9On);
|
hackFBMessenger.setEnabled(isTT9On);
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemKeyPadDebounceTime item = new ItemKeyPadDebounceTime(activity, findPreference(ItemKeyPadDebounceTime.NAME));
|
|
||||||
item.populate().preview();
|
|
||||||
if (isTT9On) {
|
|
||||||
item.enable();
|
|
||||||
} else {
|
|
||||||
item.disable();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,11 @@
|
||||||
|
|
||||||
<PreferenceCategory app:title="@string/pref_category_hacks">
|
<PreferenceCategory app:title="@string/pref_category_hacks">
|
||||||
|
|
||||||
|
<SwitchPreferenceCompat
|
||||||
|
app:key="pref_alternative_suggestion_scrolling"
|
||||||
|
app:title="@string/pref_alternative_suggestion_scrolling"
|
||||||
|
app:summary="@string/pref_alternative_suggestion_scrolling_summary"/>
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:key="pref_candidates_view"
|
app:key="pref_candidates_view"
|
||||||
app:title="@string/pref_hack_candidate_view" />
|
app:title="@string/pref_hack_candidate_view" />
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,7 @@
|
||||||
app:summary="@string/pref_upside_down_keys_summary"
|
app:summary="@string/pref_upside_down_keys_summary"
|
||||||
app:title="@string/pref_upside_down_keys" />
|
app:title="@string/pref_upside_down_keys" />
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory android:title="@string/pref_category_predictive_mode">
|
||||||
android:title="@string/pref_category_predictive_mode"
|
|
||||||
app:singleLineTitle="true">
|
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:defaultValue="true"
|
app:defaultValue="true"
|
||||||
|
|
@ -47,14 +45,17 @@
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory android:title="@string/pref_category_abc_mode">
|
||||||
android:title="@string/pref_category_abc_mode"
|
|
||||||
app:singleLineTitle="true">
|
|
||||||
|
|
||||||
<DropDownPreference
|
<DropDownPreference
|
||||||
app:defaultValue="800"
|
app:defaultValue="800"
|
||||||
app:key="pref_abc_auto_accept_time"
|
app:key="pref_abc_auto_accept_time"
|
||||||
app:title="@string/pref_abc_auto_accept" />
|
app:title="@string/pref_abc_auto_accept" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory android:title="@string/pref_category_hacks">
|
||||||
|
<DropDownPreference
|
||||||
|
app:key="pref_key_pad_debounce_time"
|
||||||
|
app:title="@string/pref_hack_key_pad_debounce_time" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,7 @@
|
||||||
app:key="global_default_keyboard"
|
app:key="global_default_keyboard"
|
||||||
app:title="@string/setup_default_keyboard" />
|
app:title="@string/setup_default_keyboard" />
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory app:title="@string/pref_category_hacks">
|
||||||
app:title="@string/pref_category_hacks"
|
|
||||||
app:singleLineTitle="true">
|
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
|
||||||
app:key="pref_alternative_suggestion_scrolling"
|
|
||||||
app:title="@string/pref_alternative_suggestion_scrolling"
|
|
||||||
app:summary="@string/pref_alternative_suggestion_scrolling_summary"/>
|
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
|
|
@ -29,9 +22,5 @@
|
||||||
app:key="pref_hack_fb_messenger"
|
app:key="pref_hack_fb_messenger"
|
||||||
app:title="@string/pref_hack_fb_messenger"/>
|
app:title="@string/pref_hack_fb_messenger"/>
|
||||||
|
|
||||||
<DropDownPreference
|
|
||||||
app:key="pref_key_pad_debounce_time"
|
|
||||||
app:title="@string/pref_hack_key_pad_debounce_time" />
|
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|
|
||||||
|
|
@ -172,16 +172,20 @@ The "Export" option allows you to export all added words, for all languages, inc
|
||||||
Using "Delete", you can search for and delete misspelled words or others that you don't want in the dictionary.
|
Using "Delete", you can search for and delete misspelled words or others that you don't want in the dictionary.
|
||||||
|
|
||||||
### Compatibility Options & Troubleshooting
|
### Compatibility Options & Troubleshooting
|
||||||
For several applications or devices, it is possible to enable special options, which will make Traditional T9 work better with them. You can find them in Settings → Initial Setup, under the Compatibility section.
|
For several applications or devices, it is possible to enable special options, which will make Traditional T9 work better with them. You can find them at the end of each settings screen, under the Compatibility section.
|
||||||
|
|
||||||
#### Alternative suggestion scrolling method
|
#### Alternative suggestion scrolling method
|
||||||
On some devices, in Predictive Mode, you may not be able to see all suggestions, or may not be able to scroll the list to the end. The problem occurs sometimes on Android 9 or earlier. Enable the option, if you are experiencing this issue.
|
On some devices, in Predictive Mode, you may not be able to see all suggestions, or may not be able to scroll the list to the end. The problem occurs sometimes on Android 9 or earlier. Enable the option, if you are experiencing this issue.
|
||||||
|
|
||||||
|
_Available in: Settings → Appearance._
|
||||||
|
|
||||||
#### Key repeat protection
|
#### Key repeat protection
|
||||||
CAT S22 Flip and Qin F21 phones are known for their low-quality keypads, which degrade quickly over time and start registering multiple clicks for a single key press. You may notice this when typing or navigating the phone menus.
|
CAT S22 Flip and Qin F21 phones are known for their low-quality keypads, which degrade quickly over time and start registering multiple clicks for a single key press. You may notice this when typing or navigating the phone menus.
|
||||||
|
|
||||||
For CAT phones the recommended setting is 50-75 ms. For Qin F21, try with 20-30 ms. If you are still experiencing the issue, increase the value a bit, but generally try to keep it as low as possible.
|
For CAT phones the recommended setting is 50-75 ms. For Qin F21, try with 20-30 ms. If you are still experiencing the issue, increase the value a bit, but generally try to keep it as low as possible.
|
||||||
|
|
||||||
|
_Available in: Settings → Keypad._
|
||||||
|
|
||||||
_**Note:** The higher the value you set, the slower you will have to type. TT9 will ignore very quick key presses._
|
_**Note:** The higher the value you set, the slower you will have to type. TT9 will ignore very quick key presses._
|
||||||
|
|
||||||
_**Note 2:** Besides the above, Qin phones may also fail to detect long presses. Unfortunately, in this case, nothing can be done._
|
_**Note 2:** Besides the above, Qin phones may also fail to detect long presses. Unfortunately, in this case, nothing can be done._
|
||||||
|
|
@ -189,9 +193,13 @@ _**Note 2:** Besides the above, Qin phones may also fail to detect long presses.
|
||||||
#### Send messages with OK in Facebook Messenger
|
#### Send messages with OK in Facebook Messenger
|
||||||
Facebook Messenger fails to recognize the OK key on some devices, making it impossible to send messages with it. If you prefer to send messages using OK, instead of Messenger's own send button, enable this option. This ensures sending is possible on any phone.
|
Facebook Messenger fails to recognize the OK key on some devices, making it impossible to send messages with it. If you prefer to send messages using OK, instead of Messenger's own send button, enable this option. This ensures sending is possible on any phone.
|
||||||
|
|
||||||
|
_Available in: Settings → Initial Setup._
|
||||||
|
|
||||||
#### Send messages with OK in Google Chat
|
#### Send messages with OK in Google Chat
|
||||||
Similar to the above, but for Google Chat.
|
Similar to the above, but for Google Chat.
|
||||||
|
|
||||||
|
_Available in: Settings → Initial Setup._
|
||||||
|
|
||||||
_This option is still experimental. It may sometimes fail to detect the "Send" button and click another one. If this starts happening, just close the chat and reopen it._
|
_This option is still experimental. It may sometimes fail to detect the "Send" button and click another one. If this starts happening, just close the chat and reopen it._
|
||||||
|
|
||||||
#### Telegram/Snapchat stickers and emoji panels won't open
|
#### Telegram/Snapchat stickers and emoji panels won't open
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue