Compare commits
103 Commits
1.1.4+fork
...
1.1.4+fork
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33497864f2 | ||
|
|
4c9d1544fa | ||
|
|
bce2367cfc | ||
|
|
390ecc48fb | ||
|
|
9ed99edd6e | ||
|
|
4362490539 | ||
|
|
f5d225fc3e | ||
|
|
063e9287fd | ||
|
|
ba376908cd | ||
|
|
caddf0021c | ||
|
|
90645f4d90 | ||
|
|
1316fcae22 | ||
|
|
27dee7297b | ||
|
|
13ecba40ae | ||
|
|
e15dd0d8b3 | ||
|
|
1ab26bc665 | ||
|
|
e6758d8c01 | ||
|
|
4621787e34 | ||
|
|
10ad35a285 | ||
|
|
d10145a6ba | ||
|
|
c9792ced32 | ||
|
|
a3fb09a33c | ||
|
|
6d875fd890 | ||
|
|
5d87fb7b67 | ||
|
|
4cbb59850b | ||
|
|
a2022b25e5 | ||
|
|
0d168f93ed | ||
|
|
94ac5b9bb7 | ||
|
|
024d358213 | ||
|
|
5562c93855 | ||
|
|
98e897d6a8 | ||
|
|
4aac6aa4f4 | ||
|
|
2bb4616e40 | ||
|
|
56e8476d2e | ||
|
|
97d81eb1b2 | ||
|
|
ffa21b26af | ||
|
|
9917712f66 | ||
|
|
11cdce6c90 | ||
|
|
8e82cf1e99 | ||
|
|
9767b11626 | ||
|
|
0f95694083 | ||
|
|
7dfc7dd9ef | ||
|
|
0407e958f1 | ||
|
|
e6a5fa1c3f | ||
|
|
6f48a7c4a4 | ||
|
|
80c56d71cb | ||
|
|
f77d9dcee2 | ||
|
|
f7195c7787 | ||
|
|
ca92cc6dc1 | ||
|
|
cd31b2ae5a | ||
|
|
00bec7174a | ||
|
|
236acab54f | ||
|
|
ba362f4457 | ||
|
|
8ed93baf8d | ||
|
|
bf953e96fa | ||
|
|
6b89a747e2 | ||
|
|
2fa1d54268 | ||
|
|
02ef34b451 | ||
|
|
1701fc71c4 | ||
|
|
fe200996db | ||
|
|
659333342f | ||
|
|
1ca5b6def2 | ||
|
|
4e8e3ee440 | ||
|
|
86dd724222 | ||
|
|
8242995027 | ||
|
|
49962a4734 | ||
|
|
509b16aee1 | ||
|
|
f3f5e4a887 | ||
|
|
7aabc1fa76 | ||
|
|
dcb5e36041 | ||
|
|
e0c072ab9c | ||
|
|
0231903868 | ||
|
|
f63bbeee79 | ||
|
|
db9e427444 | ||
|
|
4474a584df | ||
|
|
ab00ad68f1 | ||
|
|
d1e77efa1c | ||
|
|
de00353864 | ||
|
|
feec459d47 | ||
|
|
ad68d7e4f2 | ||
|
|
cf27c6bbf3 | ||
|
|
0115656d67 | ||
|
|
002687d2b1 | ||
|
|
a3267f6cd3 | ||
|
|
0ca9c536cd | ||
|
|
382a23c0b6 | ||
|
|
1f51331f67 | ||
|
|
cce6ba0746 | ||
|
|
be3c12dfb3 | ||
|
|
bfd87cf94e | ||
|
|
857bb1e483 | ||
|
|
75a131b675 | ||
|
|
231ea46f9f | ||
|
|
600be455a3 | ||
|
|
d98b1c5ee1 | ||
|
|
a4df06726f | ||
|
|
e45e2c31d1 | ||
|
|
17dc0850d5 | ||
|
|
9667a32e44 | ||
|
|
4e6ba84bb3 | ||
|
|
b79ba71228 | ||
|
|
2903874dbc | ||
|
|
202a5f9581 |
@@ -1,6 +1,6 @@
|
|||||||

|

|
||||||
|
|
||||||
# Moshidon
|
# Moshidon, the material you mastodon client!
|
||||||
|
|
||||||
> A fork of [megalodon](https://github.com/sk22/megalodon) which is a fork of [official Mastodon Android app](https://github.com/mastodon/mastodon-android) adding important features that are missing in the official app and possibly won’t ever be implemented, such as the federated timeline, unlisted posting, bookmarks and an image description viewer.
|
> A fork of [megalodon](https://github.com/sk22/megalodon) which is a fork of [official Mastodon Android app](https://github.com/mastodon/mastodon-android) adding important features that are missing in the official app and possibly won’t ever be implemented, such as the federated timeline, unlisted posting, bookmarks and an image description viewer.
|
||||||
|
|
||||||
@@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
## Key features
|
## Key features
|
||||||
|
|
||||||
|
### **Material you theme support on Android 12+ devices!**
|
||||||
|
|
||||||
### **Translate button**
|
### **Translate button**
|
||||||
|
|
||||||
**Allows you to translate posts in instances with the translate feature!**
|
**Allows you to translate posts in instances with the translate feature!**
|
||||||
|
|||||||
@@ -9,13 +9,10 @@ android {
|
|||||||
applicationId "org.joinmastodon.android.moshinda"
|
applicationId "org.joinmastodon.android.moshinda"
|
||||||
minSdk 23
|
minSdk 23
|
||||||
targetSdk 33
|
targetSdk 33
|
||||||
versionCode 63
|
versionCode 66
|
||||||
versionName "1.1.4+fork.63.moshinda"
|
versionName "1.1.4+fork.66.moshinda"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
resConfigs "en", "ar-rSA", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES",
|
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "nl-rNL", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
|
||||||
"eu-rES", "fi-rFI", "fr-rFR", "gl-rES", "hr-rHR", "hy-rAM", "it-rIT", "iw-rIL",
|
|
||||||
"ja-rJP", "kab", "ko-rKR", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ru-rRU",
|
|
||||||
"sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
|||||||
@@ -1,7 +1,18 @@
|
|||||||
package org.joinmastodon.android;
|
package org.joinmastodon.android;
|
||||||
|
|
||||||
|
import static org.joinmastodon.android.api.MastodonAPIController.gson;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Build;
|
||||||
|
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class GlobalUserPreferences{
|
public class GlobalUserPreferences{
|
||||||
public static boolean playGifs;
|
public static boolean playGifs;
|
||||||
@@ -18,10 +29,19 @@ public class GlobalUserPreferences{
|
|||||||
public static ThemePreference theme;
|
public static ThemePreference theme;
|
||||||
public static ColorPreference color;
|
public static ColorPreference color;
|
||||||
|
|
||||||
|
private final static Type recentLanguagesType = new TypeToken<Map<String, List<String>>>() {}.getType();
|
||||||
|
public static Map<String, List<String>> recentLanguages;
|
||||||
|
public static Map<String, String> defaultLanguages;
|
||||||
|
|
||||||
private static SharedPreferences getPrefs(){
|
private static SharedPreferences getPrefs(){
|
||||||
return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE);
|
return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <T> T fromJson(String json, Type type, T orElse) {
|
||||||
|
try { return gson.fromJson(json, type); }
|
||||||
|
catch (JsonSyntaxException ignored) { return orElse; }
|
||||||
|
}
|
||||||
|
|
||||||
public static void load(){
|
public static void load(){
|
||||||
SharedPreferences prefs=getPrefs();
|
SharedPreferences prefs=getPrefs();
|
||||||
playGifs=prefs.getBoolean("playGifs", true);
|
playGifs=prefs.getBoolean("playGifs", true);
|
||||||
@@ -36,7 +56,13 @@ public class GlobalUserPreferences{
|
|||||||
disableMarquee=prefs.getBoolean("disableMarquee", false);
|
disableMarquee=prefs.getBoolean("disableMarquee", false);
|
||||||
voteButtonForSingleChoice=prefs.getBoolean("voteButtonForSingleChoice", true);
|
voteButtonForSingleChoice=prefs.getBoolean("voteButtonForSingleChoice", true);
|
||||||
theme=ThemePreference.values()[prefs.getInt("theme", 0)];
|
theme=ThemePreference.values()[prefs.getInt("theme", 0)];
|
||||||
color=ColorPreference.values()[prefs.getInt("color", 1)];
|
recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>());
|
||||||
|
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
|
||||||
|
color=ColorPreference.values()[prefs.getInt("color", 0)];
|
||||||
|
}else{
|
||||||
|
color=ColorPreference.values()[prefs.getInt("color", 1)];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void save(){
|
public static void save(){
|
||||||
@@ -52,18 +78,19 @@ public class GlobalUserPreferences{
|
|||||||
.putBoolean("alwaysExpandContentWarnings", alwaysExpandContentWarnings)
|
.putBoolean("alwaysExpandContentWarnings", alwaysExpandContentWarnings)
|
||||||
.putBoolean("disableMarquee", disableMarquee)
|
.putBoolean("disableMarquee", disableMarquee)
|
||||||
.putInt("theme", theme.ordinal())
|
.putInt("theme", theme.ordinal())
|
||||||
|
.putString("recentLanguages", gson.toJson(recentLanguages))
|
||||||
.putInt("color", color.ordinal())
|
.putInt("color", color.ordinal())
|
||||||
.apply();
|
.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ColorPreference{
|
public enum ColorPreference{
|
||||||
PINK,
|
MATERIAL3,
|
||||||
PURPLE,
|
PURPLE,
|
||||||
|
PINK,
|
||||||
GREEN,
|
GREEN,
|
||||||
BLUE,
|
BLUE,
|
||||||
ORANGE,
|
ORANGE,
|
||||||
YELLOW,
|
YELLOW
|
||||||
MATERIAL3
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ThemePreference{
|
public enum ThemePreference{
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ import org.joinmastodon.android.api.session.AccountSessionManager;
|
|||||||
import org.joinmastodon.android.fragments.ComposeFragment;
|
import org.joinmastodon.android.fragments.ComposeFragment;
|
||||||
import org.joinmastodon.android.fragments.HomeFragment;
|
import org.joinmastodon.android.fragments.HomeFragment;
|
||||||
import org.joinmastodon.android.fragments.ProfileFragment;
|
import org.joinmastodon.android.fragments.ProfileFragment;
|
||||||
import org.joinmastodon.android.fragments.SplashFragment;
|
|
||||||
import org.joinmastodon.android.fragments.ThreadFragment;
|
import org.joinmastodon.android.fragments.ThreadFragment;
|
||||||
import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
|
import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
|
||||||
|
import org.joinmastodon.android.fragments.onboarding.MoshidonLoginFragment;
|
||||||
import org.joinmastodon.android.model.Notification;
|
import org.joinmastodon.android.model.Notification;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
||||||
@@ -33,7 +33,7 @@ public class MainActivity extends FragmentStackActivity{
|
|||||||
|
|
||||||
if(savedInstanceState==null){
|
if(savedInstanceState==null){
|
||||||
if(AccountSessionManager.getInstance().getLoggedInAccounts().isEmpty()){
|
if(AccountSessionManager.getInstance().getLoggedInAccounts().isEmpty()){
|
||||||
showFragmentClearingBackStack(new SplashFragment());
|
showFragmentClearingBackStack(new MoshidonLoginFragment());
|
||||||
}else{
|
}else{
|
||||||
AccountSessionManager.getInstance().maybeUpdateLocalInfo();
|
AccountSessionManager.getInstance().maybeUpdateLocalInfo();
|
||||||
AccountSession session;
|
AccountSession session;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ public class OAuthActivity extends Activity{
|
|||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Account account){
|
public void onSuccess(Account account){
|
||||||
AccountSessionManager.getInstance().addAccount(instance, token, account, app, true);
|
AccountSessionManager.getInstance().addAccount(instance, token, account, app, null);
|
||||||
progress.dismiss();
|
progress.dismiss();
|
||||||
finish();
|
finish();
|
||||||
// not calling restartMainActivity() here on purpose to have it recreated (notice different flags)
|
// not calling restartMainActivity() here on purpose to have it recreated (notice different flags)
|
||||||
|
|||||||
@@ -7,4 +7,15 @@ public class GetInstance extends MastodonAPIRequest<Instance>{
|
|||||||
public GetInstance(){
|
public GetInstance(){
|
||||||
super(HttpMethod.GET, "/instance", Instance.class);
|
super(HttpMethod.GET, "/instance", Instance.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class V2 extends MastodonAPIRequest<Instance.V2>{
|
||||||
|
public V2(){
|
||||||
|
super(HttpMethod.GET, "/instance", Instance.V2.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getPathPrefix() {
|
||||||
|
return "/api/v2";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.joinmastodon.android.api.requests.lists;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AddList extends MastodonAPIRequest<Object> {
|
||||||
|
public AddList(String listName){
|
||||||
|
super(HttpMethod.POST, "/lists", Object.class);
|
||||||
|
Request req = new Request();
|
||||||
|
req.title = listName;
|
||||||
|
setRequestBody(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Request{
|
||||||
|
public String title;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.joinmastodon.android.api.requests.lists;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class EditListName extends MastodonAPIRequest<Object> {
|
||||||
|
public EditListName(String newListName, String listId){
|
||||||
|
super(HttpMethod.PUT, "/lists/"+listId, Object.class);
|
||||||
|
Request req = new Request();
|
||||||
|
req.title = newListName;
|
||||||
|
setRequestBody(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Request{
|
||||||
|
public String title;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.joinmastodon.android.api.requests.lists;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RemoveList extends MastodonAPIRequest<Object> {
|
||||||
|
public RemoveList(String listId){
|
||||||
|
super(HttpMethod.DELETE, "/lists/"+listId, Object.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package org.joinmastodon.android.api.session;
|
||||||
|
|
||||||
|
public class AccountActivationInfo{
|
||||||
|
public String email;
|
||||||
|
public long lastEmailConfirmationResend;
|
||||||
|
|
||||||
|
public AccountActivationInfo(String email, long lastEmailConfirmationResend){
|
||||||
|
this.email=email;
|
||||||
|
this.lastEmailConfirmationResend=lastEmailConfirmationResend;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import org.joinmastodon.android.api.StatusInteractionController;
|
|||||||
import org.joinmastodon.android.model.Account;
|
import org.joinmastodon.android.model.Account;
|
||||||
import org.joinmastodon.android.model.Application;
|
import org.joinmastodon.android.model.Application;
|
||||||
import org.joinmastodon.android.model.Filter;
|
import org.joinmastodon.android.model.Filter;
|
||||||
|
import org.joinmastodon.android.model.Preferences;
|
||||||
import org.joinmastodon.android.model.PushSubscription;
|
import org.joinmastodon.android.model.PushSubscription;
|
||||||
import org.joinmastodon.android.model.Token;
|
import org.joinmastodon.android.model.Token;
|
||||||
|
|
||||||
@@ -28,17 +29,20 @@ public class AccountSession{
|
|||||||
public long filtersLastUpdated;
|
public long filtersLastUpdated;
|
||||||
public List<Filter> wordFilters=new ArrayList<>();
|
public List<Filter> wordFilters=new ArrayList<>();
|
||||||
public String pushAccountID;
|
public String pushAccountID;
|
||||||
|
public Preferences preferences;
|
||||||
|
public AccountActivationInfo activationInfo;
|
||||||
private transient MastodonAPIController apiController;
|
private transient MastodonAPIController apiController;
|
||||||
private transient StatusInteractionController statusInteractionController;
|
private transient StatusInteractionController statusInteractionController;
|
||||||
private transient CacheController cacheController;
|
private transient CacheController cacheController;
|
||||||
private transient PushSubscriptionManager pushSubscriptionManager;
|
private transient PushSubscriptionManager pushSubscriptionManager;
|
||||||
|
|
||||||
AccountSession(Token token, Account self, Application app, String domain, boolean activated){
|
AccountSession(Token token, Account self, Application app, String domain, boolean activated, AccountActivationInfo activationInfo){
|
||||||
this.token=token;
|
this.token=token;
|
||||||
this.self=self;
|
this.self=self;
|
||||||
this.domain=domain;
|
this.domain=domain;
|
||||||
this.app=app;
|
this.app=app;
|
||||||
this.activated=activated;
|
this.activated=activated;
|
||||||
|
this.activationInfo=activationInfo;
|
||||||
infoLastUpdated=System.currentTimeMillis();
|
infoLastUpdated=System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import org.joinmastodon.android.MastodonApp;
|
|||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.MastodonAPIController;
|
import org.joinmastodon.android.api.MastodonAPIController;
|
||||||
import org.joinmastodon.android.api.PushSubscriptionManager;
|
import org.joinmastodon.android.api.PushSubscriptionManager;
|
||||||
|
import org.joinmastodon.android.api.requests.accounts.GetPreferences;
|
||||||
import org.joinmastodon.android.api.requests.accounts.GetWordFilters;
|
import org.joinmastodon.android.api.requests.accounts.GetWordFilters;
|
||||||
import org.joinmastodon.android.api.requests.instance.GetCustomEmojis;
|
import org.joinmastodon.android.api.requests.instance.GetCustomEmojis;
|
||||||
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
|
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
|
||||||
@@ -34,6 +35,7 @@ import org.joinmastodon.android.model.Emoji;
|
|||||||
import org.joinmastodon.android.model.EmojiCategory;
|
import org.joinmastodon.android.model.EmojiCategory;
|
||||||
import org.joinmastodon.android.model.Filter;
|
import org.joinmastodon.android.model.Filter;
|
||||||
import org.joinmastodon.android.model.Instance;
|
import org.joinmastodon.android.model.Instance;
|
||||||
|
import org.joinmastodon.android.model.Preferences;
|
||||||
import org.joinmastodon.android.model.Token;
|
import org.joinmastodon.android.model.Token;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -100,9 +102,9 @@ public class AccountSessionManager{
|
|||||||
maybeUpdateShortcuts();
|
maybeUpdateShortcuts();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAccount(Instance instance, Token token, Account self, Application app, boolean active){
|
public void addAccount(Instance instance, Token token, Account self, Application app, AccountActivationInfo activationInfo){
|
||||||
instances.put(instance.uri, instance);
|
instances.put(instance.uri, instance);
|
||||||
AccountSession session=new AccountSession(token, self, app, instance.uri, active);
|
AccountSession session=new AccountSession(token, self, app, instance.uri, activationInfo==null, activationInfo);
|
||||||
sessions.put(session.getID(), session);
|
sessions.put(session.getID(), session);
|
||||||
lastActiveAccountID=session.getID();
|
lastActiveAccountID=session.getID();
|
||||||
writeAccountsFile();
|
writeAccountsFile();
|
||||||
@@ -248,12 +250,13 @@ public class AccountSessionManager{
|
|||||||
HashSet<String> domains=new HashSet<>();
|
HashSet<String> domains=new HashSet<>();
|
||||||
for(AccountSession session:sessions.values()){
|
for(AccountSession session:sessions.values()){
|
||||||
domains.add(session.domain.toLowerCase());
|
domains.add(session.domain.toLowerCase());
|
||||||
if(now-session.infoLastUpdated>24L*3600_000L){
|
// if(now-session.infoLastUpdated>24L*3600_000L){
|
||||||
updateSessionLocalInfo(session);
|
updateSessionPreferences(session);
|
||||||
}
|
updateSessionLocalInfo(session);
|
||||||
if(now-session.filtersLastUpdated>3600_000L){
|
// }
|
||||||
updateSessionWordFilters(session);
|
// if(now-session.filtersLastUpdated>3600_000L){
|
||||||
}
|
updateSessionWordFilters(session);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
if(loadedInstances){
|
if(loadedInstances){
|
||||||
maybeUpdateCustomEmojis(domains);
|
maybeUpdateCustomEmojis(domains);
|
||||||
@@ -263,10 +266,10 @@ public class AccountSessionManager{
|
|||||||
private void maybeUpdateCustomEmojis(Set<String> domains){
|
private void maybeUpdateCustomEmojis(Set<String> domains){
|
||||||
long now=System.currentTimeMillis();
|
long now=System.currentTimeMillis();
|
||||||
for(String domain:domains){
|
for(String domain:domains){
|
||||||
Long lastUpdated=instancesLastUpdated.get(domain);
|
// Long lastUpdated=instancesLastUpdated.get(domain);
|
||||||
if(lastUpdated==null || now-lastUpdated>24L*3600_000L){
|
// if(lastUpdated==null || now-lastUpdated>24L*3600_000L){
|
||||||
updateInstanceInfo(domain);
|
updateInstanceInfo(domain);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,6 +291,18 @@ public class AccountSessionManager{
|
|||||||
.exec(session.getID());
|
.exec(session.getID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateSessionPreferences(AccountSession session){
|
||||||
|
new GetPreferences().setCallback(new Callback<>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Preferences preferences) {
|
||||||
|
session.preferences=preferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(ErrorResponse error) {}
|
||||||
|
}).exec(session.getID());
|
||||||
|
}
|
||||||
|
|
||||||
private void updateSessionWordFilters(AccountSession session){
|
private void updateSessionWordFilters(AccountSession session){
|
||||||
new GetWordFilters()
|
new GetWordFilters()
|
||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@@ -313,6 +328,11 @@ public class AccountSessionManager{
|
|||||||
public void onSuccess(Instance instance){
|
public void onSuccess(Instance instance){
|
||||||
instances.put(domain, instance);
|
instances.put(domain, instance);
|
||||||
updateInstanceEmojis(instance, domain);
|
updateInstanceEmojis(instance, domain);
|
||||||
|
try {
|
||||||
|
if (Integer.parseInt(instance.version.split("\\.")[0]) >= 4) {
|
||||||
|
updateInstanceInfoV2(domain);
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -323,6 +343,19 @@ public class AccountSessionManager{
|
|||||||
.execNoAuth(domain);
|
.execNoAuth(domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateInstanceInfoV2(String domain) {
|
||||||
|
new GetInstance.V2().setCallback(new Callback<>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Instance.V2 v2) {
|
||||||
|
Instance instanceInfo = instances.get(domain);
|
||||||
|
if (instanceInfo != null) instanceInfo.v2 = v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(ErrorResponse errorResponse) {}
|
||||||
|
}).execNoAuth(domain);
|
||||||
|
}
|
||||||
|
|
||||||
private void updateInstanceEmojis(Instance instance, String domain){
|
private void updateInstanceEmojis(Instance instance, String domain){
|
||||||
new GetCustomEmojis()
|
new GetCustomEmojis()
|
||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@@ -398,6 +431,10 @@ public class AccountSessionManager{
|
|||||||
return instances.get(domain);
|
return instances.get(domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Instance getInstanceInfoForAccount(String account) {
|
||||||
|
return AccountSessionManager.getInstance().getInstanceInfo(instance.getAccount(account).domain);
|
||||||
|
}
|
||||||
|
|
||||||
public void updateAccountInfo(String id, Account account){
|
public void updateAccountInfo(String id, Account account){
|
||||||
AccountSession session=getAccount(id);
|
AccountSession session=getAccount(id);
|
||||||
session.self=account;
|
session.self=account;
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
package org.joinmastodon.android.fragments;
|
package org.joinmastodon.android.fragments;
|
||||||
|
|
||||||
|
import static org.joinmastodon.android.GlobalUserPreferences.recentLanguages;
|
||||||
|
import static org.joinmastodon.android.utils.MastodonLanguage.allLanguages;
|
||||||
|
import static org.joinmastodon.android.utils.MastodonLanguage.defaultRecentLanguages;
|
||||||
|
|
||||||
import android.animation.ObjectAnimator;
|
import android.animation.ObjectAnimator;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
@@ -29,11 +33,13 @@ import android.text.Spanned;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.TypedValue;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.view.SubMenu;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewOutlineProvider;
|
import android.view.ViewOutlineProvider;
|
||||||
@@ -55,6 +61,7 @@ import android.widget.Toast;
|
|||||||
import com.twitter.twittertext.TwitterTextEmojiRegex;
|
import com.twitter.twittertext.TwitterTextEmojiRegex;
|
||||||
|
|
||||||
import org.joinmastodon.android.E;
|
import org.joinmastodon.android.E;
|
||||||
|
import org.joinmastodon.android.GlobalUserPreferences;
|
||||||
import org.joinmastodon.android.MastodonApp;
|
import org.joinmastodon.android.MastodonApp;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.MastodonAPIController;
|
import org.joinmastodon.android.api.MastodonAPIController;
|
||||||
@@ -95,6 +102,7 @@ import org.joinmastodon.android.ui.views.ComposeEditText;
|
|||||||
import org.joinmastodon.android.ui.views.ComposeMediaLayout;
|
import org.joinmastodon.android.ui.views.ComposeMediaLayout;
|
||||||
import org.joinmastodon.android.ui.views.ReorderableLinearLayout;
|
import org.joinmastodon.android.ui.views.ReorderableLinearLayout;
|
||||||
import org.joinmastodon.android.ui.views.SizeListenerLinearLayout;
|
import org.joinmastodon.android.ui.views.SizeListenerLinearLayout;
|
||||||
|
import org.joinmastodon.android.utils.MastodonLanguage;
|
||||||
import org.parceler.Parcel;
|
import org.parceler.Parcel;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
@@ -105,6 +113,7 @@ import java.time.temporal.ChronoUnit;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -145,7 +154,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
private String accountID;
|
private String accountID;
|
||||||
private int charCount, charLimit, trimmedCharCount;
|
private int charCount, charLimit, trimmedCharCount;
|
||||||
|
|
||||||
private Button publishButton;
|
private Button publishButton, languageButton;
|
||||||
|
private PopupMenu languagePopup;
|
||||||
private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn;
|
private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn;
|
||||||
private ImageView sensitiveIcon;
|
private ImageView sensitiveIcon;
|
||||||
private ComposeMediaLayout attachmentsView;
|
private ComposeMediaLayout attachmentsView;
|
||||||
@@ -153,9 +163,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
private ReorderableLinearLayout pollOptionsView;
|
private ReorderableLinearLayout pollOptionsView;
|
||||||
private View pollWrap;
|
private View pollWrap;
|
||||||
private View addPollOptionBtn;
|
private View addPollOptionBtn;
|
||||||
|
private View sensitiveItem;
|
||||||
private View pollAllowMultipleItem;
|
private View pollAllowMultipleItem;
|
||||||
private CheckBox pollAllowMultipleCheckbox;
|
private CheckBox pollAllowMultipleCheckbox;
|
||||||
private View sensitiveItem;
|
|
||||||
private TextView pollDurationView;
|
private TextView pollDurationView;
|
||||||
|
|
||||||
private ArrayList<DraftPollOption> pollOptions=new ArrayList<>();
|
private ArrayList<DraftPollOption> pollOptions=new ArrayList<>();
|
||||||
@@ -190,6 +200,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
private boolean ignoreSelectionChanges=false;
|
private boolean ignoreSelectionChanges=false;
|
||||||
private Runnable updateUploadEtaRunnable;
|
private Runnable updateUploadEtaRunnable;
|
||||||
|
|
||||||
|
private String language;
|
||||||
|
private MastodonLanguage.LanguageResolver languageResolver;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState){
|
public void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@@ -201,6 +214,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
instanceDomain=session.domain;
|
instanceDomain=session.domain;
|
||||||
customEmojis=AccountSessionManager.getInstance().getCustomEmojis(instanceDomain);
|
customEmojis=AccountSessionManager.getInstance().getCustomEmojis(instanceDomain);
|
||||||
instance=AccountSessionManager.getInstance().getInstanceInfo(instanceDomain);
|
instance=AccountSessionManager.getInstance().getInstanceInfo(instanceDomain);
|
||||||
|
languageResolver=new MastodonLanguage.LanguageResolver(instance);
|
||||||
if(getArguments().containsKey("editStatus")){
|
if(getArguments().containsKey("editStatus")){
|
||||||
editingStatus=Parcels.unwrap(getArguments().getParcelable("editStatus"));
|
editingStatus=Parcels.unwrap(getArguments().getParcelable("editStatus"));
|
||||||
redraftStatus=getArguments().getBoolean("redraftStatus");
|
redraftStatus=getArguments().getBoolean("redraftStatus");
|
||||||
@@ -219,8 +233,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
charLimit=instance.configuration.statuses.maxCharacters;
|
charLimit=instance.configuration.statuses.maxCharacters;
|
||||||
else
|
else
|
||||||
charLimit=500;
|
charLimit=500;
|
||||||
|
|
||||||
loadDefaultStatusVisibility(savedInstanceState);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -375,6 +387,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
statusVisibility=editingStatus.visibility;
|
statusVisibility=editingStatus.visibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadDefaultStatusVisibility(savedInstanceState);
|
||||||
updateVisibilityIcon();
|
updateVisibilityIcon();
|
||||||
|
|
||||||
autocompleteViewController=new ComposeAutocompleteViewController(getActivity(), accountID);
|
autocompleteViewController=new ComposeAutocompleteViewController(getActivity(), accountID);
|
||||||
@@ -403,6 +416,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
}
|
}
|
||||||
outState.putBoolean("sensitive", sensitive);
|
outState.putBoolean("sensitive", sensitive);
|
||||||
outState.putBoolean("hasSpoiler", hasSpoiler);
|
outState.putBoolean("hasSpoiler", hasSpoiler);
|
||||||
|
outState.putString("language", language);
|
||||||
if(!attachments.isEmpty()){
|
if(!attachments.isEmpty()){
|
||||||
ArrayList<Parcelable> serializedAttachments=new ArrayList<>(attachments.size());
|
ArrayList<Parcelable> serializedAttachments=new ArrayList<>(attachments.size());
|
||||||
for(DraftMediaAttachment att:attachments){
|
for(DraftMediaAttachment att:attachments){
|
||||||
@@ -494,14 +508,14 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
spoilerEdit.addTextChangedListener(new SimpleTextWatcher(e->updateCharCounter()));
|
spoilerEdit.addTextChangedListener(new SimpleTextWatcher(e->updateCharCounter()));
|
||||||
if(replyTo!=null){
|
if(replyTo!=null){
|
||||||
replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName));
|
replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName));
|
||||||
int visibilityNameRes = switch (statusVisibility) {
|
int visibilityNameRes = switch (replyTo.visibility) {
|
||||||
case PUBLIC -> R.string.visibility_public;
|
case PUBLIC -> R.string.visibility_public;
|
||||||
case UNLISTED -> R.string.sk_visibility_unlisted;
|
case UNLISTED -> R.string.sk_visibility_unlisted;
|
||||||
case PRIVATE -> R.string.visibility_followers_only;
|
case PRIVATE -> R.string.visibility_followers_only;
|
||||||
case DIRECT -> R.string.visibility_private;
|
case DIRECT -> R.string.visibility_private;
|
||||||
};
|
};
|
||||||
replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes));
|
replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes));
|
||||||
Drawable visibilityIcon = getActivity().getDrawable(switch(statusVisibility){
|
Drawable visibilityIcon = getActivity().getDrawable(switch(replyTo.visibility){
|
||||||
case PUBLIC -> R.drawable.ic_fluent_earth_20_regular;
|
case PUBLIC -> R.drawable.ic_fluent_earth_20_regular;
|
||||||
case UNLISTED -> R.drawable.ic_fluent_people_community_20_regular;
|
case UNLISTED -> R.drawable.ic_fluent_people_community_20_regular;
|
||||||
case PRIVATE -> R.drawable.ic_fluent_people_checkmark_20_regular;
|
case PRIVATE -> R.drawable.ic_fluent_people_checkmark_20_regular;
|
||||||
@@ -536,14 +550,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
ignoreSelectionChanges=true;
|
ignoreSelectionChanges=true;
|
||||||
mainEditText.setSelection(mainEditText.length());
|
mainEditText.setSelection(mainEditText.length());
|
||||||
ignoreSelectionChanges=false;
|
ignoreSelectionChanges=false;
|
||||||
if(!TextUtils.isEmpty(replyTo.spoilerText) && AccountSessionManager.getInstance().isSelf(accountID, replyTo.account)){
|
if(!TextUtils.isEmpty(replyTo.spoilerText)){
|
||||||
hasSpoiler=true;
|
hasSpoiler=true;
|
||||||
spoilerEdit.setVisibility(View.VISIBLE);
|
spoilerEdit.setVisibility(View.VISIBLE);
|
||||||
spoilerEdit.setText(replyTo.spoilerText);
|
spoilerEdit.setText(replyTo.spoilerText);
|
||||||
spoilerBtn.setSelected(true);
|
spoilerBtn.setSelected(true);
|
||||||
}
|
}
|
||||||
|
if (replyTo.language != null && !replyTo.language.isEmpty()) updateLanguage(replyTo.language);
|
||||||
}
|
}
|
||||||
}else{
|
}else if (editingStatus==null || editingStatus.inReplyToId==null){
|
||||||
|
// TODO: remove workaround after https://github.com/mastodon/mastodon-android/issues/341 gets fixed
|
||||||
replyText.setVisibility(View.GONE);
|
replyText.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
if(savedInstanceState==null){
|
if(savedInstanceState==null){
|
||||||
@@ -553,6 +569,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
ignoreSelectionChanges=true;
|
ignoreSelectionChanges=true;
|
||||||
mainEditText.setSelection(mainEditText.length());
|
mainEditText.setSelection(mainEditText.length());
|
||||||
ignoreSelectionChanges=false;
|
ignoreSelectionChanges=false;
|
||||||
|
updateLanguage(editingStatus.language);
|
||||||
if(!editingStatus.mediaAttachments.isEmpty()){
|
if(!editingStatus.mediaAttachments.isEmpty()){
|
||||||
attachmentsView.setVisibility(View.VISIBLE);
|
attachmentsView.setVisibility(View.VISIBLE);
|
||||||
for(Attachment att:editingStatus.mediaAttachments){
|
for(Attachment att:editingStatus.mediaAttachments){
|
||||||
@@ -615,6 +632,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
sendError.setVisibility(View.GONE);
|
sendError.setVisibility(View.GONE);
|
||||||
sendProgress.setVisibility(View.GONE);
|
sendProgress.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
LinearLayout.LayoutParams langParams=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
|
langParams.setMarginEnd(V.dp(8));
|
||||||
|
wrap.addView(buildLanguageSelector(), langParams);
|
||||||
|
|
||||||
wrap.addView(publishButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
wrap.addView(publishButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
wrap.setPadding(V.dp(16), V.dp(4), V.dp(16), V.dp(8));
|
wrap.setPadding(V.dp(16), V.dp(4), V.dp(16), V.dp(8));
|
||||||
wrap.setClipToPadding(false);
|
wrap.setClipToPadding(false);
|
||||||
@@ -624,6 +645,59 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
updatePublishButtonState();
|
updatePublishButtonState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateLanguage(String lang) {
|
||||||
|
updateLanguage(languageResolver.from(lang));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateLanguage(MastodonLanguage loc) {
|
||||||
|
language = loc.getLanguage();
|
||||||
|
languageButton.setText(loc.getLanguageName());
|
||||||
|
languageButton.setContentDescription(getActivity().getString(R.string.sk_post_language, loc.getDefaultName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
private Button buildLanguageSelector() {
|
||||||
|
TypedValue typedValue = new TypedValue();
|
||||||
|
getActivity().getTheme().resolveAttribute(android.R.attr.textColorSecondary, typedValue, true);
|
||||||
|
|
||||||
|
languageButton=new Button(getActivity());
|
||||||
|
languageButton.setTextColor(typedValue.data);
|
||||||
|
languageButton.setBackground(getActivity().getDrawable(R.drawable.bg_text_button));
|
||||||
|
languageButton.setPadding(V.dp(8), 0, V.dp(8), 0);
|
||||||
|
languageButton.setCompoundDrawablesRelativeWithIntrinsicBounds(getActivity().getDrawable(R.drawable.ic_fluent_local_language_16_regular), null, null, null);
|
||||||
|
languageButton.setCompoundDrawableTintList(languageButton.getTextColors());
|
||||||
|
languageButton.setCompoundDrawablePadding(V.dp(6));
|
||||||
|
|
||||||
|
languagePopup=new PopupMenu(getActivity(), languageButton);
|
||||||
|
languageButton.setOnTouchListener(languagePopup.getDragToOpenListener());
|
||||||
|
languageButton.setOnClickListener(v->languagePopup.show());
|
||||||
|
|
||||||
|
Preferences prefs = AccountSessionManager.getInstance().getAccount(accountID).preferences;
|
||||||
|
updateLanguage(prefs != null && prefs.postingDefaultLanguage != null && prefs.postingDefaultLanguage.length() > 0
|
||||||
|
? languageResolver.from(prefs.postingDefaultLanguage)
|
||||||
|
: languageResolver.getDefault());
|
||||||
|
|
||||||
|
Menu languageMenu = languagePopup.getMenu();
|
||||||
|
for (String recentLanguage : Optional.ofNullable(recentLanguages.get(accountID)).orElse(defaultRecentLanguages)) {
|
||||||
|
MastodonLanguage l = languageResolver.from(recentLanguage);
|
||||||
|
languageMenu.add(0, allLanguages.indexOf(l), Menu.NONE, getActivity().getString(R.string.sk_language_name, l.getDefaultName(), l.getLanguageName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
SubMenu allLanguagesMenu = languageMenu.addSubMenu(R.string.sk_available_languages);
|
||||||
|
for (int i = 0; i < allLanguages.size(); i++) {
|
||||||
|
MastodonLanguage l = allLanguages.get(i);
|
||||||
|
allLanguagesMenu.add(0, i, Menu.NONE, getActivity().getString(R.string.sk_language_name, l.getDefaultName(), l.getLanguageName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
languagePopup.setOnMenuItemClickListener(i->{
|
||||||
|
if (i.hasSubMenu()) return false;
|
||||||
|
updateLanguage(allLanguages.get(i.getItemId()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
return languageButton;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item){
|
public boolean onOptionsItemSelected(MenuItem item){
|
||||||
return true;
|
return true;
|
||||||
@@ -697,6 +771,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
req.status=text;
|
req.status=text;
|
||||||
req.visibility=statusVisibility;
|
req.visibility=statusVisibility;
|
||||||
req.sensitive=sensitive;
|
req.sensitive=sensitive;
|
||||||
|
req.language=language;
|
||||||
if(!attachments.isEmpty()){
|
if(!attachments.isEmpty()){
|
||||||
req.mediaIds=attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList());
|
req.mediaIds=attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
@@ -706,6 +781,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
if(!pollOptions.isEmpty()){
|
if(!pollOptions.isEmpty()){
|
||||||
req.poll=new CreateStatus.Request.Poll();
|
req.poll=new CreateStatus.Request.Poll();
|
||||||
req.poll.expiresIn=pollDuration;
|
req.poll.expiresIn=pollDuration;
|
||||||
|
req.poll.multiple=pollAllowMultipleItem.isSelected();
|
||||||
for(DraftPollOption opt:pollOptions)
|
for(DraftPollOption opt:pollOptions)
|
||||||
req.poll.options.add(opt.edit.getText().toString());
|
req.poll.options.add(opt.edit.getText().toString());
|
||||||
}
|
}
|
||||||
@@ -773,6 +849,14 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
.setCallback(resCallback)
|
.setCallback(resCallback)
|
||||||
.exec(accountID);
|
.exec(accountID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (replyTo == null) {
|
||||||
|
List<String> newRecentLanguages = new ArrayList<>(Optional.ofNullable(recentLanguages.get(accountID)).orElse(defaultRecentLanguages));
|
||||||
|
newRecentLanguages.remove(language);
|
||||||
|
newRecentLanguages.add(0, language);
|
||||||
|
recentLanguages.put(accountID, newRecentLanguages.stream().limit(4).collect(Collectors.toList()));
|
||||||
|
GlobalUserPreferences.save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasDraft(){
|
private boolean hasDraft(){
|
||||||
@@ -1356,34 +1440,23 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
statusVisibility = (StatusPrivacy) savedInstanceState.getSerializable("visibility");
|
statusVisibility = (StatusPrivacy) savedInstanceState.getSerializable("visibility");
|
||||||
}
|
}
|
||||||
|
|
||||||
new GetPreferences()
|
Preferences prefs = AccountSessionManager.getInstance().getAccount(accountID).preferences;
|
||||||
.setCallback(new Callback<>(){
|
if (prefs != null) {
|
||||||
@Override
|
// Only override the reply visibility if our preference is more private
|
||||||
public void onSuccess(Preferences result){
|
if (prefs.postingDefaultVisibility.isLessVisibleThan(statusVisibility)) {
|
||||||
// Only override the reply visibility if our preference is more private
|
statusVisibility = switch (prefs.postingDefaultVisibility) {
|
||||||
if (result.postingDefaultVisibility.isLessVisibleThan(statusVisibility)) {
|
case PUBLIC -> StatusPrivacy.PUBLIC;
|
||||||
statusVisibility = switch (result.postingDefaultVisibility) {
|
case UNLISTED -> StatusPrivacy.UNLISTED;
|
||||||
case PUBLIC -> StatusPrivacy.PUBLIC;
|
case PRIVATE -> StatusPrivacy.PRIVATE;
|
||||||
case UNLISTED -> StatusPrivacy.UNLISTED;
|
case DIRECT -> StatusPrivacy.DIRECT;
|
||||||
case PRIVATE -> StatusPrivacy.PRIVATE;
|
};
|
||||||
case DIRECT -> StatusPrivacy.DIRECT;
|
}
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// A saved privacy setting from a previous compose session wins over all
|
// A saved privacy setting from a previous compose session wins over all
|
||||||
if(savedInstanceState !=null){
|
if(savedInstanceState !=null){
|
||||||
statusVisibility = (StatusPrivacy) savedInstanceState.getSerializable("visibility");
|
statusVisibility = (StatusPrivacy) savedInstanceState.getSerializable("visibility");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
updateVisibilityIcon ();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onError(ErrorResponse error){
|
|
||||||
Log.w(TAG, "Unable to get user preferences to set default post privacy");
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.exec(accountID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateVisibilityIcon(){
|
private void updateVisibilityIcon(){
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import org.joinmastodon.android.ui.utils.UiUtils;
|
|||||||
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
@@ -159,6 +160,10 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
|||||||
}
|
}
|
||||||
items.add(new TextItem(R.string.settings_contribute_fork, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/LucasGGamerM/moshidon")));
|
items.add(new TextItem(R.string.settings_contribute_fork, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/LucasGGamerM/moshidon")));
|
||||||
items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache));
|
items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache));
|
||||||
|
items.add(new TextItem(R.string.clear_recent_languages, ()->UiUtils.showConfirmationAlert(getActivity(), R.string.clear_recent_languages, R.string.confirm_clear_recent_languages, R.string.clear, ()->{
|
||||||
|
GlobalUserPreferences.recentLanguages.remove(accountID);
|
||||||
|
GlobalUserPreferences.save();
|
||||||
|
})));
|
||||||
items.add(new TextItem(R.string.log_out, this::confirmLogOut));
|
items.add(new TextItem(R.string.log_out, this::confirmLogOut));
|
||||||
|
|
||||||
items.add(new FooterItem(getString(R.string.settings_app_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)));
|
items.add(new FooterItem(getString(R.string.settings_app_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)));
|
||||||
@@ -733,7 +738,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
|||||||
case BLUE -> R.string.sk_color_theme_blue;
|
case BLUE -> R.string.sk_color_theme_blue;
|
||||||
case ORANGE -> R.string.sk_color_theme_brown;
|
case ORANGE -> R.string.sk_color_theme_brown;
|
||||||
case YELLOW -> R.string.sk_color_theme_yellow;
|
case YELLOW -> R.string.sk_color_theme_yellow;
|
||||||
case MATERIAL3 -> R.string.sk_color_theme_material_you;
|
case MATERIAL3 -> R.string.sk_color_theme_material3;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,28 @@
|
|||||||
package org.joinmastodon.android.fragments;
|
package org.joinmastodon.android.fragments;
|
||||||
|
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
import android.text.style.ReplacementSpan;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.joinmastodon.android.MastodonApp;
|
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.fragments.onboarding.InstanceCatalogSignupFragment;
|
import org.joinmastodon.android.fragments.onboarding.InstanceCatalogSignupFragment;
|
||||||
import org.joinmastodon.android.fragments.onboarding.InstanceChooserLoginFragment;
|
import org.joinmastodon.android.fragments.onboarding.InstanceChooserLoginFragment;
|
||||||
import org.joinmastodon.android.ui.InterpolatingMotionEffect;
|
|
||||||
import org.joinmastodon.android.ui.views.SizeListenerFrameLayout;
|
import org.joinmastodon.android.ui.views.SizeListenerFrameLayout;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
import me.grishka.appkit.fragments.AppKitFragment;
|
import me.grishka.appkit.fragments.AppKitFragment;
|
||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
@@ -23,12 +31,13 @@ public class SplashFragment extends AppKitFragment{
|
|||||||
|
|
||||||
private SizeListenerFrameLayout contentView;
|
private SizeListenerFrameLayout contentView;
|
||||||
private View artContainer, blueFill, greenFill;
|
private View artContainer, blueFill, greenFill;
|
||||||
private InterpolatingMotionEffect motionEffect;
|
private ViewPager2 pager;
|
||||||
|
private ViewGroup pagerDots;
|
||||||
|
private View artClouds, artPlaneElephant, artRightHill, artLeftHill, artCenterHill;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState){
|
public void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
motionEffect=new InterpolatingMotionEffect(MastodonApp.context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -37,15 +46,44 @@ public class SplashFragment extends AppKitFragment{
|
|||||||
contentView=(SizeListenerFrameLayout) inflater.inflate(R.layout.fragment_splash, container, false);
|
contentView=(SizeListenerFrameLayout) inflater.inflate(R.layout.fragment_splash, container, false);
|
||||||
contentView.findViewById(R.id.btn_get_started).setOnClickListener(this::onButtonClick);
|
contentView.findViewById(R.id.btn_get_started).setOnClickListener(this::onButtonClick);
|
||||||
contentView.findViewById(R.id.btn_log_in).setOnClickListener(this::onButtonClick);
|
contentView.findViewById(R.id.btn_log_in).setOnClickListener(this::onButtonClick);
|
||||||
|
artClouds=contentView.findViewById(R.id.art_clouds);
|
||||||
|
artPlaneElephant=contentView.findViewById(R.id.art_plane_elephant);
|
||||||
|
artRightHill=contentView.findViewById(R.id.art_right_hill);
|
||||||
|
artLeftHill=contentView.findViewById(R.id.art_left_hill);
|
||||||
|
artCenterHill=contentView.findViewById(R.id.art_center_hill);
|
||||||
|
pager=contentView.findViewById(R.id.pager);
|
||||||
|
pagerDots=contentView.findViewById(R.id.pager_dots);
|
||||||
|
pager.setAdapter(new PagerAdapter());
|
||||||
|
pager.setOffscreenPageLimit(3);
|
||||||
|
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback(){
|
||||||
|
@Override
|
||||||
|
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels){
|
||||||
|
for(int i=0;i<pagerDots.getChildCount();i++){
|
||||||
|
float alpha;
|
||||||
|
if(i==position){
|
||||||
|
alpha=0.3f+0.7f*(1f-positionOffset);
|
||||||
|
}else if(i==position+1){
|
||||||
|
alpha=0.3f+0.7f*positionOffset;
|
||||||
|
}else{
|
||||||
|
alpha=0.3f;
|
||||||
|
}
|
||||||
|
pagerDots.getChildAt(i).setAlpha(alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
float parallaxProgress=(position+positionOffset)/2f;
|
||||||
|
artClouds.setTranslationX(V.dp(-27)*(position>=1 ? 1f : positionOffset));
|
||||||
|
artPlaneElephant.setTranslationX(V.dp(101.55f)*parallaxProgress);
|
||||||
|
artLeftHill.setTranslationX(V.dp(-88)*parallaxProgress);
|
||||||
|
artLeftHill.setTranslationY(V.dp(24)*parallaxProgress);
|
||||||
|
artRightHill.setTranslationX(V.dp(-88)*parallaxProgress);
|
||||||
|
artRightHill.setTranslationY(V.dp(-24)*parallaxProgress);
|
||||||
|
artCenterHill.setTranslationX(V.dp(-40)*parallaxProgress);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
artContainer=contentView.findViewById(R.id.art_container);
|
artContainer=contentView.findViewById(R.id.art_container);
|
||||||
blueFill=contentView.findViewById(R.id.blue_fill);
|
blueFill=contentView.findViewById(R.id.blue_fill);
|
||||||
greenFill=contentView.findViewById(R.id.green_fill);
|
greenFill=contentView.findViewById(R.id.green_fill);
|
||||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_clouds), V.dp(-5), V.dp(5), V.dp(-5), V.dp(5)));
|
|
||||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_right_hill), V.dp(-15), V.dp(25), V.dp(-10), V.dp(10)));
|
|
||||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_left_hill), V.dp(-25), V.dp(15), V.dp(-15), V.dp(15)));
|
|
||||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_center_hill), V.dp(-14), V.dp(14), V.dp(-5), V.dp(25)));
|
|
||||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_plane_elephant), V.dp(-20), V.dp(12), V.dp(-20), V.dp(12)));
|
|
||||||
|
|
||||||
contentView.setSizeListener(new SizeListenerFrameLayout.OnSizeChangedListener(){
|
contentView.setSizeListener(new SizeListenerFrameLayout.OnSizeChangedListener(){
|
||||||
@Override
|
@Override
|
||||||
@@ -72,10 +110,10 @@ public class SplashFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateArtSize(int w, int h){
|
private void updateArtSize(int w, int h){
|
||||||
float scale=w/(float)V.dp(412);
|
float scale=w/(float)V.dp(360);
|
||||||
artContainer.setScaleX(scale);
|
artContainer.setScaleX(scale);
|
||||||
artContainer.setScaleY(scale);
|
artContainer.setScaleY(scale);
|
||||||
blueFill.setScaleY(h/2f);
|
blueFill.setScaleY(artContainer.getBottom()-V.dp(90));
|
||||||
greenFill.setScaleY(h-artContainer.getBottom()+V.dp(90));
|
greenFill.setScaleY(h-artContainer.getBottom()+V.dp(90));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,15 +139,91 @@ public class SplashFragment extends AppKitFragment{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private class PagerAdapter extends RecyclerView.Adapter<PagerViewHolder>{
|
||||||
protected void onShown(){
|
|
||||||
super.onShown();
|
@NonNull
|
||||||
motionEffect.activate();
|
@Override
|
||||||
|
public PagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||||
|
return new PagerViewHolder(viewType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull PagerViewHolder holder, int position){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount(){
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position){
|
||||||
|
return position;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private class PagerViewHolder extends RecyclerView.ViewHolder{
|
||||||
protected void onHidden(){
|
public PagerViewHolder(int page){
|
||||||
super.onHidden();
|
super(new LinearLayout(getActivity()));
|
||||||
motionEffect.deactivate();
|
LinearLayout ll=(LinearLayout) itemView;
|
||||||
|
ll.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
int pad=V.dp(16);
|
||||||
|
ll.setPadding(pad, pad, pad, pad);
|
||||||
|
ll.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
|
|
||||||
|
TextView title=new TextView(getActivity());
|
||||||
|
title.setTextAppearance(R.style.m3_headline_medium);
|
||||||
|
title.setText(switch(page){
|
||||||
|
case 0 -> {
|
||||||
|
String src=getString(R.string.welcome_page1_title);
|
||||||
|
SpannableString ss=new SpannableString(src);
|
||||||
|
int start=src.indexOf("{logo}");
|
||||||
|
if(start!=-1){
|
||||||
|
LogoSpan span=new LogoSpan(getResources().getDrawable(R.drawable.splash_logo, getActivity().getTheme()));
|
||||||
|
ss.setSpan(span, start, start+6, 0);
|
||||||
|
}
|
||||||
|
yield ss;
|
||||||
|
}
|
||||||
|
case 1 -> getString(R.string.welcome_page2_title);
|
||||||
|
case 2 -> getString(R.string.welcome_page3_title);
|
||||||
|
default -> throw new IllegalStateException("Unexpected value: "+page);
|
||||||
|
});
|
||||||
|
title.setTextColor(0xFF17063B);
|
||||||
|
LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(page==0 ? 46 : 36));
|
||||||
|
lp.bottomMargin=V.dp(page==0 ? 4 : 14);
|
||||||
|
ll.addView(title, lp);
|
||||||
|
|
||||||
|
TextView text=new TextView(getActivity());
|
||||||
|
text.setTextAppearance(R.style.m3_body_medium);
|
||||||
|
text.setText(switch(page){
|
||||||
|
case 0 -> R.string.welcome_page1_text;
|
||||||
|
case 1 -> R.string.welcome_page2_text;
|
||||||
|
case 2 -> R.string.welcome_page3_text;
|
||||||
|
default -> throw new IllegalStateException("Unexpected value: "+page);
|
||||||
|
});
|
||||||
|
text.setTextColor(0xFF17063B);
|
||||||
|
ll.addView(text, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class LogoSpan extends ReplacementSpan{
|
||||||
|
private final Drawable drawable;
|
||||||
|
|
||||||
|
private LogoSpan(Drawable drawable){
|
||||||
|
this.drawable=drawable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm){
|
||||||
|
return drawable.getIntrinsicWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint){
|
||||||
|
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
|
||||||
|
canvas.save();
|
||||||
|
canvas.translate(x, y-V.dp(20));
|
||||||
|
drawable.draw(canvas);
|
||||||
|
canvas.restore();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,11 +88,11 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
|||||||
tabView.setId(switch(switchIndex){
|
tabView.setId(switch(switchIndex){
|
||||||
case 0 -> R.id.discover_local_timeline;
|
case 0 -> R.id.discover_local_timeline;
|
||||||
case 1 -> R.id.discover_federated_timeline;
|
case 1 -> R.id.discover_federated_timeline;
|
||||||
case 2 -> R.id.discover_hashtags;
|
case 2 -> R.id.discover_lists;
|
||||||
case 3 -> R.id.discover_posts;
|
case 3 -> R.id.discover_hashtags;
|
||||||
case 4 -> R.id.discover_news;
|
case 4 -> R.id.discover_posts;
|
||||||
case 5 -> R.id.discover_users;
|
case 5 -> R.id.discover_news;
|
||||||
case 6 -> R.id.discover_lists;
|
case 6 -> R.id.discover_users;
|
||||||
default -> throw new IllegalStateException("Unexpected value: "+switchIndex);
|
default -> throw new IllegalStateException("Unexpected value: "+switchIndex);
|
||||||
});
|
});
|
||||||
tabView.setVisibility(View.GONE);
|
tabView.setVisibility(View.GONE);
|
||||||
@@ -165,11 +165,12 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
|||||||
tab.setText(switch(position){
|
tab.setText(switch(position){
|
||||||
case 0 -> R.string.local_timeline;
|
case 0 -> R.string.local_timeline;
|
||||||
case 1 -> R.string.sk_federated_timeline;
|
case 1 -> R.string.sk_federated_timeline;
|
||||||
case 2 -> R.string.hashtags;
|
case 2 -> R.string.sk_list_timelines;
|
||||||
case 3 -> R.string.posts;
|
case 3 -> R.string.hashtags;
|
||||||
case 4 -> R.string.news;
|
case 4 -> R.string.posts;
|
||||||
case 5 -> R.string.for_you;
|
case 5 -> R.string.news;
|
||||||
case 6 -> R.string.sk_list_timelines;
|
case 6 -> R.string.for_you;
|
||||||
|
|
||||||
default -> throw new IllegalStateException("Unexpected value: "+position);
|
default -> throw new IllegalStateException("Unexpected value: "+position);
|
||||||
});
|
});
|
||||||
tab.view.textView.setAllCaps(true);
|
tab.view.textView.setAllCaps(true);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.joinmastodon.android.fragments.onboarding;
|
package org.joinmastodon.android.fragments.onboarding;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -12,19 +12,21 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.joinmastodon.android.MainActivity;
|
import org.joinmastodon.android.MainActivity;
|
||||||
import org.joinmastodon.android.MastodonApp;
|
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
|
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
|
||||||
import org.joinmastodon.android.api.requests.accounts.ResendConfirmationEmail;
|
import org.joinmastodon.android.api.requests.accounts.ResendConfirmationEmail;
|
||||||
import org.joinmastodon.android.api.requests.accounts.UpdateAccountCredentials;
|
import org.joinmastodon.android.api.requests.accounts.UpdateAccountCredentials;
|
||||||
|
import org.joinmastodon.android.api.session.AccountActivationInfo;
|
||||||
import org.joinmastodon.android.api.session.AccountSession;
|
import org.joinmastodon.android.api.session.AccountSession;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.fragments.HomeFragment;
|
import org.joinmastodon.android.fragments.HomeFragment;
|
||||||
import org.joinmastodon.android.fragments.SettingsFragment;
|
import org.joinmastodon.android.fragments.SettingsFragment;
|
||||||
import org.joinmastodon.android.model.Account;
|
import org.joinmastodon.android.model.Account;
|
||||||
|
import org.joinmastodon.android.ui.AccountSwitcherSheet;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -35,40 +37,50 @@ import me.grishka.appkit.Nav;
|
|||||||
import me.grishka.appkit.api.APIRequest;
|
import me.grishka.appkit.api.APIRequest;
|
||||||
import me.grishka.appkit.api.Callback;
|
import me.grishka.appkit.api.Callback;
|
||||||
import me.grishka.appkit.api.ErrorResponse;
|
import me.grishka.appkit.api.ErrorResponse;
|
||||||
import me.grishka.appkit.fragments.AppKitFragment;
|
import me.grishka.appkit.fragments.ToolbarFragment;
|
||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
public class AccountActivationFragment extends AppKitFragment{
|
public class AccountActivationFragment extends ToolbarFragment{
|
||||||
private String accountID;
|
private String accountID;
|
||||||
|
|
||||||
private Button btn, backBtn;
|
private Button openEmailBtn, resendBtn;
|
||||||
private View buttonBar;
|
private View contentView;
|
||||||
private Handler uiHandler=new Handler(Looper.getMainLooper());
|
private Handler uiHandler=new Handler(Looper.getMainLooper());
|
||||||
private Runnable pollRunnable=this::tryGetAccount;
|
private Runnable pollRunnable=this::tryGetAccount;
|
||||||
private APIRequest currentRequest;
|
private APIRequest currentRequest;
|
||||||
|
private Runnable resendTimer=this::updateResendTimer;
|
||||||
|
private long lastResendTime;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState){
|
public void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
accountID=getArguments().getString("account");
|
accountID=getArguments().getString("account");
|
||||||
|
setTitle(R.string.confirm_email_title);
|
||||||
|
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
|
||||||
|
lastResendTime=session.activationInfo!=null ? session.activationInfo.lastEmailConfirmationResend : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
|
public View onCreateContentView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
|
||||||
View view=inflater.inflate(R.layout.fragment_onboarding_activation, container, false);
|
View view=inflater.inflate(R.layout.fragment_onboarding_activation, container, false);
|
||||||
|
|
||||||
btn=view.findViewById(R.id.btn_next);
|
openEmailBtn=view.findViewById(R.id.btn_next);
|
||||||
btn.setOnClickListener(v->onButtonClick());
|
openEmailBtn.setOnClickListener(this::onOpenEmailClick);
|
||||||
btn.setOnLongClickListener(v->{
|
openEmailBtn.setOnLongClickListener(v->{
|
||||||
Bundle args=new Bundle();
|
Bundle args=new Bundle();
|
||||||
args.putString("account", accountID);
|
args.putString("account", accountID);
|
||||||
Nav.go(getActivity(), SettingsFragment.class, args);
|
Nav.go(getActivity(), SettingsFragment.class, args);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
buttonBar=view.findViewById(R.id.button_bar);
|
resendBtn=view.findViewById(R.id.btn_resend);
|
||||||
view.findViewById(R.id.btn_back).setOnClickListener(v->onBackButtonClick());
|
resendBtn.setOnClickListener(this::onResendClick);
|
||||||
|
TextView text=view.findViewById(R.id.subtitle);
|
||||||
|
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
|
||||||
|
text.setText(getString(R.string.confirm_email_subtitle, session.activationInfo!=null ? session.activationInfo.email : "?"));
|
||||||
|
updateResendTimer();
|
||||||
|
|
||||||
|
contentView=view;
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,14 +92,32 @@ public class AccountActivationFragment extends AppKitFragment{
|
|||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLight));
|
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
protected void onUpdateToolbar(){
|
||||||
|
// super.onUpdateToolbar();
|
||||||
|
getToolbar().setBackground(null);
|
||||||
|
getToolbar().setElevation(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean canGoBack(){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onToolbarNavigationClick(){
|
||||||
|
new AccountSwitcherSheet(getActivity()).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onApplyWindowInsets(WindowInsets insets){
|
public void onApplyWindowInsets(WindowInsets insets){
|
||||||
if(Build.VERSION.SDK_INT>=27){
|
if(Build.VERSION.SDK_INT>=27){
|
||||||
int inset=insets.getSystemWindowInsetBottom();
|
int inset=insets.getSystemWindowInsetBottom();
|
||||||
buttonBar.setPadding(0, 0, 0, inset>0 ? Math.max(inset, V.dp(36)) : 0);
|
contentView.setPadding(0, 0, 0, inset>0 ? Math.max(inset, V.dp(36)) : 0);
|
||||||
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), 0));
|
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), 0));
|
||||||
}else{
|
}else{
|
||||||
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
|
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
|
||||||
@@ -111,7 +141,7 @@ public class AccountActivationFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onButtonClick(){
|
private void onOpenEmailClick(View v){
|
||||||
try{
|
try{
|
||||||
startActivity(Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_EMAIL).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
startActivity(Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_EMAIL).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}catch(ActivityNotFoundException x){
|
}catch(ActivityNotFoundException x){
|
||||||
@@ -119,12 +149,21 @@ public class AccountActivationFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onBackButtonClick(){
|
private void onResendClick(View v){
|
||||||
new ResendConfirmationEmail(null)
|
new ResendConfirmationEmail(null)
|
||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Object result){
|
public void onSuccess(Object result){
|
||||||
Toast.makeText(getActivity(), R.string.resent_email, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getActivity(), R.string.resent_email, Toast.LENGTH_SHORT).show();
|
||||||
|
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
|
||||||
|
if(session.activationInfo==null){
|
||||||
|
session.activationInfo=new AccountActivationInfo("?", System.currentTimeMillis());
|
||||||
|
}else{
|
||||||
|
session.activationInfo.lastEmailConfirmationResend=System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
lastResendTime=session.activationInfo.lastEmailConfirmationResend;
|
||||||
|
AccountSessionManager.getInstance().writeAccountsFile();
|
||||||
|
updateResendTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -152,7 +191,7 @@ public class AccountActivationFragment extends AppKitFragment{
|
|||||||
AccountSessionManager mgr=AccountSessionManager.getInstance();
|
AccountSessionManager mgr=AccountSessionManager.getInstance();
|
||||||
AccountSession session=mgr.getAccount(accountID);
|
AccountSession session=mgr.getAccount(accountID);
|
||||||
mgr.removeAccount(accountID);
|
mgr.removeAccount(accountID);
|
||||||
mgr.addAccount(mgr.getInstanceInfo(session.domain), session.token, result, session.app, true);
|
mgr.addAccount(mgr.getInstanceInfo(session.domain), session.token, result, session.app, null);
|
||||||
String newID=mgr.getLastActiveAccountID();
|
String newID=mgr.getLastActiveAccountID();
|
||||||
Bundle args=new Bundle();
|
Bundle args=new Bundle();
|
||||||
args.putString("account", newID);
|
args.putString("account", newID);
|
||||||
@@ -189,4 +228,25 @@ public class AccountActivationFragment extends AppKitFragment{
|
|||||||
})
|
})
|
||||||
.exec(accountID);
|
.exec(accountID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("DefaultLocale")
|
||||||
|
private void updateResendTimer(){
|
||||||
|
long sinceResend=System.currentTimeMillis()-lastResendTime;
|
||||||
|
if(sinceResend>59_000L){
|
||||||
|
resendBtn.setText(R.string.resend);
|
||||||
|
resendBtn.setEnabled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int seconds=(int)((60_000L-sinceResend)/1000L);
|
||||||
|
resendBtn.setText(String.format("%s (%d)", getString(R.string.resend), seconds));
|
||||||
|
if(resendBtn.isEnabled())
|
||||||
|
resendBtn.setEnabled(false);
|
||||||
|
resendBtn.postDelayed(resendTimer, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView(){
|
||||||
|
super.onDestroyView();
|
||||||
|
resendBtn.removeCallbacks(resendTimer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package org.joinmastodon.android.fragments.onboarding;
|
package org.joinmastodon.android.fragments.onboarding;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.graphics.Paint;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -15,6 +16,7 @@ import android.widget.TextView;
|
|||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.MastodonAPIController;
|
import org.joinmastodon.android.api.MastodonAPIController;
|
||||||
import org.joinmastodon.android.model.Instance;
|
import org.joinmastodon.android.model.Instance;
|
||||||
|
import org.joinmastodon.android.ui.DividerItemDecoration;
|
||||||
import org.joinmastodon.android.ui.OutlineProviders;
|
import org.joinmastodon.android.ui.OutlineProviders;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.jsoup.Jsoup;
|
import org.jsoup.Jsoup;
|
||||||
@@ -33,6 +35,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
import me.grishka.appkit.fragments.AppKitFragment;
|
import me.grishka.appkit.fragments.AppKitFragment;
|
||||||
|
import me.grishka.appkit.fragments.ToolbarFragment;
|
||||||
import me.grishka.appkit.imageloader.ViewImageLoader;
|
import me.grishka.appkit.imageloader.ViewImageLoader;
|
||||||
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
||||||
import me.grishka.appkit.utils.BindableViewHolder;
|
import me.grishka.appkit.utils.BindableViewHolder;
|
||||||
@@ -46,7 +49,7 @@ import okhttp3.Request;
|
|||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
import okhttp3.ResponseBody;
|
import okhttp3.ResponseBody;
|
||||||
|
|
||||||
public class GoogleMadeMeAddThisFragment extends AppKitFragment{
|
public class GoogleMadeMeAddThisFragment extends ToolbarFragment{
|
||||||
private UsableRecyclerView list;
|
private UsableRecyclerView list;
|
||||||
private MergeRecyclerAdapter adapter;
|
private MergeRecyclerAdapter adapter;
|
||||||
private Button btn;
|
private Button btn;
|
||||||
@@ -60,6 +63,7 @@ public class GoogleMadeMeAddThisFragment extends AppKitFragment{
|
|||||||
public void onCreate(Bundle savedInstanceState){
|
public void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setRetainInstance(true);
|
setRetainInstance(true);
|
||||||
|
setTitle(R.string.privacy_policy_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -82,37 +86,24 @@ public class GoogleMadeMeAddThisFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
|
public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
|
||||||
View view=inflater.inflate(R.layout.fragment_onboarding_rules, container, false);
|
View view=inflater.inflate(R.layout.fragment_onboarding_rules, container, false);
|
||||||
|
|
||||||
list=view.findViewById(R.id.list);
|
list=view.findViewById(R.id.list);
|
||||||
list.setLayoutManager(new LinearLayoutManager(getActivity()));
|
list.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||||
View headerView=inflater.inflate(R.layout.item_list_header, list, false);
|
View headerView=inflater.inflate(R.layout.item_list_header_simple, list, false);
|
||||||
TextView title=headerView.findViewById(R.id.title);
|
TextView text=headerView.findViewById(R.id.text);
|
||||||
TextView subtitle=headerView.findViewById(R.id.subtitle);
|
text.setText(R.string.privacy_policy_subtitle);
|
||||||
headerView.findViewById(R.id.step_counter).setVisibility(View.GONE);
|
|
||||||
title.setText(R.string.privacy_policy_title);
|
|
||||||
subtitle.setText(R.string.privacy_policy_subtitle);
|
|
||||||
|
|
||||||
adapter=new MergeRecyclerAdapter();
|
adapter=new MergeRecyclerAdapter();
|
||||||
adapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
adapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
||||||
adapter.addAdapter(itemsAdapter=new ItemsAdapter());
|
adapter.addAdapter(itemsAdapter=new ItemsAdapter());
|
||||||
list.setAdapter(adapter);
|
list.setAdapter(adapter);
|
||||||
list.setSelector(null);
|
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorM3SurfaceVariant, 1, 56, 0, DividerItemDecoration.NOT_FIRST));
|
||||||
list.addItemDecoration(new RecyclerView.ItemDecoration(){
|
|
||||||
@Override
|
|
||||||
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state){
|
|
||||||
if(parent.getChildViewHolder(view) instanceof ItemViewHolder){
|
|
||||||
outRect.left=outRect.right=V.dp(18.5f);
|
|
||||||
outRect.top=V.dp(16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
btn=view.findViewById(R.id.btn_next);
|
btn=view.findViewById(R.id.btn_next);
|
||||||
btn.setOnClickListener(v->onButtonClick());
|
btn.setOnClickListener(v->onButtonClick());
|
||||||
buttonBar=view.findViewById(R.id.button_bar);
|
buttonBar=view.findViewById(R.id.button_bar);
|
||||||
view.findViewById(R.id.btn_back).setOnClickListener(v->Nav.finish(this));
|
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@@ -120,7 +111,15 @@ public class GoogleMadeMeAddThisFragment extends AppKitFragment{
|
|||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLight));
|
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
protected void onUpdateToolbar(){
|
||||||
|
// super.onUpdateToolbar();
|
||||||
|
getToolbar().setBackground(null);
|
||||||
|
getToolbar().setElevation(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onButtonClick(){
|
protected void onButtonClick(){
|
||||||
@@ -192,24 +191,17 @@ public class GoogleMadeMeAddThisFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ItemViewHolder extends BindableViewHolder<Item> implements UsableRecyclerView.Clickable{
|
private class ItemViewHolder extends BindableViewHolder<Item> implements UsableRecyclerView.Clickable{
|
||||||
private final TextView domain, title;
|
private final TextView title;
|
||||||
private final ImageView favicon;
|
|
||||||
|
|
||||||
public ItemViewHolder(){
|
public ItemViewHolder(){
|
||||||
super(getActivity(), R.layout.item_privacy_policy_link, list);
|
super(getActivity(), R.layout.item_privacy_policy_link, list);
|
||||||
domain=findViewById(R.id.domain);
|
|
||||||
title=findViewById(R.id.title);
|
title=findViewById(R.id.title);
|
||||||
favicon=findViewById(R.id.favicon);
|
title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
||||||
itemView.setOutlineProvider(OutlineProviders.roundedRect(10));
|
|
||||||
itemView.setClipToOutline(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBind(Item item){
|
public void onBind(Item item){
|
||||||
domain.setText(item.domain);
|
|
||||||
title.setText(item.title);
|
title.setText(item.title);
|
||||||
|
|
||||||
ViewImageLoader.load(favicon, null, new UrlImageLoaderRequest(item.faviconUrl));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment<CatalogInsta
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState){
|
public void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
isSignup=getArguments().getBoolean("signup");
|
isSignup=getArguments() != null && getArguments().getBoolean("signup");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void proceedWithAuthOrSignup(Instance instance);
|
protected abstract void proceedWithAuthOrSignup(Instance instance);
|
||||||
@@ -187,6 +187,8 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment<CatalogInsta
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void loadInstanceInfo(String _domain, boolean isFromRedirect){
|
protected void loadInstanceInfo(String _domain, boolean isFromRedirect){
|
||||||
|
if(TextUtils.isEmpty(_domain))
|
||||||
|
return;
|
||||||
String domain=normalizeInstanceDomain(_domain);
|
String domain=normalizeInstanceDomain(_domain);
|
||||||
Instance cachedInstance=instancesCache.get(domain);
|
Instance cachedInstance=instancesCache.get(domain);
|
||||||
if(cachedInstance!=null){
|
if(cachedInstance!=null){
|
||||||
@@ -222,7 +224,7 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment<CatalogInsta
|
|||||||
}
|
}
|
||||||
if(Objects.equals(domain, currentSearchQuery) || Objects.equals(currentSearchQuery, redirects.get(domain)) || Objects.equals(currentSearchQuery, redirectsInverse.get(domain))){
|
if(Objects.equals(domain, currentSearchQuery) || Objects.equals(currentSearchQuery, redirects.get(domain)) || Objects.equals(currentSearchQuery, redirectsInverse.get(domain))){
|
||||||
boolean found=false;
|
boolean found=false;
|
||||||
for(CatalogInstance ci : filteredData){
|
for(CatalogInstance ci:filteredData){
|
||||||
if(ci.domain.equals(domain) && ci!=fakeInstance){
|
if(ci.domain.equals(domain) && ci!=fakeInstance){
|
||||||
found=true;
|
found=true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,39 +1,52 @@
|
|||||||
package org.joinmastodon.android.fragments.onboarding;
|
package org.joinmastodon.android.fragments.onboarding;
|
||||||
|
|
||||||
|
import android.animation.Animator;
|
||||||
|
import android.animation.AnimatorListenerAdapter;
|
||||||
|
import android.animation.AnimatorSet;
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.content.res.ColorStateList;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.LayerDrawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.LocaleList;
|
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
|
import android.view.Menu;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.WindowInsets;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
import android.widget.HorizontalScrollView;
|
||||||
|
import android.widget.ImageButton;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||||
import org.joinmastodon.android.api.requests.catalog.GetCatalogCategories;
|
import org.joinmastodon.android.api.requests.catalog.GetCatalogCategories;
|
||||||
import org.joinmastodon.android.api.requests.catalog.GetCatalogInstances;
|
import org.joinmastodon.android.api.requests.catalog.GetCatalogInstances;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
|
||||||
import org.joinmastodon.android.model.Instance;
|
import org.joinmastodon.android.model.Instance;
|
||||||
import org.joinmastodon.android.model.catalog.CatalogCategory;
|
import org.joinmastodon.android.model.catalog.CatalogCategory;
|
||||||
import org.joinmastodon.android.model.catalog.CatalogInstance;
|
import org.joinmastodon.android.model.catalog.CatalogInstance;
|
||||||
import org.joinmastodon.android.ui.BetterItemAnimator;
|
import org.joinmastodon.android.ui.BetterItemAnimator;
|
||||||
import org.joinmastodon.android.ui.DividerItemDecoration;
|
|
||||||
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||||
import org.joinmastodon.android.ui.tabs.TabLayout;
|
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
import org.joinmastodon.android.ui.views.FilterChipView;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Locale;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -42,18 +55,36 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
import me.grishka.appkit.api.Callback;
|
import me.grishka.appkit.api.Callback;
|
||||||
import me.grishka.appkit.api.ErrorResponse;
|
import me.grishka.appkit.api.ErrorResponse;
|
||||||
|
import me.grishka.appkit.fragments.OnBackPressedListener;
|
||||||
|
import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter;
|
||||||
|
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
|
||||||
|
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
||||||
import me.grishka.appkit.utils.BindableViewHolder;
|
import me.grishka.appkit.utils.BindableViewHolder;
|
||||||
|
import me.grishka.appkit.utils.CubicBezierInterpolator;
|
||||||
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
||||||
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
|
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
|
||||||
|
import me.grishka.appkit.utils.V;
|
||||||
import me.grishka.appkit.views.UsableRecyclerView;
|
import me.grishka.appkit.views.UsableRecyclerView;
|
||||||
|
|
||||||
public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
public class InstanceCatalogSignupFragment extends InstanceCatalogFragment implements OnBackPressedListener{
|
||||||
private View headerView;
|
|
||||||
private MastodonAPIRequest<?> getCategoriesRequest;
|
private MastodonAPIRequest<?> getCategoriesRequest;
|
||||||
private TabLayout categoriesList;
|
|
||||||
private String currentCategory="all";
|
private String currentCategory="all";
|
||||||
private List<CatalogCategory> categories=new ArrayList<>();
|
private List<CatalogCategory> categories=new ArrayList<>();
|
||||||
|
private View topBar;
|
||||||
|
|
||||||
|
private List<String> languages=Collections.emptyList();
|
||||||
|
private PopupMenu langFilterMenu, speedFilterMenu;
|
||||||
|
private SignupSpeedFilter currentSignupSpeedFilter=SignupSpeedFilter.INSTANT;
|
||||||
|
private String currentLanguage=null;
|
||||||
|
private boolean searchQueryMode;
|
||||||
|
private LinearLayout filtersWrap;
|
||||||
|
private HorizontalScrollView filtersScroll;
|
||||||
|
private ImageButton backBtn, clearSearchBtn;
|
||||||
|
|
||||||
|
private FilterChipView categoryGeneral, categorySpecialInterests;
|
||||||
|
private List<FilterChipView> regionalFilters;
|
||||||
|
private CatalogInstance.Region chosenRegion;
|
||||||
|
private CategoryChoice categoryChoice;
|
||||||
|
|
||||||
public InstanceCatalogSignupFragment(){
|
public InstanceCatalogSignupFragment(){
|
||||||
super(R.layout.fragment_onboarding_common, 10);
|
super(R.layout.fragment_onboarding_common, 10);
|
||||||
@@ -63,6 +94,12 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
public void onAttach(Context context){
|
public void onAttach(Context context){
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
setRefreshEnabled(false);
|
setRefreshEnabled(false);
|
||||||
|
setRetainInstance(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState){
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
loadData();
|
loadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +112,25 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
if(getActivity()==null)
|
if(getActivity()==null)
|
||||||
return;
|
return;
|
||||||
onDataLoaded(sortInstances(result), false);
|
onDataLoaded(sortInstances(result), false);
|
||||||
|
|
||||||
|
if(langFilterMenu!=null){
|
||||||
|
Menu menu=langFilterMenu.getMenu();
|
||||||
|
menu.clear();
|
||||||
|
menu.add(0, 0, 0, R.string.server_filter_any_language);
|
||||||
|
languages=result.stream().map(i->i.language).distinct().filter(s->s.length()>0).sorted().collect(Collectors.toList());
|
||||||
|
int i=1;
|
||||||
|
for(String lang:languages){
|
||||||
|
Locale locale=Locale.forLanguageTag(lang);
|
||||||
|
String name=locale.getDisplayLanguage(locale);
|
||||||
|
if(name.equals(lang))
|
||||||
|
name=lang.toUpperCase();
|
||||||
|
else
|
||||||
|
name=name.substring(0, 1).toUpperCase()+name.substring(1);
|
||||||
|
menu.add(0, i, 0, name);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
updateFilteredList();
|
updateFilteredList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,14 +167,14 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateCategories(){
|
private void updateCategories(){
|
||||||
categoriesList.removeAllTabs();
|
// categoriesList.removeAllTabs();
|
||||||
for(CatalogCategory cat:categories){
|
// for(CatalogCategory cat:categories){
|
||||||
int titleRes=getTitleForCategory(cat.category);
|
// int titleRes=getTitleForCategory(cat.category);
|
||||||
TabLayout.Tab tab=categoriesList.newTab().setText(titleRes!=0 ? getString(titleRes) : cat.category).setCustomView(R.layout.item_instance_category);
|
// TabLayout.Tab tab=categoriesList.newTab().setText(titleRes!=0 ? getString(titleRes) : cat.category).setCustomView(R.layout.item_instance_category);
|
||||||
ImageView emoji=tab.getCustomView().findViewById(R.id.emoji);
|
// ImageView emoji=tab.getCustomView().findViewById(R.id.emoji);
|
||||||
emoji.setImageResource(getEmojiForCategory(cat.category));
|
// emoji.setImageResource(getEmojiForCategory(cat.category));
|
||||||
categoriesList.addTab(tab);
|
// categoriesList.addTab(tab);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -130,27 +186,77 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected RecyclerView.Adapter getAdapter(){
|
protected RecyclerView.Adapter getAdapter(){
|
||||||
headerView=getActivity().getLayoutInflater().inflate(R.layout.header_onboarding_instance_catalog, list, false);
|
View headerView=new View(getActivity());
|
||||||
searchEdit=headerView.findViewById(R.id.search_edit);
|
headerView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1));
|
||||||
categoriesList=headerView.findViewById(R.id.categories_list);
|
|
||||||
categoriesList.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
|
|
||||||
@Override
|
|
||||||
public void onTabSelected(TabLayout.Tab tab){
|
|
||||||
CatalogCategory category=categories.get(tab.getPosition());
|
|
||||||
currentCategory=category.category;
|
|
||||||
updateFilteredList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
mergeAdapter=new MergeRecyclerAdapter();
|
||||||
public void onTabUnselected(TabLayout.Tab tab){
|
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
||||||
|
mergeAdapter.addAdapter(adapter=new InstancesAdapter());
|
||||||
}
|
return mergeAdapter;
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public void onTabReselected(TabLayout.Tab tab){
|
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
backBtn=view.findViewById(R.id.btn_back);
|
||||||
|
backBtn.setOnClickListener(v->{
|
||||||
|
if(searchQueryMode){
|
||||||
|
setSearchQueryMode(false);
|
||||||
|
}else{
|
||||||
|
Nav.finish(this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
clearSearchBtn=view.findViewById(R.id.clear);
|
||||||
|
clearSearchBtn.setOnClickListener(v->searchEdit.setText(""));
|
||||||
|
nextButton.setEnabled(true);
|
||||||
|
list.setItemAnimator(new BetterItemAnimator());
|
||||||
|
setStatusBarColor(0);
|
||||||
|
topBar=view.findViewById(R.id.top_bar);
|
||||||
|
|
||||||
|
LayerDrawable topBg=(LayerDrawable) topBar.getBackground().mutate();
|
||||||
|
topBar.setBackground(topBg);
|
||||||
|
Drawable topOverlay=topBg.findDrawableByLayerId(R.id.color_overlay);
|
||||||
|
topOverlay.setAlpha(0);
|
||||||
|
|
||||||
|
LayerDrawable btmBg=(LayerDrawable) buttonBar.getBackground().mutate();
|
||||||
|
buttonBar.setBackground(btmBg);
|
||||||
|
Drawable btmOverlay=btmBg.findDrawableByLayerId(R.id.color_overlay);
|
||||||
|
btmOverlay.setAlpha(0);
|
||||||
|
|
||||||
|
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
|
||||||
|
private boolean isAtTop=true;
|
||||||
|
private Animator currentPanelsAnim;
|
||||||
|
@Override
|
||||||
|
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
|
||||||
|
boolean newAtTop=recyclerView.getChildCount()==0 || (recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0))==0 && recyclerView.getChildAt(0).getTop()==recyclerView.getPaddingTop());
|
||||||
|
if(newAtTop!=isAtTop){
|
||||||
|
isAtTop=newAtTop;
|
||||||
|
if(currentPanelsAnim!=null)
|
||||||
|
currentPanelsAnim.cancel();
|
||||||
|
|
||||||
|
AnimatorSet set=new AnimatorSet();
|
||||||
|
set.playTogether(
|
||||||
|
ObjectAnimator.ofInt(topOverlay, "alpha", isAtTop ? 0 : 20),
|
||||||
|
ObjectAnimator.ofInt(btmOverlay, "alpha", isAtTop ? 0 : 20),
|
||||||
|
ObjectAnimator.ofFloat(topBar, View.TRANSLATION_Z, isAtTop ? 0 : V.dp(3)),
|
||||||
|
ObjectAnimator.ofFloat(buttonBar, View.TRANSLATION_Z, isAtTop ? 0 : V.dp(3))
|
||||||
|
);
|
||||||
|
set.setDuration(150);
|
||||||
|
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||||
|
set.addListener(new AnimatorListenerAdapter(){
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation){
|
||||||
|
currentPanelsAnim=null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
set.start();
|
||||||
|
currentPanelsAnim=set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
searchEdit=view.findViewById(R.id.search_edit);
|
||||||
searchEdit.setOnEditorActionListener(this::onSearchEnterPressed);
|
searchEdit.setOnEditorActionListener(this::onSearchEnterPressed);
|
||||||
searchEdit.addTextChangedListener(new TextWatcher(){
|
searchEdit.addTextChangedListener(new TextWatcher(){
|
||||||
@Override
|
@Override
|
||||||
@@ -166,42 +272,145 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable s){
|
public void afterTextChanged(Editable s){
|
||||||
|
if((clearSearchBtn.getVisibility()==View.VISIBLE)!=(s.length()>0)){
|
||||||
|
clearSearchBtn.setVisibility(s.length()>0 ? View.VISIBLE : View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
searchEdit.setOnFocusChangeListener((v, hasFocus)->{
|
||||||
|
if(hasFocus && !searchQueryMode){
|
||||||
|
setSearchQueryMode(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mergeAdapter=new MergeRecyclerAdapter();
|
FilterChipView langFilter=new FilterChipView(getActivity());
|
||||||
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
langFilter.setDrawableEnd(R.drawable.ic_baseline_arrow_drop_down_18);
|
||||||
mergeAdapter.addAdapter(adapter=new InstancesAdapter());
|
langFilter.setText(R.string.server_filter_any_language);
|
||||||
return mergeAdapter;
|
langFilterMenu=new PopupMenu(getContext(), langFilter);
|
||||||
|
langFilter.setOnTouchListener(langFilterMenu.getDragToOpenListener());
|
||||||
|
langFilter.setOnClickListener(v->langFilterMenu.show());
|
||||||
|
filtersWrap=view.findViewById(R.id.filters_container);
|
||||||
|
filtersScroll=view.findViewById(R.id.filters_scroll);
|
||||||
|
filtersWrap.addView(langFilter, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
|
||||||
|
FilterChipView speedFilter=new FilterChipView(getActivity());
|
||||||
|
speedFilter.setDrawableEnd(R.drawable.ic_baseline_arrow_drop_down_18);
|
||||||
|
speedFilterMenu=new PopupMenu(getContext(), speedFilter);
|
||||||
|
speedFilterMenu.getMenu().add(0, 0, 0, R.string.server_filter_any_signup_speed);
|
||||||
|
speedFilterMenu.getMenu().add(0, 1, 0, R.string.server_filter_instant_signup);
|
||||||
|
speedFilterMenu.getMenu().add(0, 2, 0, R.string.server_filter_manual_review);
|
||||||
|
speedFilter.setOnTouchListener(speedFilterMenu.getDragToOpenListener());
|
||||||
|
speedFilter.setOnClickListener(v->speedFilterMenu.show());
|
||||||
|
speedFilter.setText(R.string.server_filter_instant_signup);
|
||||||
|
speedFilter.setSelected(true);
|
||||||
|
filtersWrap.addView(speedFilter, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
|
||||||
|
speedFilterMenu.setOnMenuItemClickListener(item->{
|
||||||
|
speedFilter.setText(item.getTitle());
|
||||||
|
speedFilter.setSelected(item.getItemId()>0);
|
||||||
|
currentSignupSpeedFilter=SignupSpeedFilter.values()[item.getItemId()];
|
||||||
|
updateFilteredList();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
langFilterMenu.setOnMenuItemClickListener(item->{
|
||||||
|
langFilter.setText(item.getTitle());
|
||||||
|
langFilter.setSelected(item.getItemId()>0);
|
||||||
|
currentLanguage=item.getItemId()==0 ? null : languages.get(item.getItemId()-1);
|
||||||
|
updateFilteredList();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
View divider=new View(getActivity());
|
||||||
|
divider.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Outline));
|
||||||
|
filtersWrap.addView(divider, new LinearLayout.LayoutParams(V.dp(.5f), ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
|
|
||||||
|
categoryGeneral=new FilterChipView(getActivity());
|
||||||
|
categoryGeneral.setText(R.string.category_general);
|
||||||
|
categoryGeneral.setTag(CategoryChoice.GENERAL);
|
||||||
|
categoryGeneral.setOnClickListener(this::onCategoryFilterClick);
|
||||||
|
filtersWrap.addView(categoryGeneral, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
categorySpecialInterests=new FilterChipView(getActivity());
|
||||||
|
categorySpecialInterests.setText(R.string.category_special_interests);
|
||||||
|
categorySpecialInterests.setTag(CategoryChoice.SPECIAL);
|
||||||
|
categorySpecialInterests.setOnClickListener(this::onCategoryFilterClick);
|
||||||
|
filtersWrap.addView(categorySpecialInterests, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
|
||||||
|
regionalFilters=Arrays.stream(CatalogInstance.Region.values()).map(r->{
|
||||||
|
FilterChipView fv=new FilterChipView(getActivity());
|
||||||
|
fv.setTag(r);
|
||||||
|
fv.setText(switch(r){
|
||||||
|
case EUROPE -> R.string.server_filter_region_europe;
|
||||||
|
case NORTH_AMERICA -> R.string.server_filter_region_north_america;
|
||||||
|
case SOUTH_AMERICA -> R.string.server_filter_region_south_america;
|
||||||
|
case AFRICA -> R.string.server_filter_region_africa;
|
||||||
|
case ASIA -> R.string.server_filter_region_asia;
|
||||||
|
case OCEANIA -> R.string.server_filter_region_oceania;
|
||||||
|
});
|
||||||
|
fv.setSelected(r==chosenRegion);
|
||||||
|
fv.setOnClickListener(this::onRegionFilterClick);
|
||||||
|
filtersWrap.addView(fv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
return fv;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onRegionFilterClick(View v){
|
||||||
|
CatalogInstance.Region r=(CatalogInstance.Region) v.getTag();
|
||||||
|
if(chosenRegion==r){
|
||||||
|
chosenRegion=null;
|
||||||
|
v.setSelected(false);
|
||||||
|
}else{
|
||||||
|
if(chosenRegion!=null)
|
||||||
|
filtersWrap.findViewWithTag(chosenRegion).setSelected(false);
|
||||||
|
chosenRegion=r;
|
||||||
|
v.setSelected(true);
|
||||||
|
}
|
||||||
|
updateFilteredList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCategoryFilterClick(View v){
|
||||||
|
CategoryChoice c=(CategoryChoice) v.getTag();
|
||||||
|
if(categoryChoice==c){
|
||||||
|
categoryChoice=null;
|
||||||
|
v.setSelected(false);
|
||||||
|
}else{
|
||||||
|
if(categoryChoice!=null)
|
||||||
|
filtersWrap.findViewWithTag(categoryChoice).setSelected(false);
|
||||||
|
categoryChoice=c;
|
||||||
|
v.setSelected(true);
|
||||||
|
}
|
||||||
|
updateFilteredList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
protected void onNextClick(View v){
|
||||||
super.onViewCreated(view, savedInstanceState);
|
if(chosenInstance==null){
|
||||||
view.findViewById(R.id.btn_back).setOnClickListener(v->Nav.finish(this));
|
String lang=Locale.getDefault().getLanguage();
|
||||||
list.setItemAnimator(new BetterItemAnimator());
|
List<CatalogInstance> instances=data.stream().filter(ci->!ci.approvalRequired && ("general".equals(ci.category) || (ci.categories!=null && ci.categories.contains("general"))) && (lang.equals(ci.language) || (ci.languages!=null && ci.languages.contains(lang)))).collect(Collectors.toList());
|
||||||
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 1, 16, 16, DividerItemDecoration.NOT_FIRST));
|
if(instances.isEmpty()){
|
||||||
view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLight));
|
instances=data.stream().filter(ci->!ci.approvalRequired && ("general".equals(ci.category) || (ci.categories!=null && ci.categories.contains("general")))).collect(Collectors.toList());
|
||||||
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLight));
|
}
|
||||||
|
if(instances.isEmpty()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chosenInstance=instances.get(new Random().nextInt(instances.size()));
|
||||||
|
}
|
||||||
|
super.onNextClick(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void proceedWithAuthOrSignup(Instance instance){
|
protected void proceedWithAuthOrSignup(Instance instance){
|
||||||
getActivity().getSystemService(InputMethodManager.class).hideSoftInputFromWindow(contentView.getWindowToken(), 0);
|
getActivity().getSystemService(InputMethodManager.class).hideSoftInputFromWindow(contentView.getWindowToken(), 0);
|
||||||
if(isSignup){
|
if(!instance.registrations){
|
||||||
if(!instance.registrations){
|
new M3AlertDialogBuilder(getActivity())
|
||||||
new M3AlertDialogBuilder(getActivity())
|
.setTitle(R.string.error)
|
||||||
.setTitle(R.string.error)
|
.setMessage(R.string.instance_signup_closed)
|
||||||
.setMessage(R.string.instance_signup_closed)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.setPositiveButton(R.string.ok, null)
|
.show();
|
||||||
.show();
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
Bundle args=new Bundle();
|
|
||||||
args.putParcelable("instance", Parcels.wrap(instance));
|
|
||||||
Nav.go(getActivity(), InstanceRulesFragment.class, args);
|
|
||||||
}else{
|
|
||||||
}
|
}
|
||||||
|
Bundle args=new Bundle();
|
||||||
|
args.putParcelable("instance", Parcels.wrap(instance));
|
||||||
|
Nav.go(getActivity(), InstanceRulesFragment.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
// private String getEmojiForCategory(String category){
|
// private String getEmojiForCategory(String category){
|
||||||
@@ -265,11 +474,29 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
protected void updateFilteredList(){
|
protected void updateFilteredList(){
|
||||||
ArrayList<CatalogInstance> prevData=new ArrayList<>(filteredData);
|
ArrayList<CatalogInstance> prevData=new ArrayList<>(filteredData);
|
||||||
filteredData.clear();
|
filteredData.clear();
|
||||||
for(CatalogInstance instance:data){
|
if(searchQueryMode){
|
||||||
if(currentCategory.equals("all") || instance.categories.contains(currentCategory)){
|
if(!TextUtils.isEmpty(currentSearchQuery)){
|
||||||
if(TextUtils.isEmpty(currentSearchQuery) || instance.domain.contains(currentSearchQuery)){
|
for(CatalogInstance instance:data){
|
||||||
if(instance.domain.equals(currentSearchQuery) || !isSignup || !instance.approvalRequired)
|
if(instance.domain.contains(currentSearchQuery)){
|
||||||
filteredData.add(instance);
|
filteredData.add(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for(CatalogInstance instance:data){
|
||||||
|
if(categoryChoice==null || categoryChoice.matches(instance.category)){
|
||||||
|
if(chosenRegion==null || instance.region==chosenRegion){
|
||||||
|
boolean signupSpeedMatches=switch(currentSignupSpeedFilter){
|
||||||
|
case ANY -> true;
|
||||||
|
case INSTANT -> !instance.approvalRequired;
|
||||||
|
case REVIEWED -> instance.approvalRequired;
|
||||||
|
};
|
||||||
|
if(signupSpeedMatches){
|
||||||
|
if(currentLanguage==null || instance.languages.contains(currentLanguage)){
|
||||||
|
filteredData.add(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -296,8 +523,46 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
}).dispatchUpdatesTo(adapter);
|
}).dispatchUpdatesTo(adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onApplyWindowInsets(WindowInsets insets){
|
||||||
|
topBar.setPadding(0, insets.getSystemWindowInsetTop(), 0, 0);
|
||||||
|
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
|
||||||
|
}
|
||||||
|
|
||||||
private class InstancesAdapter extends UsableRecyclerView.Adapter<InstanceCatalogSignupFragment.InstanceViewHolder>{
|
@Override
|
||||||
|
public boolean onBackPressed(){
|
||||||
|
if(searchQueryMode){
|
||||||
|
setSearchQueryMode(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSearchQueryMode(boolean enabled){
|
||||||
|
searchQueryMode=enabled;
|
||||||
|
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams) searchEdit.getLayoutParams();
|
||||||
|
if(searchQueryMode){
|
||||||
|
filtersScroll.setVisibility(View.GONE);
|
||||||
|
lp.removeRule(RelativeLayout.END_OF);
|
||||||
|
backBtn.setScaleX(0.83333333f);
|
||||||
|
backBtn.setScaleY(0.83333333f);
|
||||||
|
backBtn.setTranslationX(V.dp(8));
|
||||||
|
searchEdit.setCompoundDrawableTintList(ColorStateList.valueOf(0));
|
||||||
|
}else{
|
||||||
|
filtersScroll.setVisibility(View.VISIBLE);
|
||||||
|
searchEdit.clearFocus();
|
||||||
|
searchEdit.setText("");
|
||||||
|
lp.addRule(RelativeLayout.END_OF, R.id.btn_back);
|
||||||
|
getActivity().getSystemService(InputMethodManager.class).hideSoftInputFromWindow(searchEdit.getWindowToken(), 0);
|
||||||
|
backBtn.setScaleX(1);
|
||||||
|
backBtn.setScaleY(1);
|
||||||
|
backBtn.setTranslationX(0);
|
||||||
|
searchEdit.setCompoundDrawableTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), R.attr.colorM3OnSurfaceVariant)));
|
||||||
|
}
|
||||||
|
updateFilteredList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InstancesAdapter extends UsableRecyclerView.Adapter<InstanceCatalogSignupFragment.InstanceViewHolder> implements ImageLoaderRecyclerAdapter{
|
||||||
public InstancesAdapter(){
|
public InstancesAdapter(){
|
||||||
super(imgLoader);
|
super(imgLoader);
|
||||||
}
|
}
|
||||||
@@ -323,32 +588,53 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
public int getItemViewType(int position){
|
public int getItemViewType(int position){
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getImageCountForItem(int position){
|
||||||
|
return filteredData.get(position).thumbnailRequest!=null ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ImageLoaderRequest getImageRequest(int position, int image){
|
||||||
|
return filteredData.get(position).thumbnailRequest;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class InstanceViewHolder extends BindableViewHolder<CatalogInstance> implements UsableRecyclerView.Clickable{
|
private class InstanceViewHolder extends BindableViewHolder<CatalogInstance> implements UsableRecyclerView.DisableableClickable, ImageLoaderViewHolder{
|
||||||
private final TextView title, description, userCount, lang;
|
private final TextView title, description;
|
||||||
private final RadioButton radioButton;
|
private final RadioButton radioButton;
|
||||||
|
private final ImageView thumbnail;
|
||||||
|
private boolean enabled;
|
||||||
|
|
||||||
public InstanceViewHolder(){
|
public InstanceViewHolder(){
|
||||||
super(getActivity(), R.layout.item_instance_catalog, list);
|
super(getActivity(), R.layout.item_instance_catalog, list);
|
||||||
title=findViewById(R.id.title);
|
title=findViewById(R.id.title);
|
||||||
description=findViewById(R.id.description);
|
description=findViewById(R.id.description);
|
||||||
userCount=findViewById(R.id.user_count);
|
|
||||||
lang=findViewById(R.id.lang);
|
|
||||||
radioButton=findViewById(R.id.radiobtn);
|
radioButton=findViewById(R.id.radiobtn);
|
||||||
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N){
|
thumbnail=findViewById(R.id.image);
|
||||||
UiUtils.fixCompoundDrawableTintOnAndroid6(userCount);
|
|
||||||
UiUtils.fixCompoundDrawableTintOnAndroid6(lang);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBind(CatalogInstance item){
|
public void onBind(CatalogInstance item){
|
||||||
title.setText(item.normalizedDomain);
|
title.setText(item.normalizedDomain);
|
||||||
description.setText(item.description);
|
|
||||||
userCount.setText(UiUtils.abbreviateNumber(item.totalUsers));
|
|
||||||
lang.setText(item.language.toUpperCase());
|
|
||||||
radioButton.setChecked(chosenInstance==item);
|
radioButton.setChecked(chosenInstance==item);
|
||||||
|
if(item.thumbnailRequest==null)
|
||||||
|
thumbnail.setImageDrawable(null);
|
||||||
|
Instance realInstance=instancesCache.get(item.normalizedDomain);
|
||||||
|
float alpha;
|
||||||
|
if(realInstance!=null && !realInstance.registrations){
|
||||||
|
alpha=0.38f;
|
||||||
|
description.setText(R.string.not_accepting_new_members);
|
||||||
|
enabled=false;
|
||||||
|
}else{
|
||||||
|
alpha=1f;
|
||||||
|
description.setText(item.description);
|
||||||
|
enabled=true;
|
||||||
|
}
|
||||||
|
title.setAlpha(alpha);
|
||||||
|
description.setAlpha(alpha);
|
||||||
|
radioButton.setAlpha(alpha);
|
||||||
|
thumbnail.setAlpha(alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -358,10 +644,17 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
if(chosenInstance!=null){
|
if(chosenInstance!=null){
|
||||||
int idx=filteredData.indexOf(chosenInstance);
|
int idx=filteredData.indexOf(chosenInstance);
|
||||||
if(idx!=-1){
|
if(idx!=-1){
|
||||||
RecyclerView.ViewHolder holder=list.findViewHolderForAdapterPosition(mergeAdapter.getPositionForAdapter(adapter)+idx);
|
boolean found=false;
|
||||||
if(holder instanceof InstanceCatalogSignupFragment.InstanceViewHolder ivh){
|
for(int i=0;i<list.getChildCount();i++){
|
||||||
ivh.radioButton.setChecked(false);
|
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||||
|
if(holder.getAbsoluteAdapterPosition()==mergeAdapter.getPositionForAdapter(adapter)+idx && holder instanceof InstanceViewHolder ivh){
|
||||||
|
ivh.radioButton.setChecked(false);
|
||||||
|
found=true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if(!found)
|
||||||
|
adapter.notifyItemChanged(idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
radioButton.setChecked(true);
|
radioButton.setChecked(true);
|
||||||
@@ -370,5 +663,36 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment{
|
|||||||
chosenInstance=item;
|
chosenInstance=item;
|
||||||
loadInstanceInfo(chosenInstance.domain, false);
|
loadInstanceInfo(chosenInstance.domain, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setImage(int index, Drawable image){
|
||||||
|
thumbnail.setImageDrawable(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearImage(int index){
|
||||||
|
setImage(index, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(){
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum SignupSpeedFilter{
|
||||||
|
ANY,
|
||||||
|
INSTANT,
|
||||||
|
REVIEWED
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum CategoryChoice{
|
||||||
|
GENERAL,
|
||||||
|
SPECIAL;
|
||||||
|
|
||||||
|
public boolean matches(String category){
|
||||||
|
boolean isGeneral=(category==null || "general".equals(category));
|
||||||
|
return (this==GENERAL)==isGeneral;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.joinmastodon.android.fragments.onboarding;
|
package org.joinmastodon.android.fragments.onboarding;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -22,14 +23,14 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
import me.grishka.appkit.fragments.AppKitFragment;
|
import me.grishka.appkit.fragments.ToolbarFragment;
|
||||||
import me.grishka.appkit.utils.BindableViewHolder;
|
import me.grishka.appkit.utils.BindableViewHolder;
|
||||||
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
||||||
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
|
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
|
||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
import me.grishka.appkit.views.UsableRecyclerView;
|
import me.grishka.appkit.views.UsableRecyclerView;
|
||||||
|
|
||||||
public class InstanceRulesFragment extends AppKitFragment{
|
public class InstanceRulesFragment extends ToolbarFragment{
|
||||||
private UsableRecyclerView list;
|
private UsableRecyclerView list;
|
||||||
private MergeRecyclerAdapter adapter;
|
private MergeRecyclerAdapter adapter;
|
||||||
private Button btn;
|
private Button btn;
|
||||||
@@ -47,31 +48,28 @@ public class InstanceRulesFragment extends AppKitFragment{
|
|||||||
super.onAttach(activity);
|
super.onAttach(activity);
|
||||||
setNavigationBarColor(UiUtils.getThemeColor(activity, R.attr.colorWindowBackground));
|
setNavigationBarColor(UiUtils.getThemeColor(activity, R.attr.colorWindowBackground));
|
||||||
instance=Parcels.unwrap(getArguments().getParcelable("instance"));
|
instance=Parcels.unwrap(getArguments().getParcelable("instance"));
|
||||||
|
setTitle(R.string.instance_rules_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
|
public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
|
||||||
View view=inflater.inflate(R.layout.fragment_onboarding_rules, container, false);
|
View view=inflater.inflate(R.layout.fragment_onboarding_rules, container, false);
|
||||||
|
|
||||||
list=view.findViewById(R.id.list);
|
list=view.findViewById(R.id.list);
|
||||||
list.setLayoutManager(new LinearLayoutManager(getActivity()));
|
list.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||||
View headerView=inflater.inflate(R.layout.item_list_header, list, false);
|
View headerView=inflater.inflate(R.layout.item_list_header_simple, list, false);
|
||||||
TextView title=headerView.findViewById(R.id.title);
|
TextView text=headerView.findViewById(R.id.text);
|
||||||
TextView subtitle=headerView.findViewById(R.id.subtitle);
|
text.setText(getString(R.string.instance_rules_subtitle, instance.uri));
|
||||||
headerView.findViewById(R.id.step_counter).setVisibility(View.GONE);
|
|
||||||
title.setText(R.string.instance_rules_title);
|
|
||||||
subtitle.setText(getString(R.string.instance_rules_subtitle, instance.uri));
|
|
||||||
|
|
||||||
adapter=new MergeRecyclerAdapter();
|
adapter=new MergeRecyclerAdapter();
|
||||||
adapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
adapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
||||||
adapter.addAdapter(new ItemsAdapter());
|
adapter.addAdapter(new ItemsAdapter());
|
||||||
list.setAdapter(adapter);
|
list.setAdapter(adapter);
|
||||||
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 1, 16, 16, DividerItemDecoration.NOT_FIRST));
|
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorM3SurfaceVariant, 1, 56, 0, DividerItemDecoration.NOT_FIRST));
|
||||||
|
|
||||||
btn=view.findViewById(R.id.btn_next);
|
btn=view.findViewById(R.id.btn_next);
|
||||||
btn.setOnClickListener(v->onButtonClick());
|
btn.setOnClickListener(v->onButtonClick());
|
||||||
buttonBar=view.findViewById(R.id.button_bar);
|
buttonBar=view.findViewById(R.id.button_bar);
|
||||||
view.findViewById(R.id.btn_back).setOnClickListener(v->Nav.finish(this));
|
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@@ -79,7 +77,15 @@ public class InstanceRulesFragment extends AppKitFragment{
|
|||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLight));
|
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
protected void onUpdateToolbar(){
|
||||||
|
// super.onUpdateToolbar();
|
||||||
|
getToolbar().setBackground(null);
|
||||||
|
getToolbar().setElevation(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onButtonClick(){
|
protected void onButtonClick(){
|
||||||
@@ -119,23 +125,22 @@ public class InstanceRulesFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ItemViewHolder extends BindableViewHolder<Instance.Rule>{
|
private class ItemViewHolder extends BindableViewHolder<Instance.Rule>{
|
||||||
private final TextView title, subtitle;
|
private final TextView text, number;
|
||||||
private final ImageView checkbox;
|
|
||||||
|
|
||||||
public ItemViewHolder(){
|
public ItemViewHolder(){
|
||||||
super(getActivity(), R.layout.item_report_choice, list);
|
super(getActivity(), R.layout.item_server_rule, list);
|
||||||
title=findViewById(R.id.title);
|
text=findViewById(R.id.text);
|
||||||
subtitle=findViewById(R.id.subtitle);
|
number=findViewById(R.id.number);
|
||||||
checkbox=findViewById(R.id.checkbox);
|
|
||||||
subtitle.setVisibility(View.GONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("DefaultLocale")
|
||||||
@Override
|
@Override
|
||||||
public void onBind(Instance.Rule item){
|
public void onBind(Instance.Rule item){
|
||||||
if(item.parsedText==null){
|
if(item.parsedText==null){
|
||||||
item.parsedText=HtmlParser.parseLinks(item.text);
|
item.parsedText=HtmlParser.parseLinks(item.text);
|
||||||
}
|
}
|
||||||
title.setText(item.parsedText);
|
text.setText(item.parsedText);
|
||||||
|
number.setText(String.format("%d", getAbsoluteAdapterPosition()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,259 @@
|
|||||||
|
package org.joinmastodon.android.fragments.onboarding;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.ColorStateList;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.RadioButton;
|
||||||
|
import android.widget.Space;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.R;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
import org.joinmastodon.android.model.Instance;
|
||||||
|
import org.joinmastodon.android.model.catalog.CatalogInstance;
|
||||||
|
import org.joinmastodon.android.ui.BetterItemAnimator;
|
||||||
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import me.grishka.appkit.FragmentStackActivity;
|
||||||
|
import me.grishka.appkit.utils.BindableViewHolder;
|
||||||
|
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
||||||
|
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
|
||||||
|
import me.grishka.appkit.utils.V;
|
||||||
|
import me.grishka.appkit.views.UsableRecyclerView;
|
||||||
|
|
||||||
|
public class MoshidonLoginFragment extends InstanceCatalogFragment {
|
||||||
|
private View headerView;
|
||||||
|
|
||||||
|
public MoshidonLoginFragment() {
|
||||||
|
super(R.layout.fragment_moshidon_welcome, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context){
|
||||||
|
super.onAttach(context);
|
||||||
|
setRefreshEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState){
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
dataLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
protected void onUpdateToolbar(){
|
||||||
|
// super.onUpdateToolbar();
|
||||||
|
|
||||||
|
if (!canGoBack()) {
|
||||||
|
ImageView toolbarLogo=new ImageView(getActivity());
|
||||||
|
toolbarLogo.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
|
toolbarLogo.setImageResource(R.drawable.logo);
|
||||||
|
toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary)));
|
||||||
|
|
||||||
|
FrameLayout logoWrap=new FrameLayout(getActivity());
|
||||||
|
FrameLayout.LayoutParams logoParams=new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
|
||||||
|
logoParams.setMargins(0, V.dp(2), 0, 0);
|
||||||
|
logoWrap.addView(toolbarLogo, logoParams);
|
||||||
|
|
||||||
|
getToolbar().addView(logoWrap, new Toolbar.LayoutParams(Gravity.CENTER));
|
||||||
|
} else {
|
||||||
|
setTitle(R.string.add_account);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void proceedWithAuthOrSignup(Instance instance) {
|
||||||
|
AccountSessionManager.getInstance().authenticate(getActivity(), instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateFilteredList(){
|
||||||
|
boolean addFakeInstance = currentSearchQuery.length()>0 && currentSearchQuery.matches("^\\S+\\.[^\\.]+$");
|
||||||
|
if(addFakeInstance){
|
||||||
|
fakeInstance.domain=fakeInstance.normalizedDomain=currentSearchQuery;
|
||||||
|
fakeInstance.description=getString(R.string.loading_instance);
|
||||||
|
if(filteredData.size()>0 && filteredData.get(0)==fakeInstance){
|
||||||
|
if(list.findViewHolderForAdapterPosition(1) instanceof InstanceViewHolder ivh){
|
||||||
|
ivh.rebind();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(filteredData.isEmpty()){
|
||||||
|
filteredData.add(fakeInstance);
|
||||||
|
adapter.notifyItemInserted(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ArrayList<CatalogInstance> prevData=new ArrayList<>(filteredData);
|
||||||
|
filteredData.clear();
|
||||||
|
if(currentSearchQuery.length()>0){
|
||||||
|
boolean foundExactMatch=false;
|
||||||
|
for(CatalogInstance inst:data){
|
||||||
|
if(inst.normalizedDomain.contains(currentSearchQuery)){
|
||||||
|
filteredData.add(inst);
|
||||||
|
if(inst.normalizedDomain.equals(currentSearchQuery))
|
||||||
|
foundExactMatch=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!foundExactMatch && addFakeInstance) {
|
||||||
|
filteredData.add(0, fakeInstance);
|
||||||
|
adapter.notifyItemChanged(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UiUtils.updateList(prevData, filteredData, list, adapter, Objects::equals);
|
||||||
|
for(int i=0;i<list.getChildCount();i++){
|
||||||
|
list.getChildAt(i).invalidateOutline();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorWindowBackground));
|
||||||
|
list.setItemAnimator(new BetterItemAnimator());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doLoadData(int offset, int count) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected RecyclerView.Adapter getAdapter(){
|
||||||
|
headerView=getActivity().getLayoutInflater().inflate(R.layout.header_megalodon_welcome, list, false);
|
||||||
|
searchEdit=headerView.findViewById(R.id.search_edit);
|
||||||
|
searchEdit.setOnEditorActionListener(this::onSearchEnterPressed);
|
||||||
|
|
||||||
|
headerView.findViewById(R.id.more).setVisibility(View.GONE);
|
||||||
|
headerView.findViewById(R.id.visibility).setVisibility(View.GONE);
|
||||||
|
((TextView) headerView.findViewById(R.id.username)).setText("@moshidon");
|
||||||
|
((TextView) headerView.findViewById(R.id.name)).setText(R.string.sk_app_name);
|
||||||
|
((TextView) headerView.findViewById(R.id.timestamp)).setText(R.string.time_now);
|
||||||
|
((ImageView) headerView.findViewById(R.id.avatar)).setImageDrawable(getActivity().getDrawable(R.mipmap.ic_launcher));
|
||||||
|
((FragmentStackActivity) getActivity()).invalidateSystemBarColors(this);
|
||||||
|
|
||||||
|
searchEdit.addTextChangedListener(new TextWatcher(){
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count){
|
||||||
|
nextButton.setEnabled(false);
|
||||||
|
chosenInstance = null;
|
||||||
|
searchEdit.removeCallbacks(searchDebouncer);
|
||||||
|
searchEdit.postDelayed(searchDebouncer, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s){}
|
||||||
|
});
|
||||||
|
|
||||||
|
mergeAdapter=new MergeRecyclerAdapter();
|
||||||
|
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(headerView));
|
||||||
|
mergeAdapter.addAdapter(adapter=new InstancesAdapter());
|
||||||
|
View spacer = new Space(getActivity());
|
||||||
|
spacer.setMinimumHeight(V.dp(8));
|
||||||
|
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(spacer));
|
||||||
|
return mergeAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InstancesAdapter extends UsableRecyclerView.Adapter<InstanceViewHolder>{
|
||||||
|
public InstancesAdapter(){
|
||||||
|
super(imgLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public InstanceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||||
|
return new InstanceViewHolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(InstanceViewHolder holder, int position){
|
||||||
|
holder.bind(filteredData.get(position));
|
||||||
|
chosenInstance = filteredData.get(position);
|
||||||
|
if (chosenInstance != fakeInstance) nextButton.setEnabled(true);
|
||||||
|
super.onBindViewHolder(holder, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount(){
|
||||||
|
return filteredData.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InstanceViewHolder extends BindableViewHolder<CatalogInstance> implements UsableRecyclerView.Clickable{
|
||||||
|
private final TextView title, description, userCount, lang;
|
||||||
|
private final RadioButton radioButton;
|
||||||
|
|
||||||
|
public InstanceViewHolder(){
|
||||||
|
super(getActivity(), R.layout.item_moshidon_instance, list);
|
||||||
|
|
||||||
|
// itemView.setPadding(V.dp(16), V.dp(16), V.dp(16), V.dp(16));
|
||||||
|
// TypedValue value = new TypedValue();
|
||||||
|
// getActivity().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
|
||||||
|
// itemView.setBackground(getActivity().getTheme().getDrawable(R.drawable.bg_search_field));
|
||||||
|
title=findViewById(R.id.title);
|
||||||
|
description=findViewById(R.id.description);
|
||||||
|
userCount=findViewById(R.id.user_count);
|
||||||
|
lang=findViewById(R.id.lang);
|
||||||
|
radioButton=findViewById(R.id.radiobtn);
|
||||||
|
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N){
|
||||||
|
UiUtils.fixCompoundDrawableTintOnAndroid6(userCount);
|
||||||
|
UiUtils.fixCompoundDrawableTintOnAndroid6(lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBind(CatalogInstance item){
|
||||||
|
title.setText(item.normalizedDomain);
|
||||||
|
description.setText(item.description);
|
||||||
|
if (item == fakeInstance) {
|
||||||
|
userCount.setVisibility(View.GONE);
|
||||||
|
lang.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
userCount.setVisibility(View.VISIBLE);
|
||||||
|
lang.setVisibility(View.VISIBLE);
|
||||||
|
userCount.setText(UiUtils.abbreviateNumber(item.totalUsers));
|
||||||
|
lang.setText(item.language.toUpperCase());
|
||||||
|
}
|
||||||
|
radioButton.setChecked(chosenInstance==item);
|
||||||
|
radioButton.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(){
|
||||||
|
if(chosenInstance!=null){
|
||||||
|
int idx=filteredData.indexOf(chosenInstance);
|
||||||
|
if(idx!=-1){
|
||||||
|
RecyclerView.ViewHolder holder=list.findViewHolderForAdapterPosition(mergeAdapter.getPositionForAdapter(adapter)+idx);
|
||||||
|
if(holder instanceof InstanceViewHolder ivh){
|
||||||
|
ivh.radioButton.setChecked(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
radioButton.setChecked(true);
|
||||||
|
if(chosenInstance==null)
|
||||||
|
nextButton.setEnabled(true);
|
||||||
|
chosenInstance=item;
|
||||||
|
loadInstanceInfo(chosenInstance.domain, false);
|
||||||
|
onNextClick(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,14 +25,15 @@ import org.joinmastodon.android.api.MastodonDetailedErrorResponse;
|
|||||||
import org.joinmastodon.android.api.requests.accounts.RegisterAccount;
|
import org.joinmastodon.android.api.requests.accounts.RegisterAccount;
|
||||||
import org.joinmastodon.android.api.requests.oauth.CreateOAuthApp;
|
import org.joinmastodon.android.api.requests.oauth.CreateOAuthApp;
|
||||||
import org.joinmastodon.android.api.requests.oauth.GetOauthToken;
|
import org.joinmastodon.android.api.requests.oauth.GetOauthToken;
|
||||||
|
import org.joinmastodon.android.api.session.AccountActivationInfo;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.model.Account;
|
import org.joinmastodon.android.model.Account;
|
||||||
import org.joinmastodon.android.model.Application;
|
import org.joinmastodon.android.model.Application;
|
||||||
import org.joinmastodon.android.model.Instance;
|
import org.joinmastodon.android.model.Instance;
|
||||||
import org.joinmastodon.android.model.Token;
|
import org.joinmastodon.android.model.Token;
|
||||||
import org.joinmastodon.android.ui.OutlineProviders;
|
|
||||||
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
|
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
import org.joinmastodon.android.ui.views.FloatingHintEditTextLayout;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -49,30 +50,28 @@ import me.grishka.appkit.Nav;
|
|||||||
import me.grishka.appkit.api.APIRequest;
|
import me.grishka.appkit.api.APIRequest;
|
||||||
import me.grishka.appkit.api.Callback;
|
import me.grishka.appkit.api.Callback;
|
||||||
import me.grishka.appkit.api.ErrorResponse;
|
import me.grishka.appkit.api.ErrorResponse;
|
||||||
import me.grishka.appkit.fragments.AppKitFragment;
|
import me.grishka.appkit.fragments.ToolbarFragment;
|
||||||
import me.grishka.appkit.imageloader.ViewImageLoader;
|
import me.grishka.appkit.imageloader.ViewImageLoader;
|
||||||
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
public class SignupFragment extends AppKitFragment{
|
public class SignupFragment extends ToolbarFragment{
|
||||||
private static final int AVATAR_RESULT=198;
|
private static final int AVATAR_RESULT=198;
|
||||||
private static final String TAG="SignupFragment";
|
private static final String TAG="SignupFragment";
|
||||||
|
|
||||||
private Instance instance;
|
private Instance instance;
|
||||||
|
|
||||||
private EditText displayName, username, email, password, reason;
|
private EditText displayName, username, email, password, passwordConfirm, reason;
|
||||||
|
private FloatingHintEditTextLayout displayNameWrap, usernameWrap, emailWrap, passwordWrap, passwordConfirmWrap, reasonWrap;
|
||||||
private TextView reasonExplain;
|
private TextView reasonExplain;
|
||||||
private Button btn;
|
private Button btn;
|
||||||
private View buttonBar;
|
private View buttonBar;
|
||||||
private TextWatcher buttonStateUpdater=new SimpleTextWatcher(e->updateButtonState());
|
private TextWatcher buttonStateUpdater=new SimpleTextWatcher(e->updateButtonState());
|
||||||
private ImageView avatar;
|
|
||||||
private APIRequest currentBackgroundRequest;
|
private APIRequest currentBackgroundRequest;
|
||||||
private Application apiApplication;
|
private Application apiApplication;
|
||||||
private Token apiToken;
|
private Token apiToken;
|
||||||
private boolean submitAfterGettingToken;
|
private boolean submitAfterGettingToken;
|
||||||
private ProgressDialog progressDialog;
|
private ProgressDialog progressDialog;
|
||||||
private Uri avatarUri;
|
|
||||||
private File avatarFile;
|
|
||||||
private HashSet<EditText> errorFields=new HashSet<>();
|
private HashSet<EditText> errorFields=new HashSet<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -81,25 +80,30 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
setRetainInstance(true);
|
setRetainInstance(true);
|
||||||
instance=Parcels.unwrap(getArguments().getParcelable("instance"));
|
instance=Parcels.unwrap(getArguments().getParcelable("instance"));
|
||||||
createAppAndGetToken();
|
createAppAndGetToken();
|
||||||
|
setTitle(R.string.signup_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
|
public View onCreateContentView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
|
||||||
View view=inflater.inflate(R.layout.fragment_onboarding_signup, container, false);
|
View view=inflater.inflate(R.layout.fragment_onboarding_signup, container, false);
|
||||||
|
|
||||||
TextView title=view.findViewById(R.id.title);
|
|
||||||
TextView domain=view.findViewById(R.id.domain);
|
TextView domain=view.findViewById(R.id.domain);
|
||||||
displayName=view.findViewById(R.id.display_name);
|
displayName=view.findViewById(R.id.display_name);
|
||||||
username=view.findViewById(R.id.username);
|
username=view.findViewById(R.id.username);
|
||||||
email=view.findViewById(R.id.email);
|
email=view.findViewById(R.id.email);
|
||||||
password=view.findViewById(R.id.password);
|
password=view.findViewById(R.id.password);
|
||||||
avatar=view.findViewById(R.id.avatar);
|
passwordConfirm=view.findViewById(R.id.password_confirm);
|
||||||
reason=view.findViewById(R.id.reason);
|
reason=view.findViewById(R.id.reason);
|
||||||
reasonExplain=view.findViewById(R.id.reason_explain);
|
reasonExplain=view.findViewById(R.id.reason_explain);
|
||||||
View avaWrap=view.findViewById(R.id.ava_wrap);
|
|
||||||
|
|
||||||
title.setText(getString(R.string.signup_title, instance.uri));
|
displayNameWrap=view.findViewById(R.id.display_name_wrap);
|
||||||
|
usernameWrap=view.findViewById(R.id.username_wrap);
|
||||||
|
emailWrap=view.findViewById(R.id.email_wrap);
|
||||||
|
passwordWrap=view.findViewById(R.id.password_wrap);
|
||||||
|
passwordConfirmWrap=view.findViewById(R.id.password_confirm_wrap);
|
||||||
|
reasonWrap=view.findViewById(R.id.reason_wrap);
|
||||||
|
|
||||||
domain.setText('@'+instance.uri);
|
domain.setText('@'+instance.uri);
|
||||||
|
|
||||||
username.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
username.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
||||||
@@ -114,23 +118,20 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
btn=view.findViewById(R.id.btn_next);
|
btn=view.findViewById(R.id.btn_next);
|
||||||
btn.setOnClickListener(v->onButtonClick());
|
btn.setOnClickListener(v->onButtonClick());
|
||||||
buttonBar=view.findViewById(R.id.button_bar);
|
buttonBar=view.findViewById(R.id.button_bar);
|
||||||
view.findViewById(R.id.btn_back).setOnClickListener(v->Nav.finish(this));
|
|
||||||
updateButtonState();
|
updateButtonState();
|
||||||
|
|
||||||
username.addTextChangedListener(buttonStateUpdater);
|
username.addTextChangedListener(buttonStateUpdater);
|
||||||
email.addTextChangedListener(buttonStateUpdater);
|
email.addTextChangedListener(buttonStateUpdater);
|
||||||
password.addTextChangedListener(buttonStateUpdater);
|
password.addTextChangedListener(buttonStateUpdater);
|
||||||
|
passwordConfirm.addTextChangedListener(buttonStateUpdater);
|
||||||
reason.addTextChangedListener(buttonStateUpdater);
|
reason.addTextChangedListener(buttonStateUpdater);
|
||||||
|
|
||||||
username.addTextChangedListener(new ErrorClearingListener(username));
|
username.addTextChangedListener(new ErrorClearingListener(username));
|
||||||
email.addTextChangedListener(new ErrorClearingListener(email));
|
email.addTextChangedListener(new ErrorClearingListener(email));
|
||||||
password.addTextChangedListener(new ErrorClearingListener(password));
|
password.addTextChangedListener(new ErrorClearingListener(password));
|
||||||
|
passwordConfirm.addTextChangedListener(new ErrorClearingListener(passwordConfirm));
|
||||||
reason.addTextChangedListener(new ErrorClearingListener(reason));
|
reason.addTextChangedListener(new ErrorClearingListener(reason));
|
||||||
|
|
||||||
avaWrap.setOutlineProvider(OutlineProviders.roundedRect(22));
|
|
||||||
avaWrap.setClipToOutline(true);
|
|
||||||
avaWrap.setOnClickListener(v->onAvatarClick());
|
|
||||||
|
|
||||||
if(!instance.approvalRequired){
|
if(!instance.approvalRequired){
|
||||||
reason.setVisibility(View.GONE);
|
reason.setVisibility(View.GONE);
|
||||||
reasonExplain.setVisibility(View.GONE);
|
reasonExplain.setVisibility(View.GONE);
|
||||||
@@ -142,10 +143,23 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLight));
|
setStatusBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Background));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
protected void onUpdateToolbar(){
|
||||||
|
// super.onUpdateToolbar();
|
||||||
|
getToolbar().setBackground(null);
|
||||||
|
getToolbar().setElevation(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onButtonClick(){
|
private void onButtonClick(){
|
||||||
|
if(!password.getText().equals(passwordConfirm.getText())){
|
||||||
|
passwordConfirm.setError(getString(R.string.signup_passwords_dont_match));
|
||||||
|
passwordConfirmWrap.setErrorState();
|
||||||
|
return;
|
||||||
|
}
|
||||||
showProgressDialog();
|
showProgressDialog();
|
||||||
if(currentBackgroundRequest!=null){
|
if(currentBackgroundRequest!=null){
|
||||||
submitAfterGettingToken=true;
|
submitAfterGettingToken=true;
|
||||||
@@ -160,32 +174,8 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyAvatar(Runnable onDone){
|
|
||||||
// Need to copy the avatar from the content provider to somewhere accessible in case the app gets killed between signup and account activation
|
|
||||||
Activity activity=getActivity();
|
|
||||||
MastodonAPIController.runInBackground(()->{
|
|
||||||
String origName=UiUtils.getFileName(avatarUri);
|
|
||||||
avatarFile=new File(activity.getCacheDir(), System.currentTimeMillis()+origName.substring(origName.lastIndexOf('.')));
|
|
||||||
try(InputStream in=activity.getContentResolver().openInputStream(avatarUri);
|
|
||||||
FileOutputStream out=new FileOutputStream(avatarFile)){
|
|
||||||
byte[] buf=new byte[10240];
|
|
||||||
int read;
|
|
||||||
while((read=in.read(buf))>0){
|
|
||||||
out.write(buf, 0, read);
|
|
||||||
}
|
|
||||||
}catch(IOException x){
|
|
||||||
Log.w(TAG, "copyAvatar: error copying", x);
|
|
||||||
}
|
|
||||||
activity.runOnUiThread(onDone);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void submit(){
|
private void submit(){
|
||||||
if(avatarUri!=null && (avatarFile==null || !avatarFile.exists())){
|
actuallySubmit();
|
||||||
copyAvatar(this::actuallySubmit);
|
|
||||||
}else{
|
|
||||||
actuallySubmit();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void actuallySubmit(){
|
private void actuallySubmit(){
|
||||||
@@ -204,9 +194,7 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
fakeAccount.acct=fakeAccount.username=username;
|
fakeAccount.acct=fakeAccount.username=username;
|
||||||
fakeAccount.id="tmp"+System.currentTimeMillis();
|
fakeAccount.id="tmp"+System.currentTimeMillis();
|
||||||
fakeAccount.displayName=displayName.getText().toString();
|
fakeAccount.displayName=displayName.getText().toString();
|
||||||
if(avatarFile!=null)
|
AccountSessionManager.getInstance().addAccount(instance, result, fakeAccount, apiApplication, new AccountActivationInfo(email, System.currentTimeMillis()));
|
||||||
fakeAccount.avatar=avatarFile.getAbsolutePath();
|
|
||||||
AccountSessionManager.getInstance().addAccount(instance, result, fakeAccount, apiApplication, false);
|
|
||||||
Bundle args=new Bundle();
|
Bundle args=new Bundle();
|
||||||
args.putString("account", AccountSessionManager.getInstance().getLastActiveAccountID());
|
args.putString("account", AccountSessionManager.getInstance().getLastActiveAccountID());
|
||||||
Nav.goClearingStack(getActivity(), AccountActivationFragment.class, args);
|
Nav.goClearingStack(getActivity(), AccountActivationFragment.class, args);
|
||||||
@@ -225,6 +213,7 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
field.setError(fieldErrors.get(fieldName).stream().map(err->err.description).collect(Collectors.joining("\n")));
|
field.setError(fieldErrors.get(fieldName).stream().map(err->err.description).collect(Collectors.joining("\n")));
|
||||||
|
getFieldWrapByName(fieldName).setErrorState();
|
||||||
errorFields.add(field);
|
errorFields.add(field);
|
||||||
if(first){
|
if(first){
|
||||||
first=false;
|
first=false;
|
||||||
@@ -252,6 +241,16 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private FloatingHintEditTextLayout getFieldWrapByName(String name){
|
||||||
|
return switch(name){
|
||||||
|
case "email" -> emailWrap;
|
||||||
|
case "username" -> usernameWrap;
|
||||||
|
case "password" -> passwordWrap;
|
||||||
|
case "reason" -> reasonWrap;
|
||||||
|
default -> null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private void showProgressDialog(){
|
private void showProgressDialog(){
|
||||||
if(progressDialog==null){
|
if(progressDialog==null){
|
||||||
progressDialog=new ProgressDialog(getActivity());
|
progressDialog=new ProgressDialog(getActivity());
|
||||||
@@ -262,7 +261,7 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateButtonState(){
|
private void updateButtonState(){
|
||||||
btn.setEnabled(username.length()>0 && email.length()>0 && email.getText().toString().contains("@") && password.length()>=8 && (!instance.approvalRequired || reason.length()>0));
|
btn.setEnabled(username.length()>0 && email.length()>0 && email.getText().toString().contains("@") && password.length()>=8 && passwordConfirm.length()>=8 && (!instance.approvalRequired || reason.length()>0));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createAppAndGetToken(){
|
private void createAppAndGetToken(){
|
||||||
@@ -324,20 +323,6 @@ public class SignupFragment extends AppKitFragment{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityResult(int requestCode, int resultCode, Intent data){
|
|
||||||
if(requestCode==AVATAR_RESULT && resultCode==Activity.RESULT_OK){
|
|
||||||
avatarUri=data.getData();
|
|
||||||
if(avatarFile!=null && avatarFile.exists())
|
|
||||||
avatarFile.delete();
|
|
||||||
ViewImageLoader.load(avatar, getResources().getDrawable(R.drawable.default_avatar), new UrlImageLoaderRequest(avatarUri, V.dp(100), V.dp(100)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onAvatarClick(){
|
|
||||||
startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).setType("image/*").addCategory(Intent.CATEGORY_OPENABLE), AVATAR_RESULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ErrorClearingListener implements TextWatcher{
|
private class ErrorClearingListener implements TextWatcher{
|
||||||
public final EditText editText;
|
public final EditText editText;
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,8 @@ public class Instance extends BaseModel{
|
|||||||
// non-standard field in some Mastodon forks
|
// non-standard field in some Mastodon forks
|
||||||
public int maxTootChars;
|
public int maxTootChars;
|
||||||
|
|
||||||
|
public V2 v2;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postprocess() throws ObjectValidationException{
|
public void postprocess() throws ObjectValidationException{
|
||||||
super.postprocess();
|
super.postprocess();
|
||||||
@@ -176,4 +178,19 @@ public class Instance extends BaseModel{
|
|||||||
public int minExpiration;
|
public int minExpiration;
|
||||||
public int maxExpiration;
|
public int maxExpiration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
public static class V2 extends BaseModel {
|
||||||
|
public V2.Configuration configuration;
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
public static class Configuration {
|
||||||
|
public TranslationConfiguration translation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
public static class TranslationConfiguration{
|
||||||
|
public boolean enabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
package org.joinmastodon.android.model.catalog;
|
package org.joinmastodon.android.model.catalog;
|
||||||
|
|
||||||
|
import android.graphics.Region;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
import org.joinmastodon.android.api.AllFieldsAreRequired;
|
import org.joinmastodon.android.api.AllFieldsAreRequired;
|
||||||
import org.joinmastodon.android.api.ObjectValidationException;
|
import org.joinmastodon.android.api.ObjectValidationException;
|
||||||
import org.joinmastodon.android.model.BaseModel;
|
import org.joinmastodon.android.model.BaseModel;
|
||||||
@@ -7,13 +12,17 @@ import org.joinmastodon.android.model.BaseModel;
|
|||||||
import java.net.IDN;
|
import java.net.IDN;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
||||||
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
@AllFieldsAreRequired
|
@AllFieldsAreRequired
|
||||||
public class CatalogInstance extends BaseModel{
|
public class CatalogInstance extends BaseModel{
|
||||||
public String domain;
|
public String domain;
|
||||||
public String version;
|
public String version;
|
||||||
public String description;
|
public String description;
|
||||||
public List<String> languages;
|
public List<String> languages;
|
||||||
public String region;
|
@SerializedName("region")
|
||||||
|
private String _region;
|
||||||
public List<String> categories;
|
public List<String> categories;
|
||||||
public String proxiedThumbnail;
|
public String proxiedThumbnail;
|
||||||
public int totalUsers;
|
public int totalUsers;
|
||||||
@@ -22,7 +31,9 @@ public class CatalogInstance extends BaseModel{
|
|||||||
public String language;
|
public String language;
|
||||||
public String category;
|
public String category;
|
||||||
|
|
||||||
|
public transient Region region;
|
||||||
public transient String normalizedDomain;
|
public transient String normalizedDomain;
|
||||||
|
public transient UrlImageLoaderRequest thumbnailRequest;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postprocess() throws ObjectValidationException{
|
public void postprocess() throws ObjectValidationException{
|
||||||
@@ -31,6 +42,14 @@ public class CatalogInstance extends BaseModel{
|
|||||||
normalizedDomain=IDN.toUnicode(domain);
|
normalizedDomain=IDN.toUnicode(domain);
|
||||||
else
|
else
|
||||||
normalizedDomain=domain;
|
normalizedDomain=domain;
|
||||||
|
if(!TextUtils.isEmpty(_region)){
|
||||||
|
try{
|
||||||
|
region=Region.valueOf(_region.toUpperCase());
|
||||||
|
}catch(IllegalArgumentException ignore){}
|
||||||
|
}
|
||||||
|
if(!TextUtils.isEmpty(proxiedThumbnail)){
|
||||||
|
thumbnailRequest=new UrlImageLoaderRequest(proxiedThumbnail, 0, V.dp(56));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -50,4 +69,13 @@ public class CatalogInstance extends BaseModel{
|
|||||||
", category='"+category+'\''+
|
", category='"+category+'\''+
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum Region{
|
||||||
|
EUROPE,
|
||||||
|
NORTH_AMERICA,
|
||||||
|
SOUTH_AMERICA,
|
||||||
|
AFRICA,
|
||||||
|
ASIA,
|
||||||
|
OCEANIA
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,12 @@ package org.joinmastodon.android.ui;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.graphics.drawable.Animatable;
|
import android.graphics.drawable.Animatable;
|
||||||
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
@@ -25,8 +23,7 @@ import org.joinmastodon.android.R;
|
|||||||
import org.joinmastodon.android.api.requests.oauth.RevokeOauthToken;
|
import org.joinmastodon.android.api.requests.oauth.RevokeOauthToken;
|
||||||
import org.joinmastodon.android.api.session.AccountSession;
|
import org.joinmastodon.android.api.session.AccountSession;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.fragments.SplashFragment;
|
import org.joinmastodon.android.fragments.onboarding.MoshidonLoginFragment;
|
||||||
import org.joinmastodon.android.model.Account;
|
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -80,7 +77,7 @@ public class AccountSwitcherSheet extends BottomSheet{
|
|||||||
holder.avatar.setImageResource(R.drawable.ic_fluent_add_circle_24_filled);
|
holder.avatar.setImageResource(R.drawable.ic_fluent_add_circle_24_filled);
|
||||||
holder.avatar.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(activity, android.R.attr.textColorPrimary)));
|
holder.avatar.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(activity, android.R.attr.textColorPrimary)));
|
||||||
adapter.addAdapter(new ClickableSingleViewRecyclerAdapter(holder.itemView, ()->{
|
adapter.addAdapter(new ClickableSingleViewRecyclerAdapter(holder.itemView, ()->{
|
||||||
Nav.go(activity, SplashFragment.class, null);
|
Nav.go(activity, MoshidonLoginFragment.class, null);
|
||||||
dismiss();
|
dismiss();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -243,7 +240,10 @@ public class AccountSwitcherSheet extends BottomSheet{
|
|||||||
|
|
||||||
public WrappedAccount(AccountSession session){
|
public WrappedAccount(AccountSession session){
|
||||||
this.session=session;
|
this.session=session;
|
||||||
req=new UrlImageLoaderRequest(GlobalUserPreferences.playGifs ? session.self.avatar : session.self.avatarStatic, V.dp(50), V.dp(50));
|
if(session.self.avatar!=null)
|
||||||
|
req=new UrlImageLoaderRequest(GlobalUserPreferences.playGifs ? session.self.avatar : session.self.avatarStatic, V.dp(50), V.dp(50));
|
||||||
|
else
|
||||||
|
req=null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package org.joinmastodon.android.ui.views;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.ColorStateList;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.R;
|
||||||
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
|
||||||
|
import androidx.annotation.DrawableRes;
|
||||||
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
|
public class FilterChipView extends Button{
|
||||||
|
|
||||||
|
private boolean currentlySelected;
|
||||||
|
|
||||||
|
public FilterChipView(Context context){
|
||||||
|
this(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FilterChipView(Context context, AttributeSet attrs){
|
||||||
|
this(context, attrs, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FilterChipView(Context context, AttributeSet attrs, int defStyle){
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
setCompoundDrawablePadding(V.dp(8));
|
||||||
|
setBackgroundResource(R.drawable.bg_filter_chip);
|
||||||
|
setTextAppearance(R.style.m3_label_large);
|
||||||
|
setTextColor(getResources().getColorStateList(R.color.filter_chip_text, context.getTheme()));
|
||||||
|
setCompoundDrawableTintList(ColorStateList.valueOf(UiUtils.getThemeColor(context, R.attr.colorM3OnSurface)));
|
||||||
|
updatePadding();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawableStateChanged(){
|
||||||
|
super.drawableStateChanged();
|
||||||
|
if(currentlySelected==isSelected())
|
||||||
|
return;
|
||||||
|
currentlySelected=isSelected();
|
||||||
|
Drawable start=currentlySelected ? getResources().getDrawable(R.drawable.ic_baseline_check_18, getContext().getTheme()) : null;
|
||||||
|
Drawable end=getCompoundDrawablesRelative()[2];
|
||||||
|
setCompoundDrawablesRelativeWithIntrinsicBounds(start, null, end, null);
|
||||||
|
updatePadding();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updatePadding(){
|
||||||
|
int vertical=V.dp(6);
|
||||||
|
Drawable[] drawables=getCompoundDrawablesRelative();
|
||||||
|
setPaddingRelative(V.dp(drawables[0]==null ? 16 : 8), vertical, V.dp(drawables[2]==null ? 16 : 8), vertical);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDrawableEnd(@DrawableRes int drawable){
|
||||||
|
setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, drawable, 0);
|
||||||
|
updatePadding();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,19 +5,34 @@ import android.animation.AnimatorListenerAdapter;
|
|||||||
import android.animation.AnimatorSet;
|
import android.animation.AnimatorSet;
|
||||||
import android.animation.ObjectAnimator;
|
import android.animation.ObjectAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.ColorStateList;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.ColorFilter;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.RectF;
|
||||||
|
import android.graphics.Region;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.InsetDrawable;
|
||||||
|
import android.os.Build;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewTreeObserver;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
|
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
|
||||||
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
|
|
||||||
|
import androidx.annotation.Keep;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import me.grishka.appkit.utils.CubicBezierInterpolator;
|
import me.grishka.appkit.utils.CubicBezierInterpolator;
|
||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
@@ -28,6 +43,10 @@ public class FloatingHintEditTextLayout extends FrameLayout{
|
|||||||
private int offsetY;
|
private int offsetY;
|
||||||
private boolean hintVisible;
|
private boolean hintVisible;
|
||||||
private Animator currentAnim;
|
private Animator currentAnim;
|
||||||
|
private float animProgress;
|
||||||
|
private RectF tmpRect=new RectF();
|
||||||
|
private ColorStateList labelColors, origHintColors;
|
||||||
|
private boolean errorState;
|
||||||
|
|
||||||
public FloatingHintEditTextLayout(Context context){
|
public FloatingHintEditTextLayout(Context context){
|
||||||
this(context, null);
|
this(context, null);
|
||||||
@@ -44,7 +63,9 @@ public class FloatingHintEditTextLayout extends FrameLayout{
|
|||||||
TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.FloatingHintEditTextLayout);
|
TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.FloatingHintEditTextLayout);
|
||||||
labelTextSize=ta.getDimensionPixelSize(R.styleable.FloatingHintEditTextLayout_android_labelTextSize, V.dp(12));
|
labelTextSize=ta.getDimensionPixelSize(R.styleable.FloatingHintEditTextLayout_android_labelTextSize, V.dp(12));
|
||||||
offsetY=ta.getDimensionPixelOffset(R.styleable.FloatingHintEditTextLayout_editTextOffsetY, 0);
|
offsetY=ta.getDimensionPixelOffset(R.styleable.FloatingHintEditTextLayout_editTextOffsetY, 0);
|
||||||
|
labelColors=ta.getColorStateList(R.styleable.FloatingHintEditTextLayout_labelTextColor);
|
||||||
ta.recycle();
|
ta.recycle();
|
||||||
|
setAddStatesFromChildren(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -58,13 +79,15 @@ public class FloatingHintEditTextLayout extends FrameLayout{
|
|||||||
|
|
||||||
label=new TextView(getContext());
|
label=new TextView(getContext());
|
||||||
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, labelTextSize);
|
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, labelTextSize);
|
||||||
label.setTextColor(edit.getHintTextColors());
|
// label.setTextColor(labelColors==null ? edit.getHintTextColors() : labelColors);
|
||||||
|
origHintColors=edit.getHintTextColors();
|
||||||
label.setText(edit.getHint());
|
label.setText(edit.getHint());
|
||||||
label.setSingleLine();
|
label.setSingleLine();
|
||||||
label.setPivotX(0f);
|
label.setPivotX(0f);
|
||||||
label.setPivotY(0f);
|
label.setPivotY(0f);
|
||||||
|
label.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
|
||||||
LayoutParams lp=new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.TOP);
|
LayoutParams lp=new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START | Gravity.TOP);
|
||||||
lp.setMarginStart(edit.getPaddingStart());
|
lp.setMarginStart(edit.getPaddingStart()+((LayoutParams)edit.getLayoutParams()).getMarginStart());
|
||||||
addView(label, lp);
|
addView(label, lp);
|
||||||
|
|
||||||
hintVisible=edit.getText().length()==0;
|
hintVisible=edit.getText().length()==0;
|
||||||
@@ -75,6 +98,11 @@ public class FloatingHintEditTextLayout extends FrameLayout{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onTextChanged(Editable text){
|
private void onTextChanged(Editable text){
|
||||||
|
if(errorState){
|
||||||
|
errorState=false;
|
||||||
|
setForeground(getResources().getDrawable(R.drawable.bg_m3_outlined_text_field));
|
||||||
|
refreshDrawableState();
|
||||||
|
}
|
||||||
boolean newHintVisible=text.length()==0;
|
boolean newHintVisible=text.length()==0;
|
||||||
if(newHintVisible==hintVisible)
|
if(newHintVisible==hintVisible)
|
||||||
return;
|
return;
|
||||||
@@ -83,42 +111,210 @@ public class FloatingHintEditTextLayout extends FrameLayout{
|
|||||||
hintVisible=newHintVisible;
|
hintVisible=newHintVisible;
|
||||||
|
|
||||||
label.setAlpha(1);
|
label.setAlpha(1);
|
||||||
float scale=edit.getLineHeight()/(float)label.getLineHeight();
|
edit.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
||||||
float transY=edit.getHeight()/2f-edit.getLineHeight()/2f+(edit.getTop()-label.getTop())-(label.getHeight()/2f-label.getLineHeight()/2f);
|
|
||||||
|
|
||||||
AnimatorSet anim=new AnimatorSet();
|
|
||||||
if(hintVisible){
|
|
||||||
anim.playTogether(
|
|
||||||
ObjectAnimator.ofFloat(edit, TRANSLATION_Y, 0),
|
|
||||||
ObjectAnimator.ofFloat(label, SCALE_X, scale),
|
|
||||||
ObjectAnimator.ofFloat(label, SCALE_Y, scale),
|
|
||||||
ObjectAnimator.ofFloat(label, TRANSLATION_Y, transY)
|
|
||||||
);
|
|
||||||
edit.setHintTextColor(0);
|
|
||||||
}else{
|
|
||||||
label.setScaleX(scale);
|
|
||||||
label.setScaleY(scale);
|
|
||||||
label.setTranslationY(transY);
|
|
||||||
anim.playTogether(
|
|
||||||
ObjectAnimator.ofFloat(edit, TRANSLATION_Y, offsetY),
|
|
||||||
ObjectAnimator.ofFloat(label, SCALE_X, 1f),
|
|
||||||
ObjectAnimator.ofFloat(label, SCALE_Y, 1f),
|
|
||||||
ObjectAnimator.ofFloat(label, TRANSLATION_Y, 0f)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
anim.setDuration(150);
|
|
||||||
anim.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
|
||||||
anim.start();
|
|
||||||
anim.addListener(new AnimatorListenerAdapter(){
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animation){
|
public boolean onPreDraw(){
|
||||||
currentAnim=null;
|
edit.getViewTreeObserver().removeOnPreDrawListener(this);
|
||||||
|
|
||||||
|
float scale=edit.getLineHeight()/(float)label.getLineHeight();
|
||||||
|
float transY=edit.getHeight()/2f-edit.getLineHeight()/2f+(edit.getTop()-label.getTop())-(label.getHeight()/2f-label.getLineHeight()/2f);
|
||||||
|
|
||||||
|
AnimatorSet anim=new AnimatorSet();
|
||||||
if(hintVisible){
|
if(hintVisible){
|
||||||
label.setAlpha(0);
|
anim.playTogether(
|
||||||
edit.setHintTextColor(label.getTextColors());
|
ObjectAnimator.ofFloat(edit, TRANSLATION_Y, 0),
|
||||||
|
ObjectAnimator.ofFloat(label, SCALE_X, scale),
|
||||||
|
ObjectAnimator.ofFloat(label, SCALE_Y, scale),
|
||||||
|
ObjectAnimator.ofFloat(label, TRANSLATION_Y, transY),
|
||||||
|
ObjectAnimator.ofFloat(FloatingHintEditTextLayout.this, "animProgress", 0f)
|
||||||
|
);
|
||||||
|
edit.setHintTextColor(0);
|
||||||
|
}else{
|
||||||
|
label.setScaleX(scale);
|
||||||
|
label.setScaleY(scale);
|
||||||
|
label.setTranslationY(transY);
|
||||||
|
anim.playTogether(
|
||||||
|
ObjectAnimator.ofFloat(edit, TRANSLATION_Y, offsetY),
|
||||||
|
ObjectAnimator.ofFloat(label, SCALE_X, 1f),
|
||||||
|
ObjectAnimator.ofFloat(label, SCALE_Y, 1f),
|
||||||
|
ObjectAnimator.ofFloat(label, TRANSLATION_Y, 0f),
|
||||||
|
ObjectAnimator.ofFloat(FloatingHintEditTextLayout.this, "animProgress", 1f)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
anim.setDuration(150);
|
||||||
|
anim.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||||
|
anim.start();
|
||||||
|
anim.addListener(new AnimatorListenerAdapter(){
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation){
|
||||||
|
currentAnim=null;
|
||||||
|
if(hintVisible){
|
||||||
|
label.setAlpha(0);
|
||||||
|
edit.setHintTextColor(origHintColors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
currentAnim=anim;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
currentAnim=anim;
|
}
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
public void setAnimProgress(float progress){
|
||||||
|
animProgress=progress;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
public float getAnimProgress(){
|
||||||
|
return animProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDrawForeground(Canvas canvas){
|
||||||
|
if(getForeground()!=null && animProgress>0){
|
||||||
|
canvas.save();
|
||||||
|
float width=(label.getWidth()+V.dp(8))*animProgress;
|
||||||
|
float centerX=label.getLeft()+label.getWidth()/2f;
|
||||||
|
tmpRect.set(centerX-width/2f, label.getTop(), centerX+width/2f, label.getBottom());
|
||||||
|
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)
|
||||||
|
canvas.clipOutRect(tmpRect);
|
||||||
|
else
|
||||||
|
canvas.clipRect(tmpRect, Region.Op.DIFFERENCE);
|
||||||
|
super.onDrawForeground(canvas);
|
||||||
|
canvas.restore();
|
||||||
|
}else{
|
||||||
|
super.onDrawForeground(canvas);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setForeground(Drawable foreground){
|
||||||
|
super.setForeground(new PaddedForegroundDrawable(foreground));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Drawable getForeground(){
|
||||||
|
if(super.getForeground() instanceof PaddedForegroundDrawable pfd){
|
||||||
|
return pfd.wrapped;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawableStateChanged(){
|
||||||
|
super.drawableStateChanged();
|
||||||
|
if(label==null || errorState)
|
||||||
|
return;
|
||||||
|
ColorStateList color=labelColors==null ? origHintColors : labelColors;
|
||||||
|
label.setTextColor(color.getColorForState(getDrawableState(), 0xff00ff00));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setErrorState(){
|
||||||
|
if(errorState)
|
||||||
|
return;
|
||||||
|
errorState=true;
|
||||||
|
setForeground(getResources().getDrawable(R.drawable.bg_m3_outlined_text_field_error, getContext().getTheme()));
|
||||||
|
label.setTextColor(UiUtils.getThemeColor(getContext(), R.attr.colorM3Error));
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PaddedForegroundDrawable extends Drawable{
|
||||||
|
private final Drawable wrapped;
|
||||||
|
|
||||||
|
private PaddedForegroundDrawable(Drawable wrapped){
|
||||||
|
this.wrapped=wrapped;
|
||||||
|
wrapped.setCallback(new Callback(){
|
||||||
|
@Override
|
||||||
|
public void invalidateDrawable(@NonNull Drawable who){
|
||||||
|
invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when){
|
||||||
|
scheduleSelf(what, when);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what){
|
||||||
|
unscheduleSelf(what);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(@NonNull Canvas canvas){
|
||||||
|
wrapped.draw(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAlpha(int alpha){
|
||||||
|
wrapped.setAlpha(alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setColorFilter(@Nullable ColorFilter colorFilter){
|
||||||
|
wrapped.setColorFilter(colorFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOpacity(){
|
||||||
|
return wrapped.getOpacity();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setState(@NonNull int[] stateSet){
|
||||||
|
return wrapped.setState(stateSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLayoutDirection(){
|
||||||
|
return wrapped.getLayoutDirection();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAlpha(){
|
||||||
|
return wrapped.getAlpha();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public ColorFilter getColorFilter(){
|
||||||
|
return wrapped.getColorFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isStateful(){
|
||||||
|
return wrapped.isStateful();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public int[] getState(){
|
||||||
|
return wrapped.getState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Drawable getCurrent(){
|
||||||
|
return wrapped.getCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyTheme(@NonNull Resources.Theme t){
|
||||||
|
wrapped.applyTheme(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canApplyTheme(){
|
||||||
|
return wrapped.canApplyTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onBoundsChange(@NonNull Rect bounds){
|
||||||
|
super.onBoundsChange(bounds);
|
||||||
|
LayoutParams lp=(LayoutParams) edit.getLayoutParams();
|
||||||
|
wrapped.setBounds(bounds.left+lp.leftMargin-V.dp(12), bounds.top, bounds.right-lp.rightMargin+V.dp(12), bounds.bottom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
5
mastodon/src/main/res/color/button_text_m3_text.xml
Normal file
5
mastodon/src/main/res/color/button_text_m3_text.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?colorM3Primary" android:state_enabled="true"/>
|
||||||
|
<item android:color="?colorM3OnSurface" android:alpha="0.38"/>
|
||||||
|
</selector>
|
||||||
5
mastodon/src/main/res/color/filter_chip_text.xml
Normal file
5
mastodon/src/main/res/color/filter_chip_text.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?colorM3OnSecondaryContainer" android:state_selected="true"/>
|
||||||
|
<item android:color="?colorM3OnSurface"/>
|
||||||
|
</selector>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?colorM3OnSecondaryContainer" android:alpha="0.12"/>
|
||||||
|
</selector>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?colorM3OnSurfaceVariant" android:alpha="0.12"/>
|
||||||
|
</selector>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?colorM3Primary" android:state_focused="true"/>
|
||||||
|
<item android:color="?colorM3OnSurfaceVariant"/>
|
||||||
|
</selector>
|
||||||
4
mastodon/src/main/res/color/m3_primary_overlay.xml
Normal file
4
mastodon/src/main/res/color/m3_primary_overlay.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?colorM3Primary" android:alpha="0.12"/>
|
||||||
|
</selector>
|
||||||
@@ -1,5 +1,18 @@
|
|||||||
<vector android:height="108dp" android:viewportHeight="320"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:viewportWidth="320" android:width="108dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
<path android:fillColor="#fff" android:pathData="M166.45,143.88c-4.6,-0.61 -9.13,5 -10.12,12.53s1.93,14.12 6.53,14.72 9.13,-5 10.12,-12.53S171.05,144.48 166.45,143.88ZM166.53,164.39a3.65,3.65 0,1 1,2 -4.78A3.66,3.66 0,0 1,166.53 164.39Z"/>
|
android:width="108dp"
|
||||||
<path android:fillColor="#fff" android:pathData="M233.41,296.2c-0.41,-7.41 -1.13,-14.84 -1.84,-22.24l-0.24,-2.52c0,-0.18 0,-0.36 -0.05,-0.54 -0.11,-1.1 -0.21,-2.19 -0.31,-3.29q-0.54,-5.83 -1,-11.72 -0.71,-8.82 -1.37,-17.7 -0.24,-3 -0.46,-5.91c-0.63,-7.89 -1.29,-15.8 -2.09,-23.68 -1.13,-11.06 -2.54,-22.09 -4.49,-33a6.62,6.62 0,0 0,-0.9 0.48c-8.37,5.44 -14.27,29.16 -17.82,37.65a1.24,1.24 0,0 1,-2.37 -0.36c-0.09,-0.92 -0.16,-1.83 -0.21,-2.75l2.78,-1.79 -2.91,-2.2c0,-0.23 0,-0.45 0,-0.68v-0.48c0,-0.26 0,-0.51 0,-0.77l2.71,-1.72 -2.58,-3c0,-0.62 0.05,-1.25 0.09,-1.87l3.57,-1 -3.19,-3.83c0.05,-0.58 0.12,-1.16 0.18,-1.74l4.77,-1.39 -4,-4.46 0.24,-1.5 5.55,-1.61 -4.54,-4c0.08,-0.4 0.17,-0.8 0.26,-1.2l5,-1.44 -3.93,-3.22c0.08,-0.34 0.15,-0.69 0.23,-1l6.51,-1.89 -4.68,-5.41c0.07,-0.25 0.14,-0.5 0.22,-0.75l5.89,-0.82 -3.72,-5.48 0.3,-0.69 5.59,1.21 -3.33,-5.65c0.18,-0.3 0.37,-0.59 0.55,-0.88l5.95,0.95 -2.68,-5 0,0c-1.39,-6.49 -6.72,-19.33 -6.72,-19.33a62.21,62.21 0,0 0,-5.78 -11.48c-9.59,-15.31 -27.16,-28.64 -44.56,-28.64a32.59,32.59 0,0 0,-7.59 0.89c-17.93,4.31 -32.31,24.52 -40.65,39.83 -9.37,17.22 -14.3,36.39 -18.8,55.34 -6.77,28.47 -10.5,57.56 -13.22,86.66 -2.25,24 -10,50.88 14.49,65.32 11.22,6.6 24.36,10.79 37.17,12.9a98,98 0,0 0,16 1.15c4.72,0 9.45,-0.22 14.16,-0.44l49.8,-2.29c0.72,0 1.46,-0.06 2.21,-0.06 4,0 8.15,0.65 10.26,3.85 0.25,-2.66 -2.08,-7 -4.86,-11.6l5.7,-1.29c0.15,-4.58 0.6,-8 2.5,-5.38 0.93,1.29 2.19,2.73 3.78,2.54 1.86,-0.23 2.65,-2.45 3,-4.3C234,319.42 234.06,307.82 233.41,296.2ZM158.81,334.39c-4.45,0.2 -9.06,0.42 -13.47,0.42a83.24,83.24 0,0 1,-13.54 -0.95c-12,-2 -23.1,-5.8 -32,-11 -5.66,-3.33 -8.42,-7.32 -9.52,-13.75 -1.25,-7.35 -0.11,-16.53 1.1,-26.24 0.45,-3.59 0.91,-7.3 1.26,-11 3.25,-34.69 7.22,-60.78 12.88,-84.59 4.38,-18.42 9,-36.24 17.39,-51.64 9.79,-18 21.37,-30.11 31,-32.42a17.66,17.66 0,0 1,4.08 -0.47c6.64,0 14.53,3.54 21.63,9.71 6.86,6 12.19,13.64 14.36,20.64 -5.36,13.5 -10.52,31.41 -12.51,44.37 -5.36,34.75 -9,99.6 -7.6,156.26Z"/>
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<group android:scaleX="2.5091188"
|
||||||
|
android:scaleY="2.5091188">
|
||||||
|
<path
|
||||||
|
android:pathData="m13.779,16.29c-1.097,0 -1.983,0.387 -2.658,1.141 -0.655,0.754 -0.981,1.771 -0.981,3.053l0,6.27L12.622,26.754L12.622,20.668c0,-1.284 0.539,-1.935 1.618,-1.935 1.192,0 1.791,0.773 1.791,2.3l0,3.331l2.468,0l0,-3.331c0,-1.527 0.598,-2.3 1.791,-2.3 1.078,0 1.618,0.651 1.618,1.935l0,6.085l2.482,0l0,-6.27c0,-1.281 -0.326,-2.299 -0.981,-3.053 -0.676,-0.754 -1.56,-1.141 -2.658,-1.141 -1.27,0 -2.232,0.488 -2.868,1.466L17.265,18.794 16.646,17.756C16.01,16.778 15.049,16.29 13.779,16.29Z"
|
||||||
|
android:strokeWidth="0.796"
|
||||||
|
android:fillColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m29.087,26.754q-1.113,0 -1.986,-0.493 -0.873,-0.507 -1.366,-1.366 -0.479,-0.873 -0.479,-1.958 0,-1.07 0.479,-1.944 0.493,-0.873 1.366,-1.366 0.873,-0.507 1.986,-0.507 1.099,0 1.972,0.507 0.873,0.493 1.352,1.366 0.493,0.873 0.493,1.944 0,1.085 -0.493,1.958 -0.479,0.859 -1.352,1.366 -0.873,0.493 -1.972,0.493zM29.087,25.049q0.535,0 0.986,-0.254 0.451,-0.254 0.718,-0.732 0.268,-0.479 0.268,-1.127 0,-0.634 -0.268,-1.113 -0.268,-0.479 -0.718,-0.732 -0.451,-0.254 -0.986,-0.254 -0.535,0 -0.986,0.254 -0.451,0.254 -0.732,0.732 -0.268,0.479 -0.268,1.113 0,0.634 0.268,1.127 0.282,0.479 0.732,0.732 0.451,0.254 0.986,0.254z"
|
||||||
|
android:strokeWidth="0.687"
|
||||||
|
android:fillColor="#000000"/>
|
||||||
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
9
mastodon/src/main/res/drawable/bg_button_m3_text.xml
Normal file
9
mastodon/src/main/res/drawable/bg_button_m3_text.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ripple android:color="@color/m3_primary_overlay" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@android:id/mask">
|
||||||
|
<shape>
|
||||||
|
<solid android:color="#000"/>
|
||||||
|
<corners android:radius="20dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</ripple>
|
||||||
29
mastodon/src/main/res/drawable/bg_filter_chip.xml
Normal file
29
mastodon/src/main/res/drawable/bg_filter_chip.xml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_selected="true">
|
||||||
|
<ripple android:color="@color/m3_on_secondary_container_overlay">
|
||||||
|
<item>
|
||||||
|
<shape>
|
||||||
|
<corners android:radius="8dp"/>
|
||||||
|
<solid android:color="?colorM3SecondaryContainer"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</ripple>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ripple android:color="@color/m3_on_surface_variant_overlay">
|
||||||
|
<item android:id="@android:id/mask">
|
||||||
|
<shape>
|
||||||
|
<corners android:radius="8dp"/>
|
||||||
|
<solid android:color="#000"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<shape>
|
||||||
|
<corners android:radius="8dp"/>
|
||||||
|
<stroke android:color="?colorM3Outline" android:width="1dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</ripple>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
19
mastodon/src/main/res/drawable/bg_m3_outlined_text_field.xml
Normal file
19
mastodon/src/main/res/drawable/bg_m3_outlined_text_field.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:left="12dp" android:top="12dp" android:right="12dp" android:bottom="12dp">
|
||||||
|
<selector>
|
||||||
|
<item android:state_focused="true">
|
||||||
|
<shape>
|
||||||
|
<stroke android:color="?colorM3Primary" android:width="2dp"/>
|
||||||
|
<corners android:radius="4dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<shape>
|
||||||
|
<stroke android:color="?colorM3Outline" android:width="1dp"/>
|
||||||
|
<corners android:radius="4dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:left="12dp" android:top="12dp" android:right="12dp" android:bottom="12dp">
|
||||||
|
<shape>
|
||||||
|
<stroke android:color="?colorM3Error" android:width="2dp"/>
|
||||||
|
<corners android:radius="4dp"/>
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
9
mastodon/src/main/res/drawable/bg_onboarding_panel.xml
Normal file
9
mastodon/src/main/res/drawable/bg_onboarding_panel.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<color android:color="?colorM3Background"/>
|
||||||
|
</item>
|
||||||
|
<item android:id="@+id/color_overlay">
|
||||||
|
<color android:color="?colorM3Primary"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
5
mastodon/src/main/res/drawable/empty_8dp.xml
Normal file
5
mastodon/src/main/res/drawable/empty_8dp.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<size android:width="8dp"/>
|
||||||
|
<solid android:color="#00000000"/>
|
||||||
|
</shape>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="18dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="18dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M7,10l5,5 5,-5z"/>
|
||||||
|
</vector>
|
||||||
5
mastodon/src/main/res/drawable/ic_baseline_check_18.xml
Normal file
5
mastodon/src/main/res/drawable/ic_baseline_check_18.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="18dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="18dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
|
||||||
|
<path android:pathData="M10 18c4.418 0 8-3.582 8-8s-3.582-8-8-8-8 3.582-8 8 3.582 8 8 8zm0-15c0.657 0 1.407 0.59 2.022 1.908 0.217 0.466 0.406 1.002 0.559 1.592H7.419c0.153-0.59 0.342-1.126 0.56-1.592C8.592 3.59 9.342 3 10 3zM7.072 4.485C6.796 5.077 6.565 5.757 6.389 6.5H3.936c0.837-1.446 2.176-2.565 3.778-3.118-0.241 0.33-0.456 0.704-0.642 1.103zM6.192 7.5C6.068 8.288 6 9.13 6 10c0 0.87 0.067 1.712 0.193 2.5H3.46C3.163 11.724 3 10.88 3 10c0-0.88 0.163-1.724 0.46-2.5h2.733zm0.197 6c0.176 0.743 0.407 1.422 0.683 2.015 0.186 0.399 0.401 0.773 0.642 1.103-1.602-0.553-2.941-1.672-3.778-3.118H6.39zm1.03 0h5.162c-0.153 0.59-0.342 1.126-0.56 1.592C11.408 16.41 10.658 17 10 17c-0.657 0-1.407-0.59-2.022-1.908C7.761 14.626 7.572 14.09 7.42 13.5zm5.375-1H7.206C7.073 11.725 7 10.883 7 10s0.074-1.725 0.206-2.5h5.588C12.927 8.275 13 9.117 13 10s-0.073 1.725-0.206 2.5zm0.817 1h2.453c-0.837 1.446-2.176 2.565-3.778 3.118 0.241-0.33 0.456-0.704 0.642-1.103 0.276-0.593 0.507-1.272 0.683-2.015zm2.93-1h-2.734C13.933 11.712 14 10.87 14 10c0-0.87-0.067-1.712-0.193-2.5h2.733C16.837 8.276 17 9.12 17 10c0 0.88-0.163 1.724-0.46 2.5zm-4.255-9.118c1.602 0.553 2.941 1.672 3.778 3.118H13.61c-0.176-0.743-0.407-1.423-0.683-2.015-0.186-0.399-0.401-0.773-0.642-1.103z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="28dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="28dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M3,5v14h17L20,5L3,5zM7,7v2L5,9L5,7h2zM5,13v-2h2v2L5,13zM5,15h2v2L5,17v-2zM18,17L9,17v-2h9v2zM18,13L9,13v-2h9v2zM18,9L9,9L9,7h9v2z"/>
|
||||||
|
</vector>
|
||||||
18
mastodon/src/main/res/drawable/ic_launcher_monochrome.xml
Normal file
18
mastodon/src/main/res/drawable/ic_launcher_monochrome.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<group android:scaleX="2.5091188"
|
||||||
|
android:scaleY="2.5091188">
|
||||||
|
<path
|
||||||
|
android:pathData="m13.779,16.29c-1.097,0 -1.983,0.387 -2.658,1.141 -0.655,0.754 -0.981,1.771 -0.981,3.053l0,6.27L12.622,26.754L12.622,20.668c0,-1.284 0.539,-1.935 1.618,-1.935 1.192,0 1.791,0.773 1.791,2.3l0,3.331l2.468,0l0,-3.331c0,-1.527 0.598,-2.3 1.791,-2.3 1.078,0 1.618,0.651 1.618,1.935l0,6.085l2.482,0l0,-6.27c0,-1.281 -0.326,-2.299 -0.981,-3.053 -0.676,-0.754 -1.56,-1.141 -2.658,-1.141 -1.27,0 -2.232,0.488 -2.868,1.466L17.265,18.794 16.646,17.756C16.01,16.778 15.049,16.29 13.779,16.29Z"
|
||||||
|
android:strokeWidth="0.796"
|
||||||
|
android:fillColor="#000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="m29.087,26.754q-1.113,0 -1.986,-0.493 -0.873,-0.507 -1.366,-1.366 -0.479,-0.873 -0.479,-1.958 0,-1.07 0.479,-1.944 0.493,-0.873 1.366,-1.366 0.873,-0.507 1.986,-0.507 1.099,0 1.972,0.507 0.873,0.493 1.352,1.366 0.493,0.873 0.493,1.944 0,1.085 -0.493,1.958 -0.479,0.859 -1.352,1.366 -0.873,0.493 -1.972,0.493zM29.087,25.049q0.535,0 0.986,-0.254 0.451,-0.254 0.718,-0.732 0.268,-0.479 0.268,-1.127 0,-0.634 -0.268,-1.113 -0.268,-0.479 -0.718,-0.732 -0.451,-0.254 -0.986,-0.254 -0.535,0 -0.986,0.254 -0.451,0.254 -0.732,0.732 -0.268,0.479 -0.268,1.113 0,0.634 0.268,1.127 0.282,0.479 0.732,0.732 0.451,0.254 0.986,0.254z"
|
||||||
|
android:strokeWidth="0.687"
|
||||||
|
android:fillColor="#000000"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
5
mastodon/src/main/res/drawable/ic_outline_email_24.xml
Normal file
5
mastodon/src/main/res/drawable/ic_outline_email_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M22,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6zM20,6l-8,5 -8,-5h16zM20,18L4,18L4,8l8,5 8,-5v10z"/>
|
||||||
|
</vector>
|
||||||
5
mastodon/src/main/res/drawable/ic_outline_link_24.xml
Normal file
5
mastodon/src/main/res/drawable/ic_outline_link_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M17,7h-4v2h4c1.65,0 3,1.35 3,3s-1.35,3 -3,3h-4v2h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5zM11,15L7,15c-1.65,0 -3,-1.35 -3,-3s1.35,-3 3,-3h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-2zM8,11h8v2L8,13z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M2,17h20v2H2V17zM3.15,12.95L4,11.47l0.85,1.48l1.3,-0.75L5.3,10.72H7v-1.5H5.3l0.85,-1.47L4.85,7L4,8.47L3.15,7l-1.3,0.75L2.7,9.22H1v1.5h1.7L1.85,12.2L3.15,12.95zM9.85,12.2l1.3,0.75L12,11.47l0.85,1.48l1.3,-0.75l-0.85,-1.48H15v-1.5h-1.7l0.85,-1.47L12.85,7L12,8.47L11.15,7l-1.3,0.75l0.85,1.47H9v1.5h1.7L9.85,12.2zM23,9.22h-1.7l0.85,-1.47L20.85,7L20,8.47L19.15,7l-1.3,0.75l0.85,1.47H17v1.5h1.7l-0.85,1.48l1.3,0.75L20,11.47l0.85,1.48l1.3,-0.75l-0.85,-1.48H23V9.22z"/>
|
||||||
|
</vector>
|
||||||
5
mastodon/src/main/res/drawable/ic_outline_person_24.xml
Normal file
5
mastodon/src/main/res/drawable/ic_outline_person_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#000000"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M12,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2m0,10c2.7,0 5.8,1.29 6,2L6,18c0.23,-0.72 3.31,-2 6,-2m0,-12C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
|
||||||
|
</vector>
|
||||||
5
mastodon/src/main/res/drawable/round_rect.xml
Normal file
5
mastodon/src/main/res/drawable/round_rect.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<corners android:radius="100dp"/>
|
||||||
|
<solid android:color="#000"/>
|
||||||
|
</shape>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:aapt="http://schemas.android.com/aapt"
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
android:width="257dp"
|
android:width="134dp"
|
||||||
android:height="67dp"
|
android:height="34dp"
|
||||||
android:viewportWidth="313"
|
android:viewportWidth="313"
|
||||||
android:viewportHeight="81">
|
android:viewportHeight="81">
|
||||||
<path
|
<path
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
</path>
|
</path>
|
||||||
<path
|
<path
|
||||||
android:pathData="M14.81,23.2C14.81,20.72 16.77,18.72 19.2,18.72C21.62,18.72 23.58,20.73 23.58,23.2C23.58,25.67 21.62,27.68 19.2,27.68C16.77,27.68 14.81,25.67 14.81,23.2Z"
|
android:pathData="M14.81,23.2C14.81,20.72 16.77,18.72 19.2,18.72C21.62,18.72 23.58,20.73 23.58,23.2C23.58,25.67 21.62,27.68 19.2,27.68C16.77,27.68 14.81,25.67 14.81,23.2Z"
|
||||||
android:fillColor="#ffffff"/>
|
android:fillColor="#000"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="M80.02,27.06V47.66H72.03V27.67C72.03,23.45 70.3,21.32 66.83,21.32C63,21.32 61.07,23.87 61.07,28.87V39.82H53.14V28.87C53.14,23.84 51.24,21.32 47.38,21.32C43.92,21.32 42.18,23.45 42.18,27.67V47.65H34.21V27.06C34.21,22.86 35.25,19.51 37.35,17.03C39.53,14.54 42.37,13.29 45.89,13.29C49.97,13.29 53.07,14.9 55.11,18.11L57.11,21.52L59.1,18.11C61.14,14.91 64.23,13.29 68.32,13.29C71.84,13.29 74.69,14.55 76.86,17.03C78.96,19.51 80.01,22.83 80.01,27.06H80.02ZM107.49,37.3C109.15,35.51 109.93,33.29 109.93,30.59C109.93,27.89 109.14,25.65 107.49,23.94C105.91,22.15 103.89,21.3 101.45,21.3C99.02,21.3 97.01,22.15 95.41,23.94C93.83,25.65 93.04,27.89 93.04,30.59C93.04,33.29 93.83,35.53 95.41,37.3C97,39 99.02,39.87 101.45,39.87C103.89,39.87 105.9,39.02 107.49,37.3ZM109.93,14.12H117.8V47.06H109.93V43.18C107.55,46.41 104.26,48 99.99,48C95.71,48 92.42,46.36 89.5,43C86.64,39.64 85.18,35.48 85.18,30.61C85.18,25.74 86.65,21.65 89.5,18.29C92.43,14.93 95.92,13.23 99.99,13.23C104.06,13.23 107.55,14.81 109.93,18.02V14.14V14.12ZM144.26,29.97C146.58,31.76 147.73,34.25 147.67,37.41C147.67,40.77 146.52,43.41 144.14,45.24C141.76,47.03 138.89,47.94 135.41,47.94C129.13,47.94 124.87,45.3 122.61,40.11L129.43,35.96C130.34,38.78 132.35,40.25 135.41,40.25C138.22,40.25 139.62,39.33 139.62,37.42C139.62,36.03 137.79,34.78 134.07,33.8C132.66,33.41 131.5,33.01 130.6,32.68C129.31,32.16 128.22,31.56 127.31,30.83C125.05,29.04 123.9,26.68 123.9,23.65C123.9,20.42 124.99,17.85 127.19,16C129.45,14.09 132.19,13.18 135.48,13.18C140.73,13.18 144.56,15.48 147.07,20.16L140.37,24.1C139.4,21.86 137.74,20.74 135.48,20.74C133.11,20.74 131.95,21.65 131.95,23.44C131.95,24.83 133.78,26.08 137.5,27.06C140.37,27.72 142.63,28.7 144.26,29.97H144.27H144.26ZM169.26,22.27H162.37V35.98C162.37,37.63 162.98,38.63 164.15,39.08C165,39.4 166.71,39.47 169.27,39.34V47.05C163.98,47.71 160.14,47.17 157.88,45.41C155.62,43.7 154.53,40.53 154.53,36V22.27H149.23V14.1H154.53V7.46L162.39,4.89V14.12H169.29V22.29H169.27L169.26,22.27ZM194.34,37.1C195.92,35.4 196.71,33.22 196.71,30.58C196.71,27.94 195.92,25.78 194.34,24.05C192.74,22.35 190.79,21.48 188.42,21.48C186.04,21.48 184.09,22.33 182.49,24.05C180.97,25.84 180.18,28 180.18,30.58C180.18,33.16 180.97,35.31 182.49,37.1C184.08,38.81 186.04,39.67 188.42,39.67C190.79,39.67 192.74,38.82 194.34,37.1ZM176.96,42.96C173.85,39.6 172.32,35.52 172.32,30.58C172.32,25.63 173.85,21.62 176.96,18.26C180.07,14.9 183.91,13.19 188.42,13.19C192.92,13.19 196.77,14.9 199.87,18.26C202.97,21.62 204.57,25.77 204.57,30.58C204.57,35.39 202.97,39.6 199.87,42.96C196.76,46.32 192.98,47.96 188.42,47.96C183.85,47.96 180.06,46.32 176.96,42.96ZM230.86,37.29C232.45,35.5 233.24,33.28 233.24,30.58C233.24,27.87 232.45,25.63 230.86,23.93C229.28,22.14 227.26,21.29 224.82,21.29C222.39,21.29 220.37,22.14 218.73,23.93C217.14,25.63 216.35,27.87 216.35,30.58C216.35,33.28 217.14,35.52 218.73,37.29C220.38,38.99 222.45,39.86 224.82,39.86C227.2,39.86 229.27,39 230.86,37.29ZM233.24,0.92H241.11V47.05H233.24V43.17C230.93,46.39 227.63,47.99 223.36,47.99C219.09,47.99 215.75,46.35 212.8,42.98C209.93,39.62 208.48,35.47 208.48,30.6C208.48,25.73 209.95,21.64 212.8,18.28C215.72,14.92 219.26,13.22 223.36,13.22C227.45,13.22 230.93,14.8 233.24,18.01V0.93V0.92ZM268.74,37.07C270.32,35.36 271.12,33.18 271.12,30.54C271.12,27.9 270.32,25.74 268.74,24.01C267.15,22.31 265.21,21.45 262.82,21.45C260.43,21.45 258.5,22.3 256.9,24.01C255.37,25.8 254.58,27.96 254.58,30.54C254.58,33.12 255.37,35.28 256.9,37.07C258.48,38.77 260.44,39.64 262.82,39.64C265.2,39.64 267.14,38.78 268.74,37.07ZM251.36,42.92C248.26,39.56 246.73,35.48 246.73,30.54C246.73,25.6 248.25,21.58 251.36,18.22C254.47,14.86 258.32,13.15 262.82,13.15C267.32,13.15 271.18,14.86 274.27,18.22C277.38,21.58 278.97,25.73 278.97,30.54C278.97,35.35 277.38,39.56 274.27,42.92C271.16,46.28 267.38,47.93 262.82,47.93C258.26,47.93 254.46,46.28 251.36,42.92ZM313,26.78V47.01H305.14V27.84C305.14,25.66 304.59,24.01 303.48,22.77C302.45,21.65 300.98,21.07 299.09,21.07C294.65,21.07 292.39,23.77 292.39,29.24V47.03H284.53V14.1H292.39V17.81C294.28,14.71 297.28,13.19 301.47,13.19C304.82,13.19 307.57,14.37 309.71,16.81C311.91,19.24 313,22.54 313,26.82"
|
android:pathData="M80.02,27.06V47.66H72.03V27.67C72.03,23.45 70.3,21.32 66.83,21.32C63,21.32 61.07,23.87 61.07,28.87V39.82H53.14V28.87C53.14,23.84 51.24,21.32 47.38,21.32C43.92,21.32 42.18,23.45 42.18,27.67V47.65H34.21V27.06C34.21,22.86 35.25,19.51 37.35,17.03C39.53,14.54 42.37,13.29 45.89,13.29C49.97,13.29 53.07,14.9 55.11,18.11L57.11,21.52L59.1,18.11C61.14,14.91 64.23,13.29 68.32,13.29C71.84,13.29 74.69,14.55 76.86,17.03C78.96,19.51 80.01,22.83 80.01,27.06H80.02ZM107.49,37.3C109.15,35.51 109.93,33.29 109.93,30.59C109.93,27.89 109.14,25.65 107.49,23.94C105.91,22.15 103.89,21.3 101.45,21.3C99.02,21.3 97.01,22.15 95.41,23.94C93.83,25.65 93.04,27.89 93.04,30.59C93.04,33.29 93.83,35.53 95.41,37.3C97,39 99.02,39.87 101.45,39.87C103.89,39.87 105.9,39.02 107.49,37.3ZM109.93,14.12H117.8V47.06H109.93V43.18C107.55,46.41 104.26,48 99.99,48C95.71,48 92.42,46.36 89.5,43C86.64,39.64 85.18,35.48 85.18,30.61C85.18,25.74 86.65,21.65 89.5,18.29C92.43,14.93 95.92,13.23 99.99,13.23C104.06,13.23 107.55,14.81 109.93,18.02V14.14V14.12ZM144.26,29.97C146.58,31.76 147.73,34.25 147.67,37.41C147.67,40.77 146.52,43.41 144.14,45.24C141.76,47.03 138.89,47.94 135.41,47.94C129.13,47.94 124.87,45.3 122.61,40.11L129.43,35.96C130.34,38.78 132.35,40.25 135.41,40.25C138.22,40.25 139.62,39.33 139.62,37.42C139.62,36.03 137.79,34.78 134.07,33.8C132.66,33.41 131.5,33.01 130.6,32.68C129.31,32.16 128.22,31.56 127.31,30.83C125.05,29.04 123.9,26.68 123.9,23.65C123.9,20.42 124.99,17.85 127.19,16C129.45,14.09 132.19,13.18 135.48,13.18C140.73,13.18 144.56,15.48 147.07,20.16L140.37,24.1C139.4,21.86 137.74,20.74 135.48,20.74C133.11,20.74 131.95,21.65 131.95,23.44C131.95,24.83 133.78,26.08 137.5,27.06C140.37,27.72 142.63,28.7 144.26,29.97H144.27H144.26ZM169.26,22.27H162.37V35.98C162.37,37.63 162.98,38.63 164.15,39.08C165,39.4 166.71,39.47 169.27,39.34V47.05C163.98,47.71 160.14,47.17 157.88,45.41C155.62,43.7 154.53,40.53 154.53,36V22.27H149.23V14.1H154.53V7.46L162.39,4.89V14.12H169.29V22.29H169.27L169.26,22.27ZM194.34,37.1C195.92,35.4 196.71,33.22 196.71,30.58C196.71,27.94 195.92,25.78 194.34,24.05C192.74,22.35 190.79,21.48 188.42,21.48C186.04,21.48 184.09,22.33 182.49,24.05C180.97,25.84 180.18,28 180.18,30.58C180.18,33.16 180.97,35.31 182.49,37.1C184.08,38.81 186.04,39.67 188.42,39.67C190.79,39.67 192.74,38.82 194.34,37.1ZM176.96,42.96C173.85,39.6 172.32,35.52 172.32,30.58C172.32,25.63 173.85,21.62 176.96,18.26C180.07,14.9 183.91,13.19 188.42,13.19C192.92,13.19 196.77,14.9 199.87,18.26C202.97,21.62 204.57,25.77 204.57,30.58C204.57,35.39 202.97,39.6 199.87,42.96C196.76,46.32 192.98,47.96 188.42,47.96C183.85,47.96 180.06,46.32 176.96,42.96ZM230.86,37.29C232.45,35.5 233.24,33.28 233.24,30.58C233.24,27.87 232.45,25.63 230.86,23.93C229.28,22.14 227.26,21.29 224.82,21.29C222.39,21.29 220.37,22.14 218.73,23.93C217.14,25.63 216.35,27.87 216.35,30.58C216.35,33.28 217.14,35.52 218.73,37.29C220.38,38.99 222.45,39.86 224.82,39.86C227.2,39.86 229.27,39 230.86,37.29ZM233.24,0.92H241.11V47.05H233.24V43.17C230.93,46.39 227.63,47.99 223.36,47.99C219.09,47.99 215.75,46.35 212.8,42.98C209.93,39.62 208.48,35.47 208.48,30.6C208.48,25.73 209.95,21.64 212.8,18.28C215.72,14.92 219.26,13.22 223.36,13.22C227.45,13.22 230.93,14.8 233.24,18.01V0.93V0.92ZM268.74,37.07C270.32,35.36 271.12,33.18 271.12,30.54C271.12,27.9 270.32,25.74 268.74,24.01C267.15,22.31 265.21,21.45 262.82,21.45C260.43,21.45 258.5,22.3 256.9,24.01C255.37,25.8 254.58,27.96 254.58,30.54C254.58,33.12 255.37,35.28 256.9,37.07C258.48,38.77 260.44,39.64 262.82,39.64C265.2,39.64 267.14,38.78 268.74,37.07ZM251.36,42.92C248.26,39.56 246.73,35.48 246.73,30.54C246.73,25.6 248.25,21.58 251.36,18.22C254.47,14.86 258.32,13.15 262.82,13.15C267.32,13.15 271.18,14.86 274.27,18.22C277.38,21.58 278.97,25.73 278.97,30.54C278.97,35.35 277.38,39.56 274.27,42.92C271.16,46.28 267.38,47.93 262.82,47.93C258.26,47.93 254.46,46.28 251.36,42.92ZM313,26.78V47.01H305.14V27.84C305.14,25.66 304.59,24.01 303.48,22.77C302.45,21.65 300.98,21.07 299.09,21.07C294.65,21.07 292.39,23.77 292.39,29.24V47.03H284.53V14.1H292.39V17.81C294.28,14.71 297.28,13.19 301.47,13.19C304.82,13.19 307.57,14.37 309.71,16.81C311.91,19.24 313,22.54 313,26.82"
|
||||||
android:fillColor="#ffffff"/>
|
android:fillColor="#000"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
4
mastodon/src/main/res/drawable/white_circle.xml
Normal file
4
mastodon/src/main/res/drawable/white_circle.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
|
||||||
|
<solid android:color="#fff"/>
|
||||||
|
</shape>
|
||||||
@@ -17,7 +17,8 @@
|
|||||||
android:layout_marginTop="6dp"
|
android:layout_marginTop="6dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone">
|
||||||
<View
|
<View
|
||||||
android:id="@+id/border_top"
|
android:id="@+id/border_top"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -180,7 +180,7 @@
|
|||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:text="@string/poll_allow_multiple" />
|
android:text="@string/sk_poll_allow_multiple" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
18
mastodon/src/main/res/layout/fragment_lists.xml
Normal file
18
mastodon/src/main/res/layout/fragment_lists.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<org.joinmastodon.android.ui.tabs.TabLayout
|
||||||
|
android:id="@+id/tabbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
app:tabGravity="fill"
|
||||||
|
app:tabIndicator="@drawable/mtrl_tabs_default_indicator"
|
||||||
|
app:tabIndicatorAnimationMode="elastic"
|
||||||
|
app:tabIndicatorColor="?android:textColorPrimary"
|
||||||
|
app:tabMode="fixed"
|
||||||
|
android:background="@drawable/bg_discover_tabs"/>
|
||||||
|
</LinearLayout>
|
||||||
60
mastodon/src/main/res/layout/fragment_moshidon_welcome.xml
Normal file
60
mastodon/src/main/res/layout/fragment_moshidon_welcome.xml
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<me.grishka.appkit.views.FragmentRootLinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:id="@+id/appkit_loader_root"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:background="?colorBackgroundLight">
|
||||||
|
|
||||||
|
<include layout="@layout/appkit_toolbar"/>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/appkit_loader_content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1">
|
||||||
|
|
||||||
|
<include layout="@layout/loading"
|
||||||
|
android:id="@+id/loading"/>
|
||||||
|
|
||||||
|
<ViewStub android:layout="?errorViewLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/error"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/content_stub"/>
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0.5dp"
|
||||||
|
android:background="?attr/colorPollVoted"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/button_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?colorBackgroundLight"
|
||||||
|
android:outlineProvider="bounds"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:elevation="0dp">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
style="?primaryLargeButtonStyle"
|
||||||
|
android:id="@+id/btn_next"
|
||||||
|
android:minWidth="145dp"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="16dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/next" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</me.grishka.appkit.views.FragmentRootLinearLayout>
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<me.grishka.appkit.views.FragmentRootLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".fragments.onboarding.AccountActivationFragment">
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1">
|
||||||
android:background="?colorBackgroundLight">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -17,40 +17,67 @@
|
|||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:clipChildren="false">
|
android:clipChildren="false">
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textAppearance="@style/m3_headline_medium"
|
|
||||||
android:minHeight="36dp"
|
|
||||||
android:layout_marginTop="32dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginBottom="12dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:text="@string/confirm_email_title"/>
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/subtitle"
|
android:id="@+id/subtitle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginStart="56dp"
|
||||||
android:layout_marginRight="16dp"
|
android:layout_marginEnd="24dp"
|
||||||
android:textAppearance="@style/m3_title_medium"
|
android:layout_marginTop="12dp"
|
||||||
android:textColor="?android:textColorSecondary"
|
android:textAppearance="@style/m3_body_large"
|
||||||
|
android:textColor="?colorM3OnSurface"
|
||||||
android:text="@string/confirm_email_subtitle"/>
|
android:text="@string/confirm_email_subtitle"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="230dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_margin="32dp"
|
android:layout_marginTop="12dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:adjustViewBounds="true"
|
||||||
android:src="@drawable/confirm_email_art"/>
|
android:src="@drawable/confirm_email_art"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<include layout="@layout/button_bar_activation" />
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_gravity="center_horizontal">
|
||||||
|
|
||||||
</me.grishka.appkit.views.FragmentRootLinearLayout>
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="@style/m3_label_large"
|
||||||
|
android:textColor="?colorM3OnSurfaceVariant"
|
||||||
|
android:text="@string/confirm_email_didnt_get"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_resend"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:text="@string/resend"
|
||||||
|
android:paddingTop="0dp"
|
||||||
|
android:paddingBottom="0dp"
|
||||||
|
android:paddingLeft="12dp"
|
||||||
|
android:paddingRight="12dp"
|
||||||
|
android:fontFeatureSettings="'tnum'"
|
||||||
|
style="@style/Widget.Mastodon.M3.Button.Text"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_next"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:minWidth="145dp"
|
||||||
|
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||||
|
android:text="@string/open_email_app" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -5,14 +5,95 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:id="@+id/appkit_loader_root"
|
android:id="@+id/appkit_loader_root"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
android:background="?colorBackgroundLight">
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/top_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:background="@drawable/bg_onboarding_panel">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/search_edit"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:inputType="textFilter|textUri"
|
||||||
|
android:layout_toEndOf="@+id/btn_back"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:textAppearance="@style/m3_body_large"
|
||||||
|
android:paddingTop="0dp"
|
||||||
|
android:paddingBottom="0dp"
|
||||||
|
android:paddingStart="12dp"
|
||||||
|
android:paddingEnd="40dp"
|
||||||
|
android:drawableStart="@drawable/ic_m3_search"
|
||||||
|
android:drawablePadding="8dp"
|
||||||
|
android:drawableTint="?colorM3OnSurfaceVariant"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:textColorHint="?colorM3OnSurfaceVariant"
|
||||||
|
android:textColor="?colorM3OnSurfaceVariant"
|
||||||
|
android:background="@drawable/round_rect"
|
||||||
|
android:backgroundTint="?colorM3SurfaceVariant"
|
||||||
|
android:hint="@string/search_communities"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/btn_back"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:background="?android:selectableItemBackgroundBorderless"
|
||||||
|
android:tint="?colorM3OnSurface"
|
||||||
|
android:contentDescription="@string/back"
|
||||||
|
android:src="@drawable/ic_arrow_back"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/clear"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:background="?android:selectableItemBackgroundBorderless"
|
||||||
|
android:layout_alignEnd="@id/search_edit"
|
||||||
|
android:layout_alignTop="@id/search_edit"
|
||||||
|
android:layout_margin="12dp"
|
||||||
|
android:contentDescription="@string/clear"
|
||||||
|
android:tint="?colorM3OnSurfaceVariant"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:src="@drawable/ic_m3_cancel"/>
|
||||||
|
|
||||||
|
<HorizontalScrollView
|
||||||
|
android:id="@+id/filters_scroll"
|
||||||
|
android:layout_below="@id/search_edit"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:scrollbars="none">
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/filters_container"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:showDividers="middle"
|
||||||
|
android:divider="@drawable/empty_8dp">
|
||||||
|
</LinearLayout>
|
||||||
|
</HorizontalScrollView>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/appkit_loader_content"
|
android:id="@+id/appkit_loader_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0px"
|
android:layout_height="0px"
|
||||||
android:layout_weight="1">
|
android:layout_weight="1"
|
||||||
|
android:background="?colorM3Surface">
|
||||||
|
|
||||||
<include layout="@layout/loading"
|
<include layout="@layout/loading"
|
||||||
android:id="@+id/loading"/>
|
android:id="@+id/loading"/>
|
||||||
@@ -33,32 +114,29 @@
|
|||||||
android:id="@+id/button_bar"
|
android:id="@+id/button_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?colorBackgroundLight"
|
android:orientation="vertical"
|
||||||
android:outlineProvider="bounds"
|
android:background="@drawable/bg_onboarding_panel">
|
||||||
android:orientation="horizontal"
|
|
||||||
android:elevation="3dp">
|
|
||||||
|
|
||||||
<Button
|
<TextView
|
||||||
android:id="@+id/btn_back"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_marginLeft="16dp"
|
||||||
android:layout_margin="16dp"
|
android:layout_marginRight="16dp"
|
||||||
android:minWidth="145dp"
|
android:layout_marginTop="8dp"
|
||||||
style="?secondaryLargeButtonStyle"
|
android:textAppearance="@style/m3_body_small"
|
||||||
android:text="@string/back"/>
|
android:textColor="?colorM3OnSurfaceVariant"
|
||||||
|
android:text="@string/signup_random_server_explain"/>
|
||||||
<Space
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:layout_weight="1"/>
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btn_next"
|
android:id="@+id/btn_next"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
android:minWidth="145dp"
|
android:minWidth="145dp"
|
||||||
style="?primaryLargeButtonStyle"
|
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||||
android:text="@string/next" />
|
android:text="@string/next" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@@ -8,39 +8,24 @@
|
|||||||
android:id="@+id/list"
|
android:id="@+id/list"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"/>
|
||||||
android:background="?colorBackgroundLight"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/button_bar"
|
android:id="@+id/button_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?colorBackgroundLight"
|
android:orientation="horizontal">
|
||||||
android:outlineProvider="bounds"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:elevation="3dp">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_back"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:minWidth="145dp"
|
|
||||||
style="?secondaryLargeButtonStyle"
|
|
||||||
android:text="@string/back"/>
|
|
||||||
|
|
||||||
<Space
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:layout_weight="1"/>
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btn_next"
|
android:id="@+id/btn_next"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
android:minWidth="145dp"
|
android:minWidth="145dp"
|
||||||
style="?primaryLargeButtonStyle"
|
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||||
android:text="@string/i_agree" />
|
android:text="@string/i_agree" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<me.grishka.appkit.views.FragmentRootLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<me.grishka.appkit.views.FragmentRootLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
@@ -8,8 +9,7 @@
|
|||||||
<ScrollView
|
<ScrollView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1">
|
||||||
android:background="?colorBackgroundLight">
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -17,68 +17,58 @@
|
|||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:clipChildren="false">
|
android:clipChildren="false">
|
||||||
|
|
||||||
<TextView
|
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout
|
||||||
android:id="@+id/title"
|
android:id="@+id/display_name_wrap"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="80dp"
|
||||||
android:layout_marginBottom="24dp"
|
android:paddingTop="4dp"
|
||||||
android:textAppearance="@style/m3_headline_medium"
|
app:labelTextColor="@color/m3_outlined_text_field_label"
|
||||||
android:minHeight="36dp"
|
android:foreground="@drawable/bg_m3_outlined_text_field">
|
||||||
android:layout_marginTop="32dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
tools:text="@string/signup_title"/>
|
|
||||||
|
|
||||||
<FrameLayout
|
<EditText
|
||||||
android:id="@+id/ava_wrap"
|
android:id="@+id/display_name"
|
||||||
android:layout_width="88dp"
|
|
||||||
android:layout_height="88dp"
|
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
android:layout_marginBottom="24dp">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/avatar"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="56dp"
|
||||||
android:scaleType="centerCrop"
|
android:layout_marginStart="56dp"
|
||||||
android:src="@drawable/default_avatar"/>
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:inputType="textPersonName|textCapWords"
|
||||||
|
android:autofillHints="name"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:hint="@string/display_name"/>
|
||||||
|
|
||||||
<TextView
|
<View
|
||||||
android:layout_width="match_parent"
|
android:layout_width="24dp"
|
||||||
android:layout_height="22dp"
|
android:layout_height="24dp"
|
||||||
android:layout_gravity="bottom"
|
android:layout_gravity="start|top"
|
||||||
android:gravity="center"
|
android:layout_marginStart="16dp"
|
||||||
android:background="@color/gray_800t"
|
android:layout_marginTop="12dp"
|
||||||
android:textAppearance="@style/m3_label_large"
|
android:backgroundTint="?colorM3OnSurfaceVariant"
|
||||||
android:textColor="#eee"
|
android:background="@drawable/ic_outline_person_24"/>
|
||||||
android:text="@string/edit_photo"/>
|
|
||||||
|
|
||||||
</FrameLayout>
|
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>
|
||||||
|
|
||||||
<EditText
|
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout
|
||||||
android:id="@+id/display_name"
|
android:id="@+id/username_wrap"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="80dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:paddingTop="4dp"
|
||||||
android:layout_marginRight="16dp"
|
app:labelTextColor="@color/m3_outlined_text_field_label"
|
||||||
android:inputType="textPersonName|textCapWords"
|
android:foreground="@drawable/bg_m3_outlined_text_field">
|
||||||
android:autofillHints="name"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:hint="@string/display_name"/>
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="24dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp">
|
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/username"
|
android:id="@+id/username"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="56dp"
|
||||||
|
android:layout_marginStart="56dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:elevation="0dp"
|
||||||
android:inputType="textFilter|textNoSuggestions"
|
android:inputType="textFilter|textNoSuggestions"
|
||||||
android:autofillHints="username"
|
android:autofillHints="username"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
@@ -89,70 +79,152 @@
|
|||||||
android:id="@+id/domain"
|
android:id="@+id/domain"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:elevation="5dp"
|
|
||||||
android:layout_gravity="right|center_vertical"
|
android:layout_gravity="right|center_vertical"
|
||||||
|
android:layout_marginRight="20dp"
|
||||||
android:paddingLeft="8dp"
|
android:paddingLeft="8dp"
|
||||||
android:paddingRight="16dp"
|
android:paddingRight="16dp"
|
||||||
android:textAppearance="@style/m3_title_medium"
|
android:textAppearance="@style/m3_body_large"
|
||||||
tools:text="\@mastodon.social"/>
|
tools:text="\@mastodon.social"/>
|
||||||
|
|
||||||
</FrameLayout>
|
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>
|
||||||
|
|
||||||
<EditText
|
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout
|
||||||
android:id="@+id/email"
|
android:id="@+id/email_wrap"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="80dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:paddingTop="4dp"
|
||||||
android:layout_marginRight="16dp"
|
app:labelTextColor="@color/m3_outlined_text_field_label"
|
||||||
android:layout_marginBottom="8dp"
|
android:foreground="@drawable/bg_m3_outlined_text_field">
|
||||||
android:inputType="textEmailAddress"
|
|
||||||
android:autofillHints="emailAddress"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:hint="@string/email"/>
|
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/password"
|
android:id="@+id/email"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_marginStart="56dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:inputType="textEmailAddress"
|
||||||
|
android:autofillHints="emailAddress"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:hint="@string/email"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="start|top"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:backgroundTint="?colorM3OnSurfaceVariant"
|
||||||
|
android:background="@drawable/ic_outline_email_24"/>
|
||||||
|
|
||||||
|
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>
|
||||||
|
|
||||||
|
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout
|
||||||
|
android:id="@+id/password_wrap"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="80dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:paddingTop="4dp"
|
||||||
android:layout_marginRight="16dp"
|
app:labelTextColor="@color/m3_outlined_text_field_label"
|
||||||
android:inputType="textPassword"
|
android:foreground="@drawable/bg_m3_outlined_text_field">
|
||||||
android:autofillHints="password"
|
|
||||||
android:singleLine="true"
|
<EditText
|
||||||
android:fontFamily="sans-serif"
|
android:id="@+id/password"
|
||||||
android:hint="@string/password"/>
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_marginStart="56dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:autofillHints="password"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:fontFamily="sans-serif"
|
||||||
|
android:hint="@string/password"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="start|top"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:backgroundTint="?colorM3OnSurfaceVariant"
|
||||||
|
android:background="@drawable/ic_outline_password_24"/>
|
||||||
|
|
||||||
|
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>
|
||||||
|
|
||||||
|
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout
|
||||||
|
android:id="@+id/password_confirm_wrap"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:paddingTop="4dp"
|
||||||
|
app:labelTextColor="@color/m3_outlined_text_field_label"
|
||||||
|
android:foreground="@drawable/bg_m3_outlined_text_field">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/password_confirm"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_marginStart="56dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:autofillHints="password"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:fontFamily="sans-serif"
|
||||||
|
android:hint="@string/confirm_password"/>
|
||||||
|
|
||||||
|
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginStart="56dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginEnd="20dp"
|
||||||
android:layout_marginRight="16dp"
|
android:textAppearance="@style/m3_body_small"
|
||||||
android:layout_marginBottom="16dp"
|
android:textColor="?colorM3OnSurfaceVariant"
|
||||||
android:textAppearance="@style/m3_body_medium"
|
|
||||||
android:textColor="?android:textColorSecondary"
|
|
||||||
android:text="@string/password_note"/>
|
android:text="@string/password_note"/>
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/reason"
|
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout
|
||||||
|
android:id="@+id/reason_wrap"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:paddingTop="4dp"
|
||||||
android:layout_marginLeft="16dp"
|
app:labelTextColor="@color/m3_outlined_text_field_label"
|
||||||
android:layout_marginRight="16dp"
|
android:foreground="@drawable/bg_m3_outlined_text_field">
|
||||||
android:inputType="textCapSentences|textMultiLine"
|
|
||||||
android:hint="@string/signup_reason"/>
|
<EditText
|
||||||
|
android:id="@+id/reason"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="56dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="12dp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:inputType="textCapSentences|textMultiLine"
|
||||||
|
android:hint="@string/signup_reason"/>
|
||||||
|
|
||||||
|
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/reason_explain"
|
android:id="@+id/reason_explain"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginStart="56dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginEnd="20dp"
|
||||||
android:layout_marginRight="16dp"
|
android:textAppearance="@style/m3_body_small"
|
||||||
android:layout_marginBottom="16dp"
|
android:textColor="?colorM3OnSurfaceVariant"
|
||||||
android:textAppearance="@style/m3_body_medium"
|
|
||||||
android:textColor="?android:textColorSecondary"
|
|
||||||
android:text="@string/signup_reason_note"/>
|
android:text="@string/signup_reason_note"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@@ -163,32 +235,18 @@
|
|||||||
android:id="@+id/button_bar"
|
android:id="@+id/button_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?colorBackgroundLight"
|
android:orientation="horizontal">
|
||||||
android:outlineProvider="bounds"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:elevation="3dp">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_back"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:minWidth="145dp"
|
|
||||||
style="?secondaryLargeButtonStyle"
|
|
||||||
android:text="@string/back"/>
|
|
||||||
|
|
||||||
<Space
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:layout_weight="1"/>
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btn_next"
|
android:id="@+id/btn_next"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
android:minWidth="145dp"
|
android:minWidth="145dp"
|
||||||
style="?primaryLargeButtonStyle"
|
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||||
android:text="@string/next" />
|
android:text="@string/next" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<org.joinmastodon.android.ui.views.SizeListenerFrameLayout
|
<org.joinmastodon.android.ui.views.SizeListenerFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false">
|
||||||
android:clipChildren="false">
|
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/blue_fill"
|
android:id="@+id/blue_fill"
|
||||||
@@ -18,51 +17,60 @@
|
|||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/art_container"
|
android:id="@+id/art_container"
|
||||||
android:layout_width="450dp"
|
android:layout_width="360dp"
|
||||||
android:layout_height="631dp"
|
android:layout_height="640dp"
|
||||||
android:layout_marginTop="40dp"
|
android:layout_gravity="center"
|
||||||
android:layout_gravity="center">
|
tools:ignore="rtlHardcoded">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/art_clouds"
|
android:id="@+id/art_clouds"
|
||||||
android:layout_width="450dp"
|
android:layout_width="414dp"
|
||||||
android:layout_height="589dp"
|
android:layout_height="541dp"
|
||||||
android:layout_gravity="bottom|center_horizontal"
|
android:layout_marginTop="91dp"
|
||||||
|
android:layout_gravity="top|left"
|
||||||
|
android:alpha="0.3"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
android:src="@drawable/splash_art_layer0"/>
|
android:src="@drawable/splash_art_layer0"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/art_plane_elephant"
|
||||||
|
android:layout_width="245.64dp"
|
||||||
|
android:layout_height="72.65dp"
|
||||||
|
android:layout_marginLeft="-101.55dp"
|
||||||
|
android:layout_marginTop="238.12dp"
|
||||||
|
android:layout_gravity="left|top"
|
||||||
|
android:alpha="0.3"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:src="@drawable/splash_art_layer4"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/art_right_hill"
|
android:id="@+id/art_right_hill"
|
||||||
android:layout_width="218dp"
|
android:layout_width="150.84dp"
|
||||||
android:layout_height="255dp"
|
android:layout_height="176.44dp"
|
||||||
android:layout_gravity="bottom|right"
|
android:layout_gravity="top|left"
|
||||||
android:layout_marginBottom="156dp"
|
android:layout_marginLeft="322dp"
|
||||||
android:layout_marginRight="11dp"
|
android:layout_marginTop="310dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
android:src="@drawable/splash_art_layer1"/>
|
android:src="@drawable/splash_art_layer1"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/art_left_hill"
|
android:id="@+id/art_left_hill"
|
||||||
android:layout_width="285dp"
|
android:layout_width="197.2dp"
|
||||||
android:layout_height="222dp"
|
android:layout_height="153.61dp"
|
||||||
android:layout_gravity="bottom|left"
|
android:layout_gravity="top|left"
|
||||||
android:layout_marginLeft="-6dp"
|
android:layout_marginTop="294dp"
|
||||||
android:layout_marginBottom="243dp"
|
android:importantForAccessibility="no"
|
||||||
android:src="@drawable/splash_art_layer2"/>
|
android:src="@drawable/splash_art_layer2"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/art_center_hill"
|
android:id="@+id/art_center_hill"
|
||||||
android:layout_width="457dp"
|
android:layout_width="400dp"
|
||||||
android:layout_height="397dp"
|
android:layout_height="346dp"
|
||||||
android:layout_gravity="bottom|center_horizontal"
|
android:layout_gravity="top|left"
|
||||||
android:layout_marginBottom="51dp"
|
android:layout_marginTop="294dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
android:src="@drawable/splash_art_layer3"/>
|
android:src="@drawable/splash_art_layer3"/>
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/art_plane_elephant"
|
|
||||||
android:layout_width="355dp"
|
|
||||||
android:layout_height="105dp"
|
|
||||||
android:layout_gravity="left|top"
|
|
||||||
android:src="@drawable/splash_art_layer4"/>
|
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
@@ -73,36 +81,66 @@
|
|||||||
android:transformPivotY="1px"
|
android:transformPivotY="1px"
|
||||||
android:background="#478E6A"/>
|
android:background="#478E6A"/>
|
||||||
|
|
||||||
<org.joinmastodon.android.ui.views.SplashLogoView
|
|
||||||
android:layout_width="261dp"
|
|
||||||
android:layout_height="71dp"
|
|
||||||
android:layout_gravity="center_horizontal|top"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:scaleType="center"
|
|
||||||
android:importantForAccessibility="no"
|
|
||||||
android:src="@drawable/splash_logo"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:padding="16dp"
|
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_get_started"
|
<androidx.viewpager2.widget.ViewPager2
|
||||||
|
android:id="@+id/pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/pager_dots"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="13dp"
|
android:layout_gravity="center_horizontal"
|
||||||
style="@style/Widget.Mastodon.Button.Large.Primary_LightOnDark"
|
android:layout_marginBottom="16dp"
|
||||||
android:text="@string/get_started"/>
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="8dp"
|
||||||
|
android:layout_height="8dp"/>
|
||||||
|
<!-- android:background="@drawable/white_circle"/>-->
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="8dp"
|
||||||
|
android:layout_height="8dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:alpha="0.3"/>
|
||||||
|
<!-- android:background="@drawable/white_circle"-->
|
||||||
|
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="8dp"
|
||||||
|
android:layout_height="8dp"
|
||||||
|
android:alpha="0.3"/>
|
||||||
|
<!-- android:background="@drawable/white_circle"-->
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btn_log_in"
|
android:id="@+id/btn_log_in"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
style="@style/Widget.Mastodon.Button.Large.Primary_DarkOnLight"
|
android:layout_marginLeft="16dp"
|
||||||
android:background="@drawable/bg_button_green"
|
android:layout_marginRight="16dp"
|
||||||
android:text="@string/log_in"/>
|
style="@style/Widget.Mastodon.M3.Button.Text"
|
||||||
|
android:textColor="#fff"
|
||||||
|
android:text="@string/already_have_account"/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_get_started"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||||
|
android:text="@string/get_started"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</org.joinmastodon.android.ui.views.SizeListenerFrameLayout>
|
</org.joinmastodon.android.ui.views.SizeListenerFrameLayout>
|
||||||
59
mastodon/src/main/res/layout/header_megalodon_welcome.xml
Normal file
59
mastodon/src/main/res/layout/header_megalodon_welcome.xml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<include layout="@layout/display_item_header" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
style="@style/m3_headline_small"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginVertical="12dp"
|
||||||
|
android:text="@string/sk_welcome_title"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
style="@style/m3_body_large"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:text="@string/sk_welcome_text" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0.5dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:background="?attr/colorPollVoted"/>
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/search_edit"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:inputType="textFilter|textNoSuggestions"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:imeOptions="actionGo"
|
||||||
|
android:drawableStart="@drawable/ic_fluent_globe_20_regular"
|
||||||
|
android:drawablePadding="12dp"
|
||||||
|
android:drawableTint="?android:textColorSecondary"
|
||||||
|
android:background="@drawable/bg_search_field"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:elevation="0dp"
|
||||||
|
android:hint="@string/sk_example_domain"/>
|
||||||
|
|
||||||
|
|
||||||
|
<ViewStub
|
||||||
|
android:layout="?errorViewLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/error"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="12dp"
|
|
||||||
android:layout_marginTop="32dp"
|
|
||||||
android:layout_marginLeft="19dp"
|
|
||||||
android:layout_marginRight="19dp"
|
|
||||||
android:textAppearance="@style/m3_headline_medium"
|
|
||||||
android:minHeight="36dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:text="@string/instance_catalog_title"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/subtitle"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="19dp"
|
|
||||||
android:layout_marginRight="19dp"
|
|
||||||
android:layout_marginBottom="24dp"
|
|
||||||
android:textAppearance="@style/m3_title_medium"
|
|
||||||
android:textColor="?android:textColorSecondary"
|
|
||||||
android:text="@string/instance_catalog_subtitle"/>
|
|
||||||
|
|
||||||
<org.joinmastodon.android.ui.tabs.TabLayout
|
|
||||||
android:id="@+id/categories_list"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="72dp"
|
|
||||||
android:background="@drawable/bg_catalog_tabs"
|
|
||||||
app:tabIndicator="@drawable/mtrl_tabs_default_indicator"
|
|
||||||
app:tabIndicatorAnimationMode="elastic"
|
|
||||||
app:tabIndicatorColor="?android:textColorPrimary"
|
|
||||||
app:tabMinWidth="120dp"
|
|
||||||
app:tabMaxWidth="120dp"
|
|
||||||
app:tabMode="scrollable"/>
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/search_edit"
|
|
||||||
style="@android:style/Widget.EditText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginTop="19dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:layout_marginBottom="3dp"
|
|
||||||
android:drawableStart="@drawable/ic_fluent_search_20_regular"
|
|
||||||
android:drawablePadding="8dp"
|
|
||||||
android:drawableTint="?android:textColorSecondary"
|
|
||||||
android:hint="@string/search_communities"
|
|
||||||
android:imeOptions="actionGo"
|
|
||||||
android:inputType="textFilter|textNoSuggestions"
|
|
||||||
android:singleLine="true" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -18,6 +18,17 @@
|
|||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:clickable="false"/>
|
android:clickable="false"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image"
|
||||||
|
android:layout_width="56dp"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:layout_toEndOf="@id/radiobtn"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:src="#0f0"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/title"
|
android:id="@+id/title"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
12
mastodon/src/main/res/layout/item_list_header_simple.xml
Normal file
12
mastodon/src/main/res/layout/item_list_header_simple.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="@style/m3_body_large"
|
||||||
|
android:textColor="?colorM3OnSurface"
|
||||||
|
android:paddingStart="56dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingEnd="24dp"
|
||||||
|
android:paddingBottom="12dp">
|
||||||
|
</TextView>
|
||||||
@@ -28,4 +28,29 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingRight="16dp"/>
|
android:paddingRight="16dp"/>
|
||||||
|
|
||||||
|
<!-- <ImageView-->
|
||||||
|
<!-- android:id="@+id/edit"-->
|
||||||
|
<!-- android:layout_width="36dp"-->
|
||||||
|
<!-- android:layout_height="36dp"-->
|
||||||
|
<!-- android:layout_marginTop="0dp"-->
|
||||||
|
<!-- android:layout_marginEnd="6dp"-->
|
||||||
|
<!-- android:layout_toStartOf="@id/list_toggle"-->
|
||||||
|
<!-- android:background="?android:selectableItemBackgroundBorderless"-->
|
||||||
|
<!-- android:scaleType="center"-->
|
||||||
|
<!-- android:src="@drawable/ic_fluent_edit_24_regular"-->
|
||||||
|
<!-- android:tint="?android:textColorSecondary" />-->
|
||||||
|
|
||||||
|
<!-- <ImageView-->
|
||||||
|
<!-- android:id="@+id/delete"-->
|
||||||
|
<!-- android:layout_width="36dp"-->
|
||||||
|
<!-- android:layout_height="36dp"-->
|
||||||
|
<!-- android:layout_marginTop="0dp"-->
|
||||||
|
<!-- android:layout_marginEnd="6dp"-->
|
||||||
|
<!-- android:layout_toStartOf="@id/edit"-->
|
||||||
|
<!-- android:background="?android:selectableItemBackgroundBorderless"-->
|
||||||
|
<!-- android:scaleType="center"-->
|
||||||
|
<!-- android:src="@drawable/ic_fluent_delete_24_regular"-->
|
||||||
|
<!-- android:tint="?android:textColorSecondary" />-->
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
14
mastodon/src/main/res/layout/item_moshidon_instance.xml
Normal file
14
mastodon/src/main/res/layout/item_moshidon_instance.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:paddingVertical="8dp">
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/bg_search_field">
|
||||||
|
<include layout="@layout/item_instance_catalog" />
|
||||||
|
</FrameLayout>
|
||||||
|
</FrameLayout>
|
||||||
@@ -1,44 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/title"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="16dp"
|
android:paddingTop="12dp"
|
||||||
android:elevation="3dp"
|
android:paddingEnd="24dp"
|
||||||
android:background="?colorBackgroundLightest"
|
android:paddingBottom="12dp"
|
||||||
android:foreground="?android:selectableItemBackground">
|
android:paddingStart="16dp"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textColor="?colorM3Primary"
|
||||||
|
android:drawableStart="@drawable/ic_outline_link_24"
|
||||||
|
android:drawablePadding="16dp"
|
||||||
|
android:drawableTint="?colorM3Primary"
|
||||||
|
tools:text="Privacy Policy - example.social">
|
||||||
|
|
||||||
<ImageView
|
</TextView>
|
||||||
android:id="@+id/favicon"
|
|
||||||
android:layout_width="16dp"
|
|
||||||
android:layout_height="16dp"
|
|
||||||
android:layout_marginTop="2dp"
|
|
||||||
android:importantForAccessibility="no"
|
|
||||||
tools:src="#0f0"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/domain"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_toEndOf="@id/favicon"
|
|
||||||
android:layout_marginStart="4dp"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:textAppearance="@style/m3_title_small"
|
|
||||||
android:textColor="?android:textColorPrimary"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
tools:text="joinmastodon.org"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:layout_below="@id/domain"
|
|
||||||
android:layout_marginTop="6dp"
|
|
||||||
android:textAppearance="@style/m3_title_medium"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
tools:text="Mastodon for Android privacy policy"/>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
34
mastodon/src/main/res/layout/item_server_rule.xml
Normal file
34
mastodon/src/main/res/layout/item_server_rule.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingEnd="24dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:baselineAligned="false">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/number"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:textColor="?colorM3Primary"
|
||||||
|
android:fontFamily="sans-serif-condensed"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:textSize="22dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:includeFontPadding="false"
|
||||||
|
tools:text="1"/>
|
||||||
|
|
||||||
|
<org.joinmastodon.android.ui.views.LinkedTextView
|
||||||
|
android:id="@+id/text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="top"
|
||||||
|
android:textAppearance="@style/m3_body_large"
|
||||||
|
tools:text="No discrimination, including (but not limited to) racism, sexism, homophobia or transphobia."/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@+id/m3_color" android:title="@string/sk_color_theme_material3"/>
|
||||||
<item android:id="@+id/purple_color" android:title="@string/sk_color_theme_purple"/>
|
<item android:id="@+id/purple_color" android:title="@string/sk_color_theme_purple"/>
|
||||||
<item android:id="@+id/pink_color" android:title="@string/sk_color_theme_pink"/>
|
<item android:id="@+id/pink_color" android:title="@string/sk_color_theme_pink"/>
|
||||||
<item android:id="@+id/green_color" android:title="@string/sk_color_theme_green"/>
|
<item android:id="@+id/green_color" android:title="@string/sk_color_theme_green"/>
|
||||||
<item android:id="@+id/blue_color" android:title="@string/sk_color_theme_blue"/>
|
<item android:id="@+id/blue_color" android:title="@string/sk_color_theme_blue"/>
|
||||||
<item android:id="@+id/orange_color" android:title="@string/sk_color_theme_brown"/>
|
<item android:id="@+id/orange_color" android:title="@string/sk_color_theme_brown"/>
|
||||||
<item android:id="@+id/yellow_color" android:title="@string/sk_color_theme_yellow"/>
|
<item android:id="@+id/yellow_color" android:title="@string/sk_color_theme_yellow"/>
|
||||||
<item android:id="@+id/m3_color" android:title="@string/sk_color_theme_material_you"/>
|
|
||||||
</menu>
|
</menu>
|
||||||
@@ -2,4 +2,5 @@
|
|||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/shortcut_icon_background"/>
|
<background android:drawable="@color/shortcut_icon_background"/>
|
||||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -2,4 +2,5 @@
|
|||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/shortcut_icon_background"/>
|
<background android:drawable="@color/shortcut_icon_background"/>
|
||||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -11,11 +11,11 @@
|
|||||||
<string name="sk_settings_load_new_posts">Carrega automàticament les publicacions noves</string>
|
<string name="sk_settings_load_new_posts">Carrega automàticament les publicacions noves</string>
|
||||||
<string name="sk_federated_timeline">Federació</string>
|
<string name="sk_federated_timeline">Federació</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Aquestes són les publicacions més recents de gent de la teua federació.</string>
|
<string name="sk_federated_timeline_info_banner">Aquestes són les publicacions més recents de gent de la teua federació.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s s\'ha baixat i està preparat per a instal·lar-se.</string>
|
<string name="sk_update_ready">Moshidon %s s\'ha baixat i està preparat per a instal·lar-se.</string>
|
||||||
<string name="sk_accept_follow_request">Accepta la sol·licitud</string>
|
<string name="sk_accept_follow_request">Accepta la sol·licitud</string>
|
||||||
<string name="sk_disable_marquee">Desactiva el desplaçament de text a les barres de títol</string>
|
<string name="sk_disable_marquee">Desactiva el desplaçament de text a les barres de títol</string>
|
||||||
<string name="sk_user_post_notifications_on">Notificacions activades per a publicacions de: %s</string>
|
<string name="sk_user_post_notifications_on">Notificacions activades per a publicacions de: %s</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pin_post">Fixa al perfil</string>
|
<string name="sk_pin_post">Fixa al perfil</string>
|
||||||
<string name="sk_confirm_pin_post_title">Fixar al perfil</string>
|
<string name="sk_confirm_pin_post_title">Fixar al perfil</string>
|
||||||
<string name="sk_confirm_delete_and_redraft">Segur que vols eliminar i tornar a escriure aquesta publicació\?</string>
|
<string name="sk_confirm_delete_and_redraft">Segur que vols eliminar i tornar a escriure aquesta publicació\?</string>
|
||||||
@@ -25,10 +25,10 @@
|
|||||||
<string name="sk_visibility_unlisted">No llistat</string>
|
<string name="sk_visibility_unlisted">No llistat</string>
|
||||||
<string name="sk_settings_show_boosts">Mostra els impulsos</string>
|
<string name="sk_settings_show_boosts">Mostra els impulsos</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Mostra el recompte d\'interaccions</string>
|
<string name="sk_settings_show_interaction_counts">Mostra el recompte d\'interaccions</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v. %1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v. %1$s (%2$d)</string>
|
||||||
<string name="sk_user_post_notifications_off">Notificacions desactivades per a publicacions de: %s</string>
|
<string name="sk_user_post_notifications_off">Notificacions desactivades per a publicacions de: %s</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Marca el contingut com a sensible</string>
|
<string name="sk_mark_media_as_sensitive">Marca el contingut com a sensible</string>
|
||||||
<string name="sk_update_available">Megalodon %s està preparat per a baixar-se.</string>
|
<string name="sk_update_available">Moshidon %s està preparat per a baixar-se.</string>
|
||||||
<string name="sk_check_for_update">Comprova actualitzacions</string>
|
<string name="sk_check_for_update">Comprova actualitzacions</string>
|
||||||
<string name="sk_no_update_available">No hi ha cap actualització disponible</string>
|
<string name="sk_no_update_available">No hi ha cap actualització disponible</string>
|
||||||
<string name="sk_list_timelines">Llistes</string>
|
<string name="sk_list_timelines">Llistes</string>
|
||||||
@@ -36,6 +36,15 @@
|
|||||||
<string name="sk_reject_follow_request">Rebutja la sol·licitud</string>
|
<string name="sk_reject_follow_request">Rebutja la sol·licitud</string>
|
||||||
<string name="sk_lists_with_user">Llistes amb %s</string>
|
<string name="sk_lists_with_user">Llistes amb %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Mostra sempre els avisos de contingut</string>
|
<string name="sk_settings_always_reveal_content_warnings">Mostra sempre els avisos de contingut</string>
|
||||||
<string name="sk_settings_contribute">Contribueix a Megalodon</string>
|
<string name="sk_settings_contribute">Contribueix a Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Mostra la línia de temps federada</string>
|
<string name="sk_settings_show_federated_timeline">Mostra la línia de temps federada</string>
|
||||||
|
<string name="sk_notification_type_status">Publicacions</string>
|
||||||
|
<string name="sk_notify_posts">Notificacions de publicacions</string>
|
||||||
|
<string name="sk_settings_color_picker">Color de tema</string>
|
||||||
|
<string name="sk_color_theme_pink">Rosa</string>
|
||||||
|
<string name="sk_color_theme_purple">Lila</string>
|
||||||
|
<string name="sk_color_theme_green">Verd</string>
|
||||||
|
<string name="sk_color_theme_blue">Blau</string>
|
||||||
|
<string name="sk_color_theme_brown">Marró</string>
|
||||||
|
<string name="sk_color_theme_yellow">Groc</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Angeheftet</string>
|
<string name="sk_pinned_posts">Angeheftet</string>
|
||||||
<string name="sk_delete_and_redraft">Löschen und neu erstellen</string>
|
<string name="sk_delete_and_redraft">Löschen und neu erstellen</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">Beitrag löschen und neu erstellen</string>
|
<string name="sk_confirm_delete_and_redraft_title">Beitrag löschen und neu erstellen</string>
|
||||||
@@ -19,14 +19,14 @@
|
|||||||
<string name="sk_settings_show_boosts">Geteilte Beiträge anzeigen</string>
|
<string name="sk_settings_show_boosts">Geteilte Beiträge anzeigen</string>
|
||||||
<string name="sk_settings_load_new_posts">Automatisch neue Beiträge laden</string>
|
<string name="sk_settings_load_new_posts">Automatisch neue Beiträge laden</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Interaktions-Anzahlen anzeigen</string>
|
<string name="sk_settings_show_interaction_counts">Interaktions-Anzahlen anzeigen</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Medien als sensibel markieren</string>
|
<string name="sk_mark_media_as_sensitive">Medien als sensibel markieren</string>
|
||||||
<string name="sk_user_post_notifications_on">Benachrichtigungen über Beiträge von %s aktiviert</string>
|
<string name="sk_user_post_notifications_on">Benachrichtigungen über Beiträge von %s aktiviert</string>
|
||||||
<string name="sk_user_post_notifications_off">Benachrichtigungen über Beiträge von %s deaktiviert</string>
|
<string name="sk_user_post_notifications_off">Benachrichtigungen über Beiträge von %s deaktiviert</string>
|
||||||
<string name="sk_federated_timeline">Föderation</string>
|
<string name="sk_federated_timeline">Föderation</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind.</string>
|
<string name="sk_federated_timeline_info_banner">Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind.</string>
|
||||||
<string name="sk_update_available">Megalodon %s ist zum Herunterladen bereit.</string>
|
<string name="sk_update_available">Moshidon %s ist zum Herunterladen bereit.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s wurde heruntergeladen und kann jetzt installiert werden.</string>
|
<string name="sk_update_ready">Moshidon %s wurde heruntergeladen und kann jetzt installiert werden.</string>
|
||||||
<string name="sk_check_for_update">Auf Update prüfen</string>
|
<string name="sk_check_for_update">Auf Update prüfen</string>
|
||||||
<string name="sk_no_update_available">Kein Update verfügbar</string>
|
<string name="sk_no_update_available">Kein Update verfügbar</string>
|
||||||
<string name="sk_list_timelines">Listen</string>
|
<string name="sk_list_timelines">Listen</string>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<string name="sk_lists_with_user">Listen mit %s</string>
|
<string name="sk_lists_with_user">Listen mit %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Inhaltswarnungen immer ausklappen</string>
|
<string name="sk_settings_always_reveal_content_warnings">Inhaltswarnungen immer ausklappen</string>
|
||||||
<string name="sk_disable_marquee">Laufschrift in Titelleisten deaktivieren</string>
|
<string name="sk_disable_marquee">Laufschrift in Titelleisten deaktivieren</string>
|
||||||
<string name="sk_settings_contribute">Zu Megalodon beitragen</string>
|
<string name="sk_settings_contribute">Zu Moshidon beitragen</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Föderierte Timeline anzeigen</string>
|
<string name="sk_settings_show_federated_timeline">Föderierte Timeline anzeigen</string>
|
||||||
<string name="sk_notify_posts">Beitrags-Benachrichtigungen</string>
|
<string name="sk_notify_posts">Beitrags-Benachrichtigungen</string>
|
||||||
<string name="sk_settings_color_picker">Farbschema</string>
|
<string name="sk_settings_color_picker">Farbschema</string>
|
||||||
@@ -47,4 +47,13 @@
|
|||||||
<string name="sk_color_theme_yellow">Gelb</string>
|
<string name="sk_color_theme_yellow">Gelb</string>
|
||||||
<string name="sk_notification_type_status">Beiträge</string>
|
<string name="sk_notification_type_status">Beiträge</string>
|
||||||
<string name="sk_color_theme_blue">Blau</string>
|
<string name="sk_color_theme_blue">Blau</string>
|
||||||
|
<string name="sk_poll_allow_multiple">Mehrfachantworten erlauben</string>
|
||||||
|
<string name="sk_translated_using">Übersetzt mit %s</string>
|
||||||
|
<string name="sk_post_language">Sprache: %s</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">Sicher, dass du die Liste der zuletzt verwendeten Sprachen leeren willst\?</string>
|
||||||
|
<string name="sk_translate_post">Übersetzen</string>
|
||||||
|
<string name="sk_translate_show_original">Original anzeigen</string>
|
||||||
|
<string name="sk_available_languages">Verfügbare Sprachen</string>
|
||||||
|
<string name="sk_clear_recent_languages">Zuletzt verwendete Sprachen leeren</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -2,30 +2,30 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="sk_pinned_posts">Anclado</string>
|
<string name="sk_pinned_posts">Anclado</string>
|
||||||
<string name="sk_delete_and_redraft">Eliminar y editar</string>
|
<string name="sk_delete_and_redraft">Eliminar y editar</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">Eliminar y editar post</string>
|
<string name="sk_confirm_delete_and_redraft_title">Eliminar y editar publicación</string>
|
||||||
<string name="sk_confirm_delete_and_redraft">Seguro que quiere eliminar y volver a editar este post\?</string>
|
<string name="sk_confirm_delete_and_redraft">¿Confirma que quiere eliminar y volver a editar esta publicación\?</string>
|
||||||
<string name="sk_pin_post">Fijar en perfil</string>
|
<string name="sk_pin_post">Anclar en perfil</string>
|
||||||
<string name="sk_confirm_pin_post_title">Fijar post en perfil</string>
|
<string name="sk_confirm_pin_post_title">Anclar publicación en perfil</string>
|
||||||
<string name="sk_confirm_pin_post">Desea fijar el post en su perfil\?</string>
|
<string name="sk_confirm_pin_post">¿Quiere anclar la publicación en su perfil\?</string>
|
||||||
<string name="sk_pinning">Fijando post…</string>
|
<string name="sk_pinning">Anclando publicación…</string>
|
||||||
<string name="sk_unpin_post">Quitar del perfil</string>
|
<string name="sk_unpin_post">Desanclar del perfil</string>
|
||||||
<string name="sk_confirm_unpin_post_title">Quitar post del perfil</string>
|
<string name="sk_confirm_unpin_post_title">Desanclar publicación del perfil</string>
|
||||||
<string name="sk_confirm_unpin_post">Está seguro que quiere quitar el post\?</string>
|
<string name="sk_confirm_unpin_post">¿Confirma que quiere desanclar esta publicación\?</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_unpinning">Quitando post…</string>
|
<string name="sk_unpinning">Desanclando publicación…</string>
|
||||||
<string name="sk_image_description">Descripción de la imagen</string>
|
<string name="sk_image_description">Descripción de la imagen</string>
|
||||||
<string name="sk_visibility_unlisted">Sin listar</string>
|
<string name="sk_visibility_unlisted">Descatalogada</string>
|
||||||
<string name="sk_settings_show_replies">Mostrar respuestas</string>
|
<string name="sk_settings_show_replies">Mostrar respuestas</string>
|
||||||
<string name="sk_settings_show_boosts">Mostrar boosts</string>
|
<string name="sk_settings_show_boosts">Mostrar impulsos</string>
|
||||||
<string name="sk_settings_load_new_posts">Cargar nuevos posts automáticamente</string>
|
<string name="sk_settings_load_new_posts">Cargar publicaciones nuevas automáticamente</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Mostrar contadores de interacciones</string>
|
<string name="sk_settings_show_interaction_counts">Mostrar recuentos de interacciones</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Marcar medio como sensible</string>
|
<string name="sk_mark_media_as_sensitive">Marcar medio como delicado</string>
|
||||||
<string name="sk_user_post_notifications_on">Activadas las notificaciones de posts para %s</string>
|
<string name="sk_user_post_notifications_on">Activadas las notificaciones de posts para %s</string>
|
||||||
<string name="sk_user_post_notifications_off">Desactivadas las notificaciones de posts para %s</string>
|
<string name="sk_user_post_notifications_off">Desactivadas las notificaciones de posts para %s</string>
|
||||||
<string name="sk_federated_timeline">Federación</string>
|
<string name="sk_federated_timeline">Federación</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Estos son los posts más recientes de las personas de tu federación.</string>
|
<string name="sk_federated_timeline_info_banner">Estas son las publicaciones más recientes de las personas de su federación.</string>
|
||||||
<string name="sk_update_available">Megalodon %s está listo para descargar.</string>
|
<string name="sk_update_available">Moshidon %s está listo para descargar.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s se ha descargado y está listo para instalarse.</string>
|
<string name="sk_update_ready">Moshidon %s se ha descargado y está listo para instalarse.</string>
|
||||||
<string name="sk_check_for_update">Buscar actualizaciones</string>
|
<string name="sk_check_for_update">Buscar actualizaciones</string>
|
||||||
<string name="sk_no_update_available">No hay actualizaciones disponibles</string>
|
<string name="sk_no_update_available">No hay actualizaciones disponibles</string>
|
||||||
<string name="sk_list_timelines">Listas</string>
|
<string name="sk_list_timelines">Listas</string>
|
||||||
@@ -35,7 +35,25 @@
|
|||||||
<string name="sk_lists_with_user">Listas con %s</string>
|
<string name="sk_lists_with_user">Listas con %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Mostrar siempre advertencias de contenido</string>
|
<string name="sk_settings_always_reveal_content_warnings">Mostrar siempre advertencias de contenido</string>
|
||||||
<string name="sk_disable_marquee">Desactivar desplazamiento de texto en barras del título</string>
|
<string name="sk_disable_marquee">Desactivar desplazamiento de texto en barras del título</string>
|
||||||
<string name="sk_settings_contribute">Contribuir a Megalodon</string>
|
<string name="sk_settings_contribute">Contribuir a Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Mostrar el timeline federado</string>
|
<string name="sk_settings_show_federated_timeline">Mostrar cronología federada</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
|
<string name="sk_notification_type_status">Publicaciones</string>
|
||||||
|
<string name="sk_notify_posts">Publicar notificaciones</string>
|
||||||
|
<string name="sk_settings_color_picker">Colores para los temas</string>
|
||||||
|
<string name="sk_color_theme_pink">Rosa</string>
|
||||||
|
<string name="sk_color_theme_purple">Violeta</string>
|
||||||
|
<string name="sk_color_theme_green">Verde</string>
|
||||||
|
<string name="sk_color_theme_blue">Azul</string>
|
||||||
|
<string name="sk_color_theme_brown">Marrón</string>
|
||||||
|
<string name="sk_color_theme_yellow">Amarillo</string>
|
||||||
|
<string name="sk_poll_allow_multiple">Permitir respuesta múltiple</string>
|
||||||
|
<string name="sk_translate_post">Traducir</string>
|
||||||
|
<string name="sk_translate_show_original">Mostrar original</string>
|
||||||
|
<string name="sk_translated_using">Traducido mediante %s</string>
|
||||||
|
<string name="sk_post_language">Idioma: %s</string>
|
||||||
|
<string name="sk_available_languages">Idiomas disponibles</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">¿Confirma que quiere vaciar sus idiomas usados recientemente\?</string>
|
||||||
|
<string name="sk_clear_recent_languages">Vaciar idiomas usados recientemente</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -13,12 +13,12 @@
|
|||||||
<string name="sk_settings_show_replies">Afficher les réponses</string>
|
<string name="sk_settings_show_replies">Afficher les réponses</string>
|
||||||
<string name="sk_settings_show_boosts">Afficher les boosts</string>
|
<string name="sk_settings_show_boosts">Afficher les boosts</string>
|
||||||
<string name="sk_settings_load_new_posts">Charger automatiquement les nouveaux messages</string>
|
<string name="sk_settings_load_new_posts">Charger automatiquement les nouveaux messages</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Marquer le média comme sensible</string>
|
<string name="sk_mark_media_as_sensitive">Marquer le média comme sensible</string>
|
||||||
<string name="sk_user_post_notifications_on">Notifications de message activées pour %s</string>
|
<string name="sk_user_post_notifications_on">Notifications de message activées pour %s</string>
|
||||||
<string name="sk_user_post_notifications_off">Désactivation des notifications de message pour %s</string>
|
<string name="sk_user_post_notifications_off">Désactivation des notifications de message pour %s</string>
|
||||||
<string name="sk_update_available">Megalodon %s est prête à être téléchargée.</string>
|
<string name="sk_update_available">Moshidon %s est prête à être téléchargée.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s est téléchargée et prête à être installée.</string>
|
<string name="sk_update_ready">Moshidon %s est téléchargée et prête à être installée.</string>
|
||||||
<string name="sk_check_for_update">Vérifier les mises à jour</string>
|
<string name="sk_check_for_update">Vérifier les mises à jour</string>
|
||||||
<string name="sk_no_update_available">Pas de mise a jour disponible</string>
|
<string name="sk_no_update_available">Pas de mise a jour disponible</string>
|
||||||
<string name="sk_list_timelines">Listes</string>
|
<string name="sk_list_timelines">Listes</string>
|
||||||
@@ -28,9 +28,9 @@
|
|||||||
<string name="sk_lists_with_user">Listes avec %s</string>
|
<string name="sk_lists_with_user">Listes avec %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Toujours afficher les avertissements de contenu</string>
|
<string name="sk_settings_always_reveal_content_warnings">Toujours afficher les avertissements de contenu</string>
|
||||||
<string name="sk_disable_marquee">Désactiver le défilement du texte dans les barres de titre</string>
|
<string name="sk_disable_marquee">Désactiver le défilement du texte dans les barres de titre</string>
|
||||||
<string name="sk_settings_contribute">Contribuez à Megalodon</string>
|
<string name="sk_settings_contribute">Contribuez à Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Afficher la timeline fédérée</string>
|
<string name="sk_settings_show_federated_timeline">Afficher la timeline fédérée</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_delete_and_redraft">Supprimer et rééditer</string>
|
<string name="sk_delete_and_redraft">Supprimer et rééditer</string>
|
||||||
<string name="sk_pin_post">Épingler au profil</string>
|
<string name="sk_pin_post">Épingler au profil</string>
|
||||||
<string name="sk_confirm_pin_post_title">Épingler le message au profil</string>
|
<string name="sk_confirm_pin_post_title">Épingler le message au profil</string>
|
||||||
@@ -38,4 +38,22 @@
|
|||||||
<string name="sk_settings_show_interaction_counts">Afficher le nombre d\'interactions</string>
|
<string name="sk_settings_show_interaction_counts">Afficher le nombre d\'interactions</string>
|
||||||
<string name="sk_federated_timeline">Fédération</string>
|
<string name="sk_federated_timeline">Fédération</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Ce sont les messages les plus récents des membres de votre fédération.</string>
|
<string name="sk_federated_timeline_info_banner">Ce sont les messages les plus récents des membres de votre fédération.</string>
|
||||||
|
<string name="sk_notification_type_status">Messages</string>
|
||||||
|
<string name="sk_notify_posts">Notifications des messages</string>
|
||||||
|
<string name="sk_color_theme_pink">Rose</string>
|
||||||
|
<string name="sk_color_theme_purple">Violet</string>
|
||||||
|
<string name="sk_color_theme_green">Vert</string>
|
||||||
|
<string name="sk_color_theme_blue">Bleu</string>
|
||||||
|
<string name="sk_color_theme_brown">Marron</string>
|
||||||
|
<string name="sk_color_theme_yellow">Jaune</string>
|
||||||
|
<string name="sk_settings_color_picker">Couleur d\'accentuation</string>
|
||||||
|
<string name="sk_poll_allow_multiple">Autoriser plusieurs choix</string>
|
||||||
|
<string name="sk_translate_post">Traduire</string>
|
||||||
|
<string name="sk_translate_show_original">Afficher l\'original</string>
|
||||||
|
<string name="sk_translated_using">Traduit en utilisant %s</string>
|
||||||
|
<string name="sk_post_language">Langue : %s</string>
|
||||||
|
<string name="sk_available_languages">Langues disponibles</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">Êtes-vous sûr de vouloir effacer vos langues récemment utilisées \?</string>
|
||||||
|
<string name="sk_clear_recent_languages">Effacer les langues récemment utilisées</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -12,23 +12,23 @@
|
|||||||
<string name="sk_settings_show_boosts">Lihat boost</string>
|
<string name="sk_settings_show_boosts">Lihat boost</string>
|
||||||
<string name="sk_settings_load_new_posts">Muat kiriman baru secara otomatis</string>
|
<string name="sk_settings_load_new_posts">Muat kiriman baru secara otomatis</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Tampilkan jumlah interaksi</string>
|
<string name="sk_settings_show_interaction_counts">Tampilkan jumlah interaksi</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_user_post_notifications_on">Nyalakan notifikasi kiriman untuk %s</string>
|
<string name="sk_user_post_notifications_on">Nyalakan notifikasi kiriman untuk %s</string>
|
||||||
<string name="sk_user_post_notifications_off">Matikan notifikasi kiriman untuk %s</string>
|
<string name="sk_user_post_notifications_off">Matikan notifikasi kiriman untuk %s</string>
|
||||||
<string name="sk_federated_timeline">Federasi</string>
|
<string name="sk_federated_timeline">Federasi</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Kiriman terbaru dari orang-orang di federasi anda.</string>
|
<string name="sk_federated_timeline_info_banner">Kiriman terbaru dari orang-orang di federasi anda.</string>
|
||||||
<string name="sk_update_available">Megalodon %s siap untuk diunduh.</string>
|
<string name="sk_update_available">Moshidon %s siap untuk diunduh.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s telah diunduh dan siap dipasang.</string>
|
<string name="sk_update_ready">Moshidon %s telah diunduh dan siap dipasang.</string>
|
||||||
<string name="sk_check_for_update">Periksa pembaruan</string>
|
<string name="sk_check_for_update">Periksa pembaruan</string>
|
||||||
<string name="sk_no_update_available">Tidak ada pembaruan</string>
|
<string name="sk_no_update_available">Tidak ada pembaruan</string>
|
||||||
<string name="sk_list_timelines">Daftar</string>
|
<string name="sk_list_timelines">Daftar</string>
|
||||||
<string name="sk_unpinning">Menghapus sematan kiriman…</string>
|
<string name="sk_unpinning">Menghapus sematan kiriman…</string>
|
||||||
<string name="sk_accept_follow_request">Terima permintaan pengikut</string>
|
<string name="sk_accept_follow_request">Terima permintaan pengikut</string>
|
||||||
<string name="sk_reject_follow_request">Tolak permintaan pengikut</string>
|
<string name="sk_reject_follow_request">Tolak permintaan pengikut</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_confirm_delete_and_redraft">Hapus dan tulis ulang kiriman ini\?</string>
|
<string name="sk_confirm_delete_and_redraft">Hapus dan tulis ulang kiriman ini\?</string>
|
||||||
<string name="sk_confirm_unpin_post">Apakah Anda yakin untuk menghapus sematan kiriman ini\?</string>
|
<string name="sk_confirm_unpin_post">Apakah Anda yakin untuk menghapus sematan kiriman ini\?</string>
|
||||||
<string name="sk_settings_contribute">Kontribusi ke Megalodon</string>
|
<string name="sk_settings_contribute">Kontribusi ke Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Disematkan</string>
|
<string name="sk_pinned_posts">Disematkan</string>
|
||||||
<string name="sk_pin_post">Sematkan ke profil</string>
|
<string name="sk_pin_post">Sematkan ke profil</string>
|
||||||
<string name="sk_visibility_unlisted">Tidak terdaftar</string>
|
<string name="sk_visibility_unlisted">Tidak terdaftar</string>
|
||||||
@@ -38,4 +38,13 @@
|
|||||||
<string name="sk_settings_always_reveal_content_warnings">Selalu ungkap peringatan konten</string>
|
<string name="sk_settings_always_reveal_content_warnings">Selalu ungkap peringatan konten</string>
|
||||||
<string name="sk_disable_marquee">Nonaktifkan teks bergulir dalam bilah judul</string>
|
<string name="sk_disable_marquee">Nonaktifkan teks bergulir dalam bilah judul</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Tampilkan lini masa federasi</string>
|
<string name="sk_settings_show_federated_timeline">Tampilkan lini masa federasi</string>
|
||||||
|
<string name="sk_notification_type_status">Kiriman</string>
|
||||||
|
<string name="sk_notify_posts">Notifikasi kiriman</string>
|
||||||
|
<string name="sk_settings_color_picker">Warna tema</string>
|
||||||
|
<string name="sk_color_theme_pink">Merah muda</string>
|
||||||
|
<string name="sk_color_theme_purple">Ungu</string>
|
||||||
|
<string name="sk_color_theme_green">Hijau</string>
|
||||||
|
<string name="sk_color_theme_blue">Biru</string>
|
||||||
|
<string name="sk_color_theme_brown">Cokelat</string>
|
||||||
|
<string name="sk_color_theme_yellow">Kuning</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,3 +1,50 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
<string name="sk_notification_type_status">Post</string>
|
||||||
|
<string name="sk_notify_posts">Notifiche post</string>
|
||||||
|
<string name="sk_settings_color_picker">Colore del tema</string>
|
||||||
|
<string name="sk_color_theme_pink">Rosa</string>
|
||||||
|
<string name="sk_color_theme_purple">Viola</string>
|
||||||
|
<string name="sk_color_theme_green">Verde</string>
|
||||||
|
<string name="sk_color_theme_blue">Blu</string>
|
||||||
|
<string name="sk_color_theme_brown">Marrone</string>
|
||||||
|
<string name="sk_color_theme_yellow">Giallo</string>
|
||||||
|
<string name="sk_app_name">Moshidon</string>
|
||||||
|
<string name="sk_pinned_posts">Fissati</string>
|
||||||
|
<string name="sk_delete_and_redraft">Elimina e riscrivi</string>
|
||||||
|
<string name="sk_user_post_notifications_on">Attivate notifiche per i post di %s</string>
|
||||||
|
<string name="sk_user_post_notifications_off">Disattivate notifiche per i post di %s</string>
|
||||||
|
<string name="sk_confirm_delete_and_redraft_title">Elimina e riscrivi post</string>
|
||||||
|
<string name="sk_confirm_delete_and_redraft">Sei sicuro di voler eliminare e riscrivere questo post\?</string>
|
||||||
|
<string name="sk_pin_post">Fissa sul profilo</string>
|
||||||
|
<string name="sk_confirm_pin_post_title">Fissa post sul profilo</string>
|
||||||
|
<string name="sk_confirm_pin_post">Vuoi fissare questo post al tuo profilo\?</string>
|
||||||
|
<string name="sk_pinning">Fissando il post…</string>
|
||||||
|
<string name="sk_unpin_post">Togli dal profilo</string>
|
||||||
|
<string name="sk_follow_requests">Richieste di seguirti</string>
|
||||||
|
<string name="sk_accept_follow_request">Accetta richiesta di seguirti</string>
|
||||||
|
<string name="sk_confirm_unpin_post_title">Togli post dal profilo</string>
|
||||||
|
<string name="sk_confirm_unpin_post">Sei sicuro di voler togliere questo post\?</string>
|
||||||
|
<string name="sk_unpinning">Togliendo il post…</string>
|
||||||
|
<string name="sk_image_description">Descrizione immagine</string>
|
||||||
|
<string name="sk_visibility_unlisted">Non in elenco</string>
|
||||||
|
<string name="sk_settings_show_replies">Mostra risposte</string>
|
||||||
|
<string name="sk_settings_show_boosts">Mostra boost</string>
|
||||||
|
<string name="sk_settings_load_new_posts">Carica automaticamente nuovi post</string>
|
||||||
|
<string name="sk_settings_show_interaction_counts">Mostra conteggi interazioni</string>
|
||||||
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
|
<string name="sk_mark_media_as_sensitive">Segnala media come sensibile</string>
|
||||||
|
<string name="sk_federated_timeline">Federata</string>
|
||||||
|
<string name="sk_federated_timeline_info_banner">Questi sono i post più recenti dalle persone nella tua federazione.</string>
|
||||||
|
<string name="sk_update_available">Moshidon %s è pronto da scaricare.</string>
|
||||||
|
<string name="sk_update_ready">Moshidon %s è scaricato e pronto da installare.</string>
|
||||||
|
<string name="sk_check_for_update">Verifica aggiornamenti</string>
|
||||||
|
<string name="sk_no_update_available">Non ci sono aggiornamenti disponibili</string>
|
||||||
|
<string name="sk_list_timelines">Liste</string>
|
||||||
|
<string name="sk_settings_always_reveal_content_warnings">Apri sempre contenuti segnalati come sensibili</string>
|
||||||
|
<string name="sk_lists_with_user">Liste con %s</string>
|
||||||
|
<string name="sk_settings_contribute">Contribuisci a Moshidon</string>
|
||||||
|
<string name="sk_settings_show_federated_timeline">Mostra timeline federata</string>
|
||||||
|
<string name="sk_disable_marquee">Disabilita scorrimento titoli</string>
|
||||||
|
<string name="sk_reject_follow_request">Rifiuta richiesta di seguirti</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,35 +1,59 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_pinned_posts">고정됨</string>
|
<string name="sk_pinned_posts">고정됨</string>
|
||||||
<string name="sk_delete_and_redraft">삭제하고 다시 쓰기</string>
|
<string name="sk_delete_and_redraft">삭제하고 다시 쓰기</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">게시물 삭제하고 다시 쓰기</string>
|
<string name="sk_confirm_delete_and_redraft_title">게시물 삭제하고 다시 쓰기</string>
|
||||||
<string name="sk_confirm_delete_and_redraft">정말로 이 게시물을 삭제하고 다시 쓰시겠습니까?</string>
|
<string name="sk_confirm_delete_and_redraft">정말로 이 게시물을 삭제하고 다시 쓰시겠습니까?</string>
|
||||||
<string name="sk_pin_post">고정</string>
|
<string name="sk_pin_post">고정</string>
|
||||||
<string name="sk_confirm_pin_post_title">게시물 고정</string>
|
<string name="sk_confirm_pin_post_title">게시물 고정</string>
|
||||||
<string name="sk_confirm_pin_post">정말로 이 게시물을 고정하시겠습니까?</string>
|
<string name="sk_confirm_pin_post">정말로 이 게시물을 고정하시겠습니까?</string>
|
||||||
<string name="sk_pinning">고정 중…</string>
|
<string name="sk_pinning">고정 중…</string>
|
||||||
<string name="sk_unpin_post">고정 해제</string>
|
<string name="sk_unpin_post">고정 해제</string>
|
||||||
<string name="sk_confirm_unpin_post_title">게시물 고정 해제</string>
|
<string name="sk_confirm_unpin_post_title">게시물 고정 해제</string>
|
||||||
<string name="sk_confirm_unpin_post">정말로 이 게시물을 고정 해제하시겠습니까?</string>
|
<string name="sk_confirm_unpin_post">정말로 이 게시물을 고정 해제하시겠습니까?</string>
|
||||||
<string name="sk_unpinning">고정 해제 중…</string>
|
<string name="sk_unpinning">고정 해제 중…</string>
|
||||||
<string name="sk_image_description">이미지 설명</string>
|
<string name="sk_image_description">이미지 설명</string>
|
||||||
<string name="sk_visibility_unlisted">타임라인에 비표시</string>
|
<string name="sk_visibility_unlisted">타임라인에 비표시</string>
|
||||||
<string name="sk_settings_show_replies">답장 표시</string>
|
<string name="sk_settings_show_replies">답장 표시</string>
|
||||||
<string name="sk_settings_show_boosts">리블로그 표시</string>
|
<string name="sk_settings_show_boosts">리블로그 표시</string>
|
||||||
<string name="sk_settings_load_new_posts">자동으로 새 포스트 불러오기</string>
|
<string name="sk_settings_load_new_posts">자동으로 새 게시물 불러오기</string>
|
||||||
<string name="sk_settings_show_interaction_counts">상호 작용 수 표시</string>
|
<string name="sk_settings_show_interaction_counts">반응 수 표시</string>
|
||||||
<string name="sk_mark_media_as_sensitive">미디어를 민감함으로 설정하기</string>
|
<string name="sk_mark_media_as_sensitive">미디어를 민감함으로 설정하기</string>
|
||||||
<string name="sk_user_post_notifications_on">%s의 게시물 알림 켜기</string>
|
<string name="sk_user_post_notifications_on">%s 님의 게시물 알림 켜기</string>
|
||||||
<string name="sk_user_post_notifications_off">%s의 게시물 알림 끄기</string>
|
<string name="sk_user_post_notifications_off">%s 님의 게시물 알림 끄기</string>
|
||||||
<string name="sk_federated_timeline">연합</string>
|
<string name="sk_federated_timeline">연합</string>
|
||||||
<string name="sk_federated_timeline_info_banner">당신이 속한 연합에 존재하는 사람들이 공유한 최신 게시물들입니다.</string>
|
<string name="sk_federated_timeline_info_banner">당신이 속한 연합에 존재하는 사람들이 공유한 최신 게시물들입니다.</string>
|
||||||
<string name="sk_check_for_update">업데이트 확인</string>
|
<string name="sk_check_for_update">업데이트 확인</string>
|
||||||
<string name="sk_no_update_available">사용 가능한 업데이트 없음</string>
|
<string name="sk_no_update_available">사용 가능한 업데이트 없음</string>
|
||||||
<string name="sk_list_timelines">리스트</string>
|
<string name="sk_list_timelines">리스트</string>
|
||||||
<string name="sk_follow_requests">팔로우 요청</string>
|
<string name="sk_follow_requests">팔로우 요청</string>
|
||||||
<string name="sk_accept_follow_request">팔로우 요청 허가</string>
|
<string name="sk_accept_follow_request">팔로우 요청 허가</string>
|
||||||
<string name="sk_reject_follow_request">팔로우 요청 거부</string>
|
<string name="sk_reject_follow_request">팔로우 요청 거부</string>
|
||||||
<string name="sk_lists_with_user">%s 님이 포함된 리스트</string>
|
<string name="sk_lists_with_user">%s 님이 포함된 리스트</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">열람주의 툿을 항상 펼치기</string>
|
<string name="sk_settings_always_reveal_content_warnings">열람주의 게시물을 항상 펼치기</string>
|
||||||
<string name="sk_disable_marquee">제목 표시줄의 텍스트 스크롤 비활성화</string>
|
<string name="sk_disable_marquee">제목 표시줄의 텍스트 스크롤 비활성화</string>
|
||||||
|
<string name="sk_app_name">Moshidon</string>
|
||||||
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
|
<string name="sk_update_available">Moshidon %s 버전을 다운로드할 수 있습니다.</string>
|
||||||
|
<string name="sk_update_ready">Moshidon %s 버전을 다운로드하였으며 설치할 수 있습니다.</string>
|
||||||
|
<string name="sk_settings_show_federated_timeline">연합 타임라인 표시</string>
|
||||||
|
<string name="sk_notification_type_status">게시물</string>
|
||||||
|
<string name="sk_notify_posts">게시물 알림</string>
|
||||||
|
<string name="sk_settings_color_picker">테마 색상</string>
|
||||||
|
<string name="sk_color_theme_pink">분홍색</string>
|
||||||
|
<string name="sk_color_theme_purple">보라색</string>
|
||||||
|
<string name="sk_color_theme_green">초록색</string>
|
||||||
|
<string name="sk_color_theme_blue">파란색</string>
|
||||||
|
<string name="sk_color_theme_brown">갈색</string>
|
||||||
|
<string name="sk_color_theme_yellow">노란색</string>
|
||||||
|
<string name="sk_settings_contribute">Moshidon에 기여</string>
|
||||||
|
<string name="sk_poll_allow_multiple">다중 선택 허용</string>
|
||||||
|
<string name="sk_translate_post">번역하기</string>
|
||||||
|
<string name="sk_translate_show_original">원본 보기</string>
|
||||||
|
<string name="sk_post_language">언어: %s</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_translated_using">%s에서 번역함</string>
|
||||||
|
<string name="sk_available_languages">모든 언어</string>
|
||||||
|
<string name="sk_clear_recent_languages">최근 사용한 언어 지우기</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">정말로 최근 사용한 언어를 지우시겠습니까\?</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_delete_and_redraft">ဖျက်ပြီး ပြန်ရေးမည်</string>
|
<string name="sk_delete_and_redraft">ဖျက်ပြီး ပြန်ရေးမည်</string>
|
||||||
<string name="sk_pin_post">ပရိုဖိုင်းတွင် ပင်တွဲမည်</string>
|
<string name="sk_pin_post">ပရိုဖိုင်းတွင် ပင်တွဲမည်</string>
|
||||||
<string name="sk_pinning">ပင်တွဲနေသည်…</string>
|
<string name="sk_pinning">ပင်တွဲနေသည်…</string>
|
||||||
@@ -10,12 +10,12 @@
|
|||||||
<string name="sk_image_description">ပုံတွင်ပါဝင်သော အကြောင်းအရာ</string>
|
<string name="sk_image_description">ပုံတွင်ပါဝင်သော အကြောင်းအရာ</string>
|
||||||
<string name="sk_visibility_unlisted">စာရင်းမလုပ်</string>
|
<string name="sk_visibility_unlisted">စာရင်းမလုပ်</string>
|
||||||
<string name="sk_settings_show_boosts">Boost များကို ပြသမည်</string>
|
<string name="sk_settings_show_boosts">Boost များကို ပြသမည်</string>
|
||||||
<string name="sk_settings_app_version">Megalodon - ဗားရှင်း %1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon - ဗားရှင်း %1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">ပုံ/ဗီဒီယိုအား ထိရှလွယ်သည်အဖြစ် မှတ်သားသည်</string>
|
<string name="sk_mark_media_as_sensitive">ပုံ/ဗီဒီယိုအား ထိရှလွယ်သည်အဖြစ် မှတ်သားသည်</string>
|
||||||
<string name="sk_user_post_notifications_off">%s အတွက် ပို့စ်နိုတီများကို ပိတ်လိုက်သည်</string>
|
<string name="sk_user_post_notifications_off">%s အတွက် ပို့စ်နိုတီများကို ပိတ်လိုက်သည်</string>
|
||||||
<string name="sk_federated_timeline">ဖက်ဒရေးရှင်း</string>
|
<string name="sk_federated_timeline">ဖက်ဒရေးရှင်း</string>
|
||||||
<string name="sk_update_available">Megalodon %s ကို ဒေါင်းလုဒ်ဆွဲလို့ရပါပြီ။</string>
|
<string name="sk_update_available">Moshidon %s ကို ဒေါင်းလုဒ်ဆွဲလို့ရပါပြီ။</string>
|
||||||
<string name="sk_update_ready">Megalodon %s ကို ဒေါင်းလုဒ်ဆွဲပြီးပြီမလို့ အင်စတောလုပ်နိုင်ပါပြီ။</string>
|
<string name="sk_update_ready">Moshidon %s ကို ဒေါင်းလုဒ်ဆွဲပြီးပြီမလို့ အင်စတောလုပ်နိုင်ပါပြီ။</string>
|
||||||
<string name="sk_no_update_available">မည်သည့်အပ်ဒိတ်မျှ မရှိသေးပါ</string>
|
<string name="sk_no_update_available">မည်သည့်အပ်ဒိတ်မျှ မရှိသေးပါ</string>
|
||||||
<string name="sk_follow_requests">ဖောလိုဝါအဖြစ် တောင်းဆိုမှုများ</string>
|
<string name="sk_follow_requests">ဖောလိုဝါအဖြစ် တောင်းဆိုမှုများ</string>
|
||||||
<string name="sk_accept_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို လက်ခံမည်</string>
|
<string name="sk_accept_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို လက်ခံမည်</string>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Vastgemaakt</string>
|
<string name="sk_pinned_posts">Vastgemaakt</string>
|
||||||
<string name="sk_delete_and_redraft">Verwijderen en opnieuw opstellen</string>
|
<string name="sk_delete_and_redraft">Verwijderen en opnieuw opstellen</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">Verwijder en stel bericht opnieuw op</string>
|
<string name="sk_confirm_delete_and_redraft_title">Verwijder en stel bericht opnieuw op</string>
|
||||||
@@ -20,14 +20,14 @@
|
|||||||
<string name="sk_settings_show_boosts">Boosts weergeven</string>
|
<string name="sk_settings_show_boosts">Boosts weergeven</string>
|
||||||
<string name="sk_settings_load_new_posts">Automatisch nieuwe berichten laden</string>
|
<string name="sk_settings_load_new_posts">Automatisch nieuwe berichten laden</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Aantal interacties weergeven</string>
|
<string name="sk_settings_show_interaction_counts">Aantal interacties weergeven</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Markeer media als gevoelig</string>
|
<string name="sk_mark_media_as_sensitive">Markeer media als gevoelig</string>
|
||||||
<string name="sk_user_post_notifications_on">Berichtmeldingen aangezet voor %s</string>
|
<string name="sk_user_post_notifications_on">Berichtmeldingen aangezet voor %s</string>
|
||||||
<string name="sk_user_post_notifications_off">Berichtmeldingen uitgezet voor %s</string>
|
<string name="sk_user_post_notifications_off">Berichtmeldingen uitgezet voor %s</string>
|
||||||
<string name="sk_federated_timeline">Federatie</string>
|
<string name="sk_federated_timeline">Federatie</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Dit zijn de meest recente berichten van de mensen in jouw federatie.</string>
|
<string name="sk_federated_timeline_info_banner">Dit zijn de meest recente berichten van de mensen in jouw federatie.</string>
|
||||||
<string name="sk_update_available">Megalodon %s is klaar om te downloaden.</string>
|
<string name="sk_update_available">Moshidon %s is klaar om te downloaden.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s is gedownload en klaar om te installeren.</string>
|
<string name="sk_update_ready">Moshidon %s is gedownload en klaar om te installeren.</string>
|
||||||
<string name="sk_check_for_update">Controleren op update</string>
|
<string name="sk_check_for_update">Controleren op update</string>
|
||||||
<string name="sk_no_update_available">Geen update beschikbaar</string>
|
<string name="sk_no_update_available">Geen update beschikbaar</string>
|
||||||
<string name="sk_list_timelines">Lijsten</string>
|
<string name="sk_list_timelines">Lijsten</string>
|
||||||
@@ -36,6 +36,6 @@
|
|||||||
<string name="sk_lists_with_user">Lijsten met %s</string>
|
<string name="sk_lists_with_user">Lijsten met %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Onthul altijd inhoudswaarschuwingen</string>
|
<string name="sk_settings_always_reveal_content_warnings">Onthul altijd inhoudswaarschuwingen</string>
|
||||||
<string name="sk_disable_marquee">Schakel scrollende tekst in titelbalken uit</string>
|
<string name="sk_disable_marquee">Schakel scrollende tekst in titelbalken uit</string>
|
||||||
<string name="sk_settings_contribute">Bijdragen aan Megalodon</string>
|
<string name="sk_settings_contribute">Bijdragen aan Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Toon gefedereerde tijdlijn</string>
|
<string name="sk_settings_show_federated_timeline">Toon gefedereerde tijdlijn</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,41 +1,59 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_delete_and_redraft">Usuń i zmodyfikuj</string>
|
<string name="sk_delete_and_redraft">Usuń i zmodyfikuj</string>
|
||||||
<string name="sk_pin_post">Przypomnij do profilu</string>
|
<string name="sk_pin_post">Przypnij do profilu</string>
|
||||||
<string name="sk_confirm_pin_post_title">Przypomnij post na profilu</string>
|
<string name="sk_confirm_pin_post_title">Przypnij wpis do profilu</string>
|
||||||
<string name="sk_confirm_pin_post">Czy chcesz przypiąć ten post na swoim profilu\?</string>
|
<string name="sk_confirm_pin_post">Czy chcesz przypiąć ten wpis do swojego profilu\?</string>
|
||||||
<string name="sk_pinning">Przypinanie postu…</string>
|
<string name="sk_pinning">Przypinanie wpisu…</string>
|
||||||
<string name="sk_unpin_post">Odepnij post z profilu</string>
|
<string name="sk_unpin_post">Odepnij z profilu</string>
|
||||||
<string name="sk_confirm_unpin_post_title">Odepnij post z profilu</string>
|
<string name="sk_confirm_unpin_post_title">Odepnij wpis z profilu</string>
|
||||||
<string name="sk_unpinning">Odpinanie postu…</string>
|
<string name="sk_unpinning">Odpinanie wpisu…</string>
|
||||||
<string name="sk_settings_show_replies">Pokaż odpowiedzi</string>
|
<string name="sk_settings_show_replies">Pokaż odpowiedzi</string>
|
||||||
<string name="sk_settings_show_boosts">Pokaż podbicia</string>
|
<string name="sk_settings_show_boosts">Pokaż podbicia</string>
|
||||||
<string name="sk_settings_load_new_posts">Automatycznie wczytuj nowe posty</string>
|
<string name="sk_settings_load_new_posts">Automatycznie wczytuj nowe wpisy</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Pokaż dane ilości interakcji</string>
|
<string name="sk_settings_show_interaction_counts">Pokaż dane ilości interakcji</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Oznacz jako wrażliwe</string>
|
<string name="sk_mark_media_as_sensitive">Oznacz jako wrażliwe</string>
|
||||||
<string name="sk_user_post_notifications_on">Włączono powiadomienia dla postu %s</string>
|
<string name="sk_user_post_notifications_on">Włączono powiadomienia dla postu %s</string>
|
||||||
<string name="sk_user_post_notifications_off">Wyłączono powiadomienia dla postu %s</string>
|
<string name="sk_user_post_notifications_off">Wyłączono powiadomienia dla postu %s</string>
|
||||||
<string name="sk_federated_timeline">Znana sieć fediverse</string>
|
<string name="sk_federated_timeline">Globalne</string>
|
||||||
<string name="sk_federated_timeline_info_banner">To są najnowsze post ze znanej sieci fediverse dla twojego serwera.</string>
|
<string name="sk_federated_timeline_info_banner">To są najnowsze post ze znanej sieci fediwersum dla twojego serwera.</string>
|
||||||
<string name="sk_update_available">Megalodon %s jest dostępny do pobrania.</string>
|
<string name="sk_update_available">Moshidon %s jest dostępny do pobrania.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s został pobrany i jest gotowy do instalacji.</string>
|
<string name="sk_update_ready">Moshidon %s został pobrany i jest gotowy do instalacji.</string>
|
||||||
<string name="sk_check_for_update">Szukaj uaktualnień</string>
|
<string name="sk_check_for_update">Sprawdź dostępność aktualizacji</string>
|
||||||
<string name="sk_no_update_available">Brak dostępnych uaktualnień</string>
|
<string name="sk_no_update_available">Brak dostępnych aktualizacji</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Przypięte</string>
|
<string name="sk_pinned_posts">Przypięte</string>
|
||||||
<string name="sk_confirm_delete_and_redraft">Jesteś pewnien, że chcesz usunąć zmodyfikowany post\?</string>
|
<string name="sk_confirm_delete_and_redraft">Jesteś pewnien, że chcesz usunąć zmodyfikowany wpis\?</string>
|
||||||
<string name="sk_confirm_unpin_post">Jesteś pewien, że chcesz odpiąć ten post\?</string>
|
<string name="sk_confirm_unpin_post">Jesteś pewien, że chcesz odpiąć ten wpis\?</string>
|
||||||
<string name="sk_image_description">Opis obrazka</string>
|
<string name="sk_image_description">Opis zdjęcia</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">Usuń i zmodyfikuj post</string>
|
<string name="sk_confirm_delete_and_redraft_title">Usuń i zmodyfikuj wpis</string>
|
||||||
<string name="sk_list_timelines">Listy</string>
|
<string name="sk_list_timelines">Listy</string>
|
||||||
<string name="sk_follow_requests">Prośby o obserwowanie</string>
|
<string name="sk_follow_requests">Prośby o obserwację</string>
|
||||||
<string name="sk_accept_follow_request">Zaakceptuj prośby o obserwowanie</string>
|
<string name="sk_accept_follow_request">Zaakceptuj prośby o obserwację</string>
|
||||||
<string name="sk_reject_follow_request">Odrzuć prośby o obserwowanie</string>
|
<string name="sk_reject_follow_request">Odrzuć prośby o obserwację</string>
|
||||||
<string name="sk_lists_with_user">Listy z %s</string>
|
<string name="sk_lists_with_user">Listy z %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Zawsze odkrywaj ostrzeżenia o zawartości</string>
|
<string name="sk_settings_always_reveal_content_warnings">Zawsze odkrywaj ostrzeżenia o zawartości</string>
|
||||||
<string name="sk_disable_marquee">Wyłącz tekst przewijany w paskach tytułowych</string>
|
<string name="sk_disable_marquee">Wyłącz tekst przewijany w paskach tytułowych</string>
|
||||||
<string name="sk_settings_contribute">Wspomóż Megalodon</string>
|
<string name="sk_settings_contribute">Wspomóż Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Pokaż oś czasu znanej sieci Fediverse</string>
|
<string name="sk_settings_show_federated_timeline">Pokaż globalną oś czasu</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_visibility_unlisted">Nienotowany</string>
|
<string name="sk_visibility_unlisted">Niewidoczny</string>
|
||||||
|
<string name="sk_notification_type_status">Wpisy</string>
|
||||||
|
<string name="sk_notify_posts">Powiadomienia wpisów</string>
|
||||||
|
<string name="sk_settings_color_picker">Motyw</string>
|
||||||
|
<string name="sk_color_theme_pink">Różowy</string>
|
||||||
|
<string name="sk_color_theme_purple">Fioletowy</string>
|
||||||
|
<string name="sk_color_theme_green">Zielony</string>
|
||||||
|
<string name="sk_color_theme_blue">Niebieski</string>
|
||||||
|
<string name="sk_color_theme_brown">Brązowy</string>
|
||||||
|
<string name="sk_color_theme_yellow">Żółty</string>
|
||||||
|
<string name="sk_poll_allow_multiple">Pozwalaj na wybieranie wielu opcji</string>
|
||||||
|
<string name="sk_translate_post">Przetłumacz</string>
|
||||||
|
<string name="sk_translate_show_original">Pokaż oryginał</string>
|
||||||
|
<string name="sk_translated_using">Przetłumaczono przy użyciu %s</string>
|
||||||
|
<string name="sk_post_language">Język: %s</string>
|
||||||
|
<string name="sk_available_languages">Dostępne języki</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">Czy na pewno chcesz wyczyścić ostatnio użyte języki\?</string>
|
||||||
|
<string name="sk_clear_recent_languages">Wyczyść ostatnio użyte języki</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<string name="sk_confirm_pin_post_title">Fixar postagem no perfil</string>
|
<string name="sk_confirm_pin_post_title">Fixar postagem no perfil</string>
|
||||||
<string name="sk_confirm_pin_post">Você deseja fixar esta postagem em seu perfil\?</string>
|
<string name="sk_confirm_pin_post">Você deseja fixar esta postagem em seu perfil\?</string>
|
||||||
<string name="sk_pinning">Fixando postagem…</string>
|
<string name="sk_pinning">Fixando postagem…</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Fixado</string>
|
<string name="sk_pinned_posts">Fixado</string>
|
||||||
<string name="sk_unpin_post">Desafixar do perfil</string>
|
<string name="sk_unpin_post">Desafixar do perfil</string>
|
||||||
<string name="sk_confirm_unpin_post_title">Desafixar postagem do perfil</string>
|
<string name="sk_confirm_unpin_post_title">Desafixar postagem do perfil</string>
|
||||||
@@ -18,13 +18,13 @@
|
|||||||
<string name="sk_settings_show_boosts">Mostrar boosts</string>
|
<string name="sk_settings_show_boosts">Mostrar boosts</string>
|
||||||
<string name="sk_settings_load_new_posts">Carregar novas postagens automaticamente</string>
|
<string name="sk_settings_load_new_posts">Carregar novas postagens automaticamente</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Marcar mídia como sensível</string>
|
<string name="sk_mark_media_as_sensitive">Marcar mídia como sensível</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_lists_with_user">Listas com %s</string>
|
<string name="sk_lists_with_user">Listas com %s</string>
|
||||||
<string name="sk_user_post_notifications_on">Ativar as notificações de postagem para %s</string>
|
<string name="sk_user_post_notifications_on">Ativar as notificações de postagem para %s</string>
|
||||||
<string name="sk_federated_timeline">Federação</string>
|
<string name="sk_federated_timeline">Federação</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Estas são as postagens mais recentes das pessoas em sua federação.</string>
|
<string name="sk_federated_timeline_info_banner">Estas são as postagens mais recentes das pessoas em sua federação.</string>
|
||||||
<string name="sk_update_available">Megalodon %s está pronto para baixar.</string>
|
<string name="sk_update_available">Moshidon %s está pronto para baixar.</string>
|
||||||
<string name="sk_update_ready">Megalodon %s foi baixado e está pronto para instalar.</string>
|
<string name="sk_update_ready">Moshidon %s foi baixado e está pronto para instalar.</string>
|
||||||
<string name="sk_check_for_update">Verificar se há atualizações</string>
|
<string name="sk_check_for_update">Verificar se há atualizações</string>
|
||||||
<string name="sk_no_update_available">Nenhuma atualização disponível</string>
|
<string name="sk_no_update_available">Nenhuma atualização disponível</string>
|
||||||
<string name="sk_list_timelines">Listas</string>
|
<string name="sk_list_timelines">Listas</string>
|
||||||
@@ -34,8 +34,24 @@
|
|||||||
<string name="sk_reject_follow_request">Recusar solicitação para seguir</string>
|
<string name="sk_reject_follow_request">Recusar solicitação para seguir</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Sempre revelar avisos de conteúdo</string>
|
<string name="sk_settings_always_reveal_content_warnings">Sempre revelar avisos de conteúdo</string>
|
||||||
<string name="sk_disable_marquee">Desative o texto de rolagem nas barras de título</string>
|
<string name="sk_disable_marquee">Desative o texto de rolagem nas barras de título</string>
|
||||||
<string name="sk_settings_contribute">Contribua para o Megalodon</string>
|
<string name="sk_settings_contribute">Contribua para o Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Mostre a linha do tempo federada</string>
|
<string name="sk_settings_show_federated_timeline">Mostre a linha do tempo federada</string>
|
||||||
<string name="sk_visibility_unlisted">Não-listado</string>
|
<string name="sk_visibility_unlisted">Não-listado</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Mostrar contagens de interação</string>
|
<string name="sk_settings_show_interaction_counts">Mostrar contagens de interação</string>
|
||||||
|
<string name="sk_color_theme_purple">Roxo</string>
|
||||||
|
<string name="sk_color_theme_green">Verde</string>
|
||||||
|
<string name="sk_color_theme_blue">Azul</string>
|
||||||
|
<string name="sk_color_theme_brown">Marrom</string>
|
||||||
|
<string name="sk_color_theme_yellow">Amarelo</string>
|
||||||
|
<string name="sk_color_theme_pink">Rosa</string>
|
||||||
|
<string name="sk_notification_type_status">Postagens</string>
|
||||||
|
<string name="sk_settings_color_picker">Cor do tema</string>
|
||||||
|
<string name="sk_translate_post">Traduzir</string>
|
||||||
|
<string name="sk_translate_show_original">Mostrar original</string>
|
||||||
|
<string name="sk_translated_using">Traduzido usando %s</string>
|
||||||
|
<string name="sk_post_language">Idioma: %s</string>
|
||||||
|
<string name="sk_available_languages">Idiomas disponíveis</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">Tem certeza de que deseja limpar os idiomas usados recentemente\?</string>
|
||||||
|
<string name="sk_clear_recent_languages">Limpar idiomas usados recentemente</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Fixado</string>
|
<string name="sk_pinned_posts">Fixado</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_pinned_posts">Закрепленные</string>
|
<string name="sk_pinned_posts">Закрепленные</string>
|
||||||
<string name="sk_delete_and_redraft">Удалить и исправить</string>
|
<string name="sk_delete_and_redraft">Удалить и исправить</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">Удалить и исправить пост</string>
|
<string name="sk_confirm_delete_and_redraft_title">Удалить и исправить пост</string>
|
||||||
@@ -14,5 +14,5 @@
|
|||||||
<string name="sk_image_description">Описание изображения</string>
|
<string name="sk_image_description">Описание изображения</string>
|
||||||
<string name="sk_visibility_unlisted">Скрытый</string>
|
<string name="sk_visibility_unlisted">Скрытый</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Отметить медиафайл как деликатный</string>
|
<string name="sk_mark_media_as_sensitive">Отметить медиафайл как деликатный</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -13,12 +13,12 @@
|
|||||||
<string name="sk_settings_show_boosts">Visa puffar</string>
|
<string name="sk_settings_show_boosts">Visa puffar</string>
|
||||||
<string name="sk_settings_load_new_posts">Ladda automatiskt nya inlägg</string>
|
<string name="sk_settings_load_new_posts">Ladda automatiskt nya inlägg</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Visa antal interaktioner</string>
|
<string name="sk_settings_show_interaction_counts">Visa antal interaktioner</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Markera media som känsligt</string>
|
<string name="sk_mark_media_as_sensitive">Markera media som känsligt</string>
|
||||||
<string name="sk_user_post_notifications_off">Slå av inläggsnotifieringar för %s</string>
|
<string name="sk_user_post_notifications_off">Slå av inläggsnotifieringar för %s</string>
|
||||||
<string name="sk_federated_timeline">Federation</string>
|
<string name="sk_federated_timeline">Federation</string>
|
||||||
<string name="sk_federated_timeline_info_banner">Dessa är de senaste inläggen av folk i din federation.</string>
|
<string name="sk_federated_timeline_info_banner">Dessa är de senaste inläggen av folk i din federation.</string>
|
||||||
<string name="sk_update_available">Megalodon %s är redo att ladda ner.</string>
|
<string name="sk_update_available">Moshidon %s är redo att ladda ner.</string>
|
||||||
<string name="sk_check_for_update">Kolla efter uppdateringar</string>
|
<string name="sk_check_for_update">Kolla efter uppdateringar</string>
|
||||||
<string name="sk_no_update_available">Inga uppdateringar tillgängliga</string>
|
<string name="sk_no_update_available">Inga uppdateringar tillgängliga</string>
|
||||||
<string name="sk_list_timelines">Listor</string>
|
<string name="sk_list_timelines">Listor</string>
|
||||||
@@ -28,14 +28,14 @@
|
|||||||
<string name="sk_lists_with_user">Listor med %s</string>
|
<string name="sk_lists_with_user">Listor med %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Visa alltid innehållsvarningar</string>
|
<string name="sk_settings_always_reveal_content_warnings">Visa alltid innehållsvarningar</string>
|
||||||
<string name="sk_disable_marquee">Slå av skrollande text i titelrader</string>
|
<string name="sk_disable_marquee">Slå av skrollande text i titelrader</string>
|
||||||
<string name="sk_settings_contribute">Bidra till Megalodon</string>
|
<string name="sk_settings_contribute">Bidra till Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Visa federerad tidslinje</string>
|
<string name="sk_settings_show_federated_timeline">Visa federerad tidslinje</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_confirm_delete_and_redraft_title">Ta bort och skriv om inlägg</string>
|
<string name="sk_confirm_delete_and_redraft_title">Ta bort och skriv om inlägg</string>
|
||||||
<string name="sk_confirm_delete_and_redraft">Är du säker på att du vill ta bort och skriva om detta inlägg\?</string>
|
<string name="sk_confirm_delete_and_redraft">Är du säker på att du vill ta bort och skriva om detta inlägg\?</string>
|
||||||
<string name="sk_confirm_pin_post_title">Nåla fast inlägg på profil</string>
|
<string name="sk_confirm_pin_post_title">Nåla fast inlägg på profil</string>
|
||||||
<string name="sk_confirm_pin_post">Vill du nåla fast detta inlägg på din profil\?</string>
|
<string name="sk_confirm_pin_post">Vill du nåla fast detta inlägg på din profil\?</string>
|
||||||
<string name="sk_confirm_unpin_post">Är du säker på att du vill ta bort detta inlägg\?</string>
|
<string name="sk_confirm_unpin_post">Är du säker på att du vill ta bort detta inlägg\?</string>
|
||||||
<string name="sk_user_post_notifications_on">Slå på inläggsnotifieringar för %s</string>
|
<string name="sk_user_post_notifications_on">Slå på inläggsnotifieringar för %s</string>
|
||||||
<string name="sk_update_ready">Megalodon %s är nerladdad och redo att installeras.</string>
|
<string name="sk_update_ready">Moshidon %s är nerladdad och redo att installeras.</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,3 +1,59 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
<string name="sk_notify_posts">Сповіщення про пости</string>
|
||||||
|
<string name="sk_settings_color_picker">Колірна тема</string>
|
||||||
|
<string name="sk_color_theme_purple">Фіолетовий</string>
|
||||||
|
<string name="sk_color_theme_green">Зелений</string>
|
||||||
|
<string name="sk_color_theme_blue">Синий</string>
|
||||||
|
<string name="sk_color_theme_brown">Коричневий</string>
|
||||||
|
<string name="sk_color_theme_yellow">Жовтий</string>
|
||||||
|
<string name="sk_poll_allow_multiple">Дозволити кілька виборів</string>
|
||||||
|
<string name="sk_translate_post">Перекласти</string>
|
||||||
|
<string name="sk_translate_show_original">Показати оригінал</string>
|
||||||
|
<string name="sk_translated_using">Перекладено через %s</string>
|
||||||
|
<string name="sk_post_language">Мова: %s</string>
|
||||||
|
<string name="sk_available_languages">Доступні мови</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_clear_recent_languages">Очистити нещодавно використані мови</string>
|
||||||
|
<string name="sk_settings_always_reveal_content_warnings">Завжди відкривати вміст</string>
|
||||||
|
<string name="sk_notification_type_status">Пости</string>
|
||||||
|
<string name="sk_color_theme_pink">Рожевий</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">Ви впевнені, що хочете очистити нещодавно використані мови\?</string>
|
||||||
|
<string name="sk_app_name">Moshidon</string>
|
||||||
|
<string name="sk_pinned_posts">Закріплене</string>
|
||||||
|
<string name="sk_delete_and_redraft">Видалити та переробити</string>
|
||||||
|
<string name="sk_confirm_delete_and_redraft_title">Видалити та переробити пост</string>
|
||||||
|
<string name="sk_confirm_delete_and_redraft">Ви впевнені, що хочете видалити та переробити цей пост\?</string>
|
||||||
|
<string name="sk_pin_post">Закріпити у профіль</string>
|
||||||
|
<string name="sk_confirm_pin_post_title">Закріпити пост у профіль</string>
|
||||||
|
<string name="sk_confirm_pin_post">Чи хочете ви закріпити цей пост у ваш профіль\?</string>
|
||||||
|
<string name="sk_pinning">Закріпляємо пост…</string>
|
||||||
|
<string name="sk_unpin_post">Відкріпити з профілю</string>
|
||||||
|
<string name="sk_confirm_unpin_post_title">Відкріпити пост з профілю</string>
|
||||||
|
<string name="sk_confirm_unpin_post">Ви впевнені, що хочете відкріпити цей пост\?</string>
|
||||||
|
<string name="sk_unpinning">Відкріпляємо пост…</string>
|
||||||
|
<string name="sk_image_description">Опис зображення</string>
|
||||||
|
<string name="sk_visibility_unlisted">Не у списку</string>
|
||||||
|
<string name="sk_settings_show_replies">Показувати відповіді</string>
|
||||||
|
<string name="sk_settings_load_new_posts">Автоматично завантажувати нові пости</string>
|
||||||
|
<string name="sk_settings_show_interaction_counts">Показати кількість взаємодій</string>
|
||||||
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
|
<string name="sk_follow_requests">Запити на підписку</string>
|
||||||
|
<string name="sk_accept_follow_request">Прийняти запит на підписку</string>
|
||||||
|
<string name="sk_reject_follow_request">Відхилити запит на підписку</string>
|
||||||
|
<string name="sk_lists_with_user">Списки з %s</string>
|
||||||
|
<string name="sk_disable_marquee">Вимкнути прокручування тексту у рядках заголовка</string>
|
||||||
|
<string name="sk_settings_contribute">Допомогти у розробці Moshidon</string>
|
||||||
|
<string name="sk_mark_media_as_sensitive">Помітити медіа як чутливу</string>
|
||||||
|
<string name="sk_settings_show_boosts">Показувати бусти</string>
|
||||||
|
<string name="sk_user_post_notifications_on">Увімкнено сповіщення про пости для %s</string>
|
||||||
|
<string name="sk_user_post_notifications_off">Вимкнено сповіщення про пости для %s</string>
|
||||||
|
<string name="sk_federated_timeline">Федерація</string>
|
||||||
|
<string name="sk_federated_timeline_info_banner">Це найновіші публікації людей у вашій федерації.</string>
|
||||||
|
<string name="sk_update_available">Moshidon %s готовий до завантаження.</string>
|
||||||
|
<string name="sk_update_ready">Moshidon %s завантажений й готовий до встановлення.</string>
|
||||||
|
<string name="sk_check_for_update">Перевірити оновлення</string>
|
||||||
|
<string name="sk_no_update_available">Немає доступних оновлень</string>
|
||||||
|
<string name="sk_list_timelines">Списки</string>
|
||||||
|
<string name="sk_settings_show_federated_timeline">Показувати федеративну стрічку</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<color name="m3_navigation_bar_bg">@android:color/system_neutral1_50</color>
|
<color name="m3_navigation_bar_bg">@android:color/system_neutral1_50</color>
|
||||||
|
|
||||||
|
<color name="m3_gray_1000">@android:color/system_neutral1_1000</color>
|
||||||
<color name="m3_gray_900">@android:color/system_neutral1_900</color>
|
<color name="m3_gray_900">@android:color/system_neutral1_900</color>
|
||||||
<color name="m3_gray_800t">@android:color/system_neutral1_800</color>
|
<color name="m3_gray_800t">@android:color/system_neutral1_800</color>
|
||||||
<color name="m3_gray_800">@android:color/system_neutral1_800</color>
|
<color name="m3_gray_800">@android:color/system_neutral1_800</color>
|
||||||
|
|||||||
@@ -16,17 +16,17 @@
|
|||||||
<string name="sk_visibility_unlisted">不公开</string>
|
<string name="sk_visibility_unlisted">不公开</string>
|
||||||
<string name="sk_federated_timeline">联邦时间轴</string>
|
<string name="sk_federated_timeline">联邦时间轴</string>
|
||||||
<string name="sk_federated_timeline_info_banner">这是在你的联邦宇宙中最新发布的嘟文。</string>
|
<string name="sk_federated_timeline_info_banner">这是在你的联邦宇宙中最新发布的嘟文。</string>
|
||||||
<string name="sk_app_name">Megalodon</string>
|
<string name="sk_app_name">Moshidon</string>
|
||||||
<string name="sk_settings_show_replies">显示回复</string>
|
<string name="sk_settings_show_replies">显示回复</string>
|
||||||
<string name="sk_settings_show_boosts">显示转发</string>
|
<string name="sk_settings_show_boosts">显示转发</string>
|
||||||
<string name="sk_settings_load_new_posts">自动加载新嘟文</string>
|
<string name="sk_settings_load_new_posts">自动加载新嘟文</string>
|
||||||
<string name="sk_settings_show_interaction_counts">显示互动次数</string>
|
<string name="sk_settings_show_interaction_counts">显示互动次数</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">标记为敏感媒体</string>
|
<string name="sk_mark_media_as_sensitive">标记为敏感媒体</string>
|
||||||
<string name="sk_user_post_notifications_on">为 %s启用嘟文通知</string>
|
<string name="sk_user_post_notifications_on">为 %s启用嘟文通知</string>
|
||||||
<string name="sk_user_post_notifications_off">关闭%s的嘟文通知</string>
|
<string name="sk_user_post_notifications_off">关闭%s的嘟文通知</string>
|
||||||
<string name="sk_update_available">Megalodon %s 已经可以下载了。</string>
|
<string name="sk_update_available">Moshidon %s 已经可以下载了。</string>
|
||||||
<string name="sk_update_ready">Megalodon %s 已下载,准备安装。</string>
|
<string name="sk_update_ready">Moshidon %s 已下载,准备安装。</string>
|
||||||
<string name="sk_check_for_update">检查更新</string>
|
<string name="sk_check_for_update">检查更新</string>
|
||||||
<string name="sk_no_update_available">已经是最新版本</string>
|
<string name="sk_no_update_available">已经是最新版本</string>
|
||||||
<string name="sk_list_timelines">列表</string>
|
<string name="sk_list_timelines">列表</string>
|
||||||
@@ -34,8 +34,17 @@
|
|||||||
<string name="sk_reject_follow_request">拒绝关注请求</string>
|
<string name="sk_reject_follow_request">拒绝关注请求</string>
|
||||||
<string name="sk_lists_with_user">%s 的列表</string>
|
<string name="sk_lists_with_user">%s 的列表</string>
|
||||||
<string name="sk_disable_marquee">禁用标题栏的滚动文本</string>
|
<string name="sk_disable_marquee">禁用标题栏的滚动文本</string>
|
||||||
<string name="sk_settings_contribute">向 Megalodon 贡献</string>
|
<string name="sk_settings_contribute">向 Moshidon 贡献</string>
|
||||||
<string name="sk_settings_show_federated_timeline">显示联邦时间轴</string>
|
<string name="sk_settings_show_federated_timeline">显示联邦时间轴</string>
|
||||||
<string name="sk_follow_requests">关注请求</string>
|
<string name="sk_follow_requests">关注请求</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">总是显示内容警告</string>
|
<string name="sk_settings_always_reveal_content_warnings">总是显示内容警告</string>
|
||||||
|
<string name="sk_settings_color_picker">主题色</string>
|
||||||
|
<string name="sk_color_theme_pink">粉</string>
|
||||||
|
<string name="sk_color_theme_purple">紫</string>
|
||||||
|
<string name="sk_color_theme_green">绿</string>
|
||||||
|
<string name="sk_color_theme_blue">蓝</string>
|
||||||
|
<string name="sk_color_theme_brown">棕</string>
|
||||||
|
<string name="sk_color_theme_yellow">黄</string>
|
||||||
|
<string name="sk_notification_type_status">嘟文</string>
|
||||||
|
<string name="sk_notify_posts">嘟文通知</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -39,6 +39,10 @@
|
|||||||
<attr name="colorM3Outline" format="color"/>
|
<attr name="colorM3Outline" format="color"/>
|
||||||
<attr name="colorM3DisabledBackground" format="color"/>
|
<attr name="colorM3DisabledBackground" format="color"/>
|
||||||
<attr name="colorM3PressedOverlay" format="color"/>
|
<attr name="colorM3PressedOverlay" format="color"/>
|
||||||
|
<attr name="colorM3Error" format="color"/>
|
||||||
|
<attr name="colorM3OnError" format="color"/>
|
||||||
|
<attr name="colorM3ErrorContainer" format="color"/>
|
||||||
|
<attr name="colorM3OnErrorContainer" format="color"/>
|
||||||
|
|
||||||
<attr name="primaryLargeButtonStyle" format="reference"/>
|
<attr name="primaryLargeButtonStyle" format="reference"/>
|
||||||
<attr name="secondaryLargeButtonStyle" format="reference"/>
|
<attr name="secondaryLargeButtonStyle" format="reference"/>
|
||||||
@@ -50,5 +54,6 @@
|
|||||||
<declare-styleable name="FloatingHintEditTextLayout">
|
<declare-styleable name="FloatingHintEditTextLayout">
|
||||||
<attr name="editTextOffsetY" format="dimension"/>
|
<attr name="editTextOffsetY" format="dimension"/>
|
||||||
<attr name="android:labelTextSize" format="dimension"/>
|
<attr name="android:labelTextSize" format="dimension"/>
|
||||||
|
<attr name="labelTextColor" format="color"/>
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
<string name="app_name" translatable="false">Moshidon</string>
|
<string name="app_name" translatable="false">Moshidon</string>
|
||||||
|
|
||||||
<string name="get_started">Get started</string>
|
<string name="get_started">Get started</string>
|
||||||
|
<string name="already_have_account">I already have an account</string>
|
||||||
<string name="log_in">Log in</string>
|
<string name="log_in">Log in</string>
|
||||||
<string name="next">Next</string>
|
<string name="next">Next</string>
|
||||||
<string name="loading_instance">Retrieving server info…</string>
|
<string name="loading_instance">Retrieving server info…</string>
|
||||||
@@ -178,15 +179,16 @@
|
|||||||
<string name="back">Back</string>
|
<string name="back">Back</string>
|
||||||
<string name="instance_catalog_title">Mastodon is made of users on different servers.</string>
|
<string name="instance_catalog_title">Mastodon is made of users on different servers.</string>
|
||||||
<string name="instance_catalog_subtitle">Pick a server based on your interests, region, or a general purpose one. You can still connect with everyone, regardless of server.</string>
|
<string name="instance_catalog_subtitle">Pick a server based on your interests, region, or a general purpose one. You can still connect with everyone, regardless of server.</string>
|
||||||
<string name="search_communities">Search servers or enter URL</string>
|
<string name="search_communities">Server name or URL</string>
|
||||||
<string name="instance_rules_title">Some ground rules</string>
|
<string name="instance_rules_title">Server Rules</string>
|
||||||
<string name="instance_rules_subtitle">Take a minute to review the rules set and enforced by %s admins.</string>
|
<string name="instance_rules_subtitle">By continuing, you agree to follow by the following rules set and enforced by the %s moderators.</string>
|
||||||
<string name="signup_title">Let\'s get you set up on %s</string>
|
<string name="signup_title">Create Account</string>
|
||||||
<string name="edit_photo">edit</string>
|
<string name="edit_photo">edit</string>
|
||||||
<string name="display_name">display name</string>
|
<string name="display_name">Name</string>
|
||||||
<string name="username">username</string>
|
<string name="username">Username</string>
|
||||||
<string name="email">email</string>
|
<string name="email">Email</string>
|
||||||
<string name="password">password</string>
|
<string name="password">Password</string>
|
||||||
|
<string name="confirm_password">Confirm password</string>
|
||||||
<string name="password_note">Include capital letters, special characters, and numbers to increase your password strength.</string>
|
<string name="password_note">Include capital letters, special characters, and numbers to increase your password strength.</string>
|
||||||
<string name="category_academia">Academia</string>
|
<string name="category_academia">Academia</string>
|
||||||
<string name="category_activism">Activism</string>
|
<string name="category_activism">Activism</string>
|
||||||
@@ -201,8 +203,10 @@
|
|||||||
<string name="category_music">Music</string>
|
<string name="category_music">Music</string>
|
||||||
<string name="category_regional">Regional</string>
|
<string name="category_regional">Regional</string>
|
||||||
<string name="category_tech">Tech</string>
|
<string name="category_tech">Tech</string>
|
||||||
<string name="confirm_email_title">One last thing</string>
|
<string name="confirm_email_title">Check Your Inbox</string>
|
||||||
<string name="confirm_email_subtitle">Tap the link we emailed to you to verify your account.</string>
|
<!-- %s is the email address -->
|
||||||
|
<string name="confirm_email_subtitle">Tap the link we sent you to verify %s. We\'ll wait right here.</string>
|
||||||
|
<string name="confirm_email_didnt_get">Didn\'t get a link?</string>
|
||||||
<string name="resend">Resend</string>
|
<string name="resend">Resend</string>
|
||||||
<string name="open_email_app">Open email app</string>
|
<string name="open_email_app">Open email app</string>
|
||||||
<string name="resent_email">Confirmation email sent</string>
|
<string name="resent_email">Confirmation email sent</string>
|
||||||
@@ -290,7 +294,7 @@
|
|||||||
<string name="open_in_browser">Open in browser</string>
|
<string name="open_in_browser">Open in browser</string>
|
||||||
<string name="hide_boosts_from_user">Hide reblogs from %s</string>
|
<string name="hide_boosts_from_user">Hide reblogs from %s</string>
|
||||||
<string name="show_boosts_from_user">Show reblogs from %s</string>
|
<string name="show_boosts_from_user">Show reblogs from %s</string>
|
||||||
<string name="signup_reason">why do you want to join?</string>
|
<string name="signup_reason">Why do you want to join?</string>
|
||||||
<string name="signup_reason_note">This will help us review your application.</string>
|
<string name="signup_reason_note">This will help us review your application.</string>
|
||||||
<string name="clear">Clear</string>
|
<string name="clear">Clear</string>
|
||||||
<string name="profile_header">Header image</string>
|
<string name="profile_header">Header image</string>
|
||||||
@@ -384,7 +388,7 @@
|
|||||||
<!-- %s is file size -->
|
<!-- %s is file size -->
|
||||||
<string name="download_update">Download (%s)</string>
|
<string name="download_update">Download (%s)</string>
|
||||||
<string name="install_update">Install</string>
|
<string name="install_update">Install</string>
|
||||||
<string name="privacy_policy_title">Mastodon and your privacy</string>
|
<string name="privacy_policy_title">Your Privacy</string>
|
||||||
<string name="privacy_policy_subtitle">Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server\'s privacy policy.</string>
|
<string name="privacy_policy_subtitle">Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server\'s privacy policy.</string>
|
||||||
<string name="i_agree">I Agree</string>
|
<string name="i_agree">I Agree</string>
|
||||||
<string name="empty_list">This list is empty</string>
|
<string name="empty_list">This list is empty</string>
|
||||||
@@ -408,5 +412,30 @@
|
|||||||
<string name="login_title">Welcome Back</string>
|
<string name="login_title">Welcome Back</string>
|
||||||
<string name="login_subtitle">Log in with the server where you created your account.</string>
|
<string name="login_subtitle">Log in with the server where you created your account.</string>
|
||||||
<string name="server_url">Server URL</string>
|
<string name="server_url">Server URL</string>
|
||||||
<string name="poll_allow_multiple">Allow multiple choices</string>
|
<!-- {logo} is a placeholder that is replaced with the Mastodon logo image at runtime. Please copy it into your translation as is. -->
|
||||||
|
<string name="welcome_page1_title">What is {logo}?</string>
|
||||||
|
<string name="welcome_page1_text">Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.</string>
|
||||||
|
<string name="welcome_page2_title">Mastodon is like that.</string>
|
||||||
|
<string name="welcome_page2_text">Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.</string>
|
||||||
|
<string name="welcome_page3_title">How do I pick a server?</string>
|
||||||
|
<string name="welcome_page3_text">Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.</string>
|
||||||
|
<string name="signup_random_server_explain">We\'ll pick a server based on your language if you continue without making a selection.</string>
|
||||||
|
<string name="server_filter_any_language">Any Language</string>
|
||||||
|
<string name="server_filter_instant_signup">Instant Sign-up</string>
|
||||||
|
<string name="server_filter_manual_review">Manual Review</string>
|
||||||
|
<string name="server_filter_any_signup_speed">Any Sign-up Speed</string>
|
||||||
|
<string name="server_filter_region_europe">Europe</string>
|
||||||
|
<string name="server_filter_region_north_america">North America</string>
|
||||||
|
<string name="server_filter_region_south_america">South America</string>
|
||||||
|
<string name="server_filter_region_africa">Africa</string>
|
||||||
|
<string name="server_filter_region_asia">Asia</string>
|
||||||
|
<string name="server_filter_region_oceania">Oceania</string>
|
||||||
|
<string name="not_accepting_new_members">Not accepting new members</string>
|
||||||
|
<string name="category_special_interests">Special Interests</string>
|
||||||
|
<string name="signup_passwords_dont_match">Passwords don\'t match</string>
|
||||||
|
<string name="post_language">Language: %s</string>
|
||||||
|
<string name="available_languages">Available languages</string>
|
||||||
|
<string name="language_name">%s (%s)</string>
|
||||||
|
<string name="clear_recent_languages">Clear recent languages</string>
|
||||||
|
<string name="confirm_clear_recent_languages">Are you sure you want to clear your recently used languages?</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<string name="sk_settings_show_boosts">Show boosts</string>
|
<string name="sk_settings_show_boosts">Show boosts</string>
|
||||||
<string name="sk_settings_load_new_posts">Automatically load new posts</string>
|
<string name="sk_settings_load_new_posts">Automatically load new posts</string>
|
||||||
<string name="sk_settings_show_interaction_counts">Show interaction counts</string>
|
<string name="sk_settings_show_interaction_counts">Show interaction counts</string>
|
||||||
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
|
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||||
<string name="sk_mark_media_as_sensitive">Mark media as sensitive</string>
|
<string name="sk_mark_media_as_sensitive">Mark media as sensitive</string>
|
||||||
<string name="sk_user_post_notifications_on">Turned on post notifications for %s</string>
|
<string name="sk_user_post_notifications_on">Turned on post notifications for %s</string>
|
||||||
<string name="sk_user_post_notifications_off">Turned off post notifications for %s</string>
|
<string name="sk_user_post_notifications_off">Turned off post notifications for %s</string>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<string name="sk_lists_with_user">Lists with %s</string>
|
<string name="sk_lists_with_user">Lists with %s</string>
|
||||||
<string name="sk_settings_always_reveal_content_warnings">Always reveal content warnings</string>
|
<string name="sk_settings_always_reveal_content_warnings">Always reveal content warnings</string>
|
||||||
<string name="sk_disable_marquee">Disable scrolling text in title bars</string>
|
<string name="sk_disable_marquee">Disable scrolling text in title bars</string>
|
||||||
<string name="sk_settings_contribute">Contribute to Megalodon</string>
|
<string name="sk_settings_contribute">Contribute to Moshidon</string>
|
||||||
<string name="sk_settings_show_federated_timeline">Show federated timeline</string>
|
<string name="sk_settings_show_federated_timeline">Show federated timeline</string>
|
||||||
<string name="sk_notification_type_status">Posts</string>
|
<string name="sk_notification_type_status">Posts</string>
|
||||||
<string name="sk_notify_posts">Post notifications</string>
|
<string name="sk_notify_posts">Post notifications</string>
|
||||||
@@ -47,6 +47,18 @@
|
|||||||
<string name="sk_color_theme_blue">Blue</string>
|
<string name="sk_color_theme_blue">Blue</string>
|
||||||
<string name="sk_color_theme_brown">Orange</string>
|
<string name="sk_color_theme_brown">Orange</string>
|
||||||
<string name="sk_color_theme_yellow">Yellow</string>
|
<string name="sk_color_theme_yellow">Yellow</string>
|
||||||
<string name="sk_color_theme_material_you">Material You</string>
|
<string name="sk_color_theme_material3">Material You</string>
|
||||||
<string name="sk_not_supported">Not supported on your device</string>
|
<string name="sk_not_supported">Not supported on your device</string>
|
||||||
|
<string name="sk_poll_allow_multiple">Allow multiple choices</string>
|
||||||
|
<string name="sk_translate_post">Translate</string>
|
||||||
|
<string name="sk_translate_show_original">Show original</string>
|
||||||
|
<string name="sk_translated_using">Translated using %s</string>
|
||||||
|
<string name="sk_post_language">Language: %s</string>
|
||||||
|
<string name="sk_available_languages">Available languages</string>
|
||||||
|
<string name="sk_language_name">%s (%s)</string>
|
||||||
|
<string name="sk_clear_recent_languages">Clear recent languages</string>
|
||||||
|
<string name="sk_confirm_clear_recent_languages">Are you sure you want to clear your recently used languages?</string>
|
||||||
|
<string name="sk_welcome_title">Welcome to Moshidon!</string>
|
||||||
|
<string name="sk_welcome_text">To get started, please enter your home instance’s domain name below.</string>
|
||||||
|
<string name="sk_example_domain">example.social</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -14,16 +14,16 @@
|
|||||||
<item name="primaryLargeButtonStyle">@style/Widget.Mastodon.Button.Large.Primary_DarkOnLight</item>
|
<item name="primaryLargeButtonStyle">@style/Widget.Mastodon.Button.Large.Primary_DarkOnLight</item>
|
||||||
<item name="secondaryLargeButtonStyle">@style/Widget.Mastodon.Button.Large.Secondary_DarkOnLight</item>
|
<item name="secondaryLargeButtonStyle">@style/Widget.Mastodon.Button.Large.Secondary_DarkOnLight</item>
|
||||||
<item name="android:colorAccent">@color/primary_700</item>
|
<item name="android:colorAccent">@color/primary_700</item>
|
||||||
<item name="android:colorPrimary">@color/gray_800</item>
|
<item name="android:colorPrimary">@color/custom_gray_800</item>
|
||||||
<item name="android:colorBackground">@color/gray_100</item>
|
<item name="android:colorBackground">@color/gray_100</item>
|
||||||
<item name="android:textColorPrimary">@color/gray_800</item>
|
<item name="android:textColorPrimary">@color/custom_gray_800</item>
|
||||||
<item name="android:textColorSecondary">@color/gray_500</item>
|
<item name="android:textColorSecondary">@color/custom_gray_500</item>
|
||||||
<item name="colorButtonText">@color/gray_50</item>
|
<item name="colorButtonText">@color/gray_50</item>
|
||||||
<item name="colorSecondary">#E9EDF2</item>
|
<item name="colorSecondary">#E9EDF2</item>
|
||||||
<item name="colorBackgroundLight">@color/gray_50</item>
|
<item name="colorBackgroundLight">@color/gray_50</item>
|
||||||
<item name="colorBackgroundLightest">@color/gray_25</item>
|
<item name="colorBackgroundLightest">@color/gray_25</item>
|
||||||
<item name="colorBackgroundPopup">?colorBackgroundLightest</item>
|
<item name="colorBackgroundPopup">?colorBackgroundLightest</item>
|
||||||
<item name="colorDarkIcon">@color/gray_900</item>
|
<item name="colorDarkIcon">@color/custom_gray_900</item>
|
||||||
<item name="colorWindowBackground">@color/white</item>
|
<item name="colorWindowBackground">@color/white</item>
|
||||||
<item name="android:statusBarColor">@color/gray_50</item>
|
<item name="android:statusBarColor">@color/gray_50</item>
|
||||||
<item name="android:navigationBarColor">@color/navigation_bar_bg</item>
|
<item name="android:navigationBarColor">@color/navigation_bar_bg</item>
|
||||||
@@ -33,10 +33,10 @@
|
|||||||
<item name="colorPollVoted">@color/gray_300</item>
|
<item name="colorPollVoted">@color/gray_300</item>
|
||||||
<item name="colorAccentLight">@color/primary_600</item>
|
<item name="colorAccentLight">@color/primary_600</item>
|
||||||
<item name="colorSearchField">@color/gray_200</item>
|
<item name="colorSearchField">@color/gray_200</item>
|
||||||
<item name="colorSearchHint">@color/gray_600</item>
|
<item name="colorSearchHint">@color/custom_gray_600</item>
|
||||||
<item name="colorTabInactive">@color/gray_400</item>
|
<item name="colorTabInactive">@color/gray_400</item>
|
||||||
<item name="colorAccentLightest">@color/primary_100</item>
|
<item name="colorAccentLightest">@color/primary_100</item>
|
||||||
<item name="profileHeaderBackground">@color/gray_500</item>
|
<item name="profileHeaderBackground">@color/custom_gray_500</item>
|
||||||
|
|
||||||
<item name="buttonBackground">@drawable/bg_button_primary_dark_on_light</item>
|
<item name="buttonBackground">@drawable/bg_button_primary_dark_on_light</item>
|
||||||
<item name="android:editTextBackground">@drawable/bg_edittext_light</item>
|
<item name="android:editTextBackground">@drawable/bg_edittext_light</item>
|
||||||
@@ -68,6 +68,10 @@
|
|||||||
<item name="colorM3Outline">@color/m3_sys_light_outline</item>
|
<item name="colorM3Outline">@color/m3_sys_light_outline</item>
|
||||||
<item name="colorM3DisabledBackground">#1F1F1F1F</item>
|
<item name="colorM3DisabledBackground">#1F1F1F1F</item>
|
||||||
<item name="colorM3PressedOverlay">@color/m3_sys_light_on_primary</item>
|
<item name="colorM3PressedOverlay">@color/m3_sys_light_on_primary</item>
|
||||||
|
<item name="colorM3Error">#B3261E</item>
|
||||||
|
<item name="colorM3OnError">#FFF</item>
|
||||||
|
<item name="colorM3ErrorContainer">#F9DEDC</item>
|
||||||
|
<item name="colorM3OnErrorContainer">#410E0B</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Dark" parent="Theme.AppKit">
|
<style name="Theme.Mastodon.Dark" parent="Theme.AppKit">
|
||||||
@@ -85,29 +89,29 @@
|
|||||||
<item name="secondaryLargeButtonStyle">@style/Widget.Mastodon.Button.Large.Secondary_LightOnDark</item>
|
<item name="secondaryLargeButtonStyle">@style/Widget.Mastodon.Button.Large.Secondary_LightOnDark</item>
|
||||||
<item name="android:colorAccent">@color/primary_400</item>
|
<item name="android:colorAccent">@color/primary_400</item>
|
||||||
<item name="android:colorPrimary">@color/gray_50</item>
|
<item name="android:colorPrimary">@color/gray_50</item>
|
||||||
<item name="android:colorBackground">@color/gray_700</item>
|
<item name="android:colorBackground">@color/custom_gray_700</item>
|
||||||
<item name="android:textColorPrimary">@color/gray_50</item>
|
<item name="android:textColorPrimary">@color/gray_50</item>
|
||||||
<item name="android:textColorSecondary">@color/gray_400</item>
|
<item name="android:textColorSecondary">@color/gray_400</item>
|
||||||
<item name="colorButtonText">@color/gray_800</item>
|
<item name="colorButtonText">@color/custom_gray_800</item>
|
||||||
<item name="colorSecondary">#E9EDF2</item>
|
<item name="colorSecondary">#E9EDF2</item>
|
||||||
<item name="colorBackgroundLight">@color/gray_700</item>
|
<item name="colorBackgroundLight">@color/custom_gray_700</item>
|
||||||
<item name="colorBackgroundLightest">@color/gray_900</item>
|
<item name="colorBackgroundLightest">@color/custom_gray_900</item>
|
||||||
<item name="colorBackgroundPopup">?colorBackgroundLightest</item>
|
<item name="colorBackgroundPopup">?colorBackgroundLightest</item>
|
||||||
<item name="colorDarkIcon">@color/gray_25</item>
|
<item name="colorDarkIcon">@color/gray_25</item>
|
||||||
<item name="colorWindowBackground">@color/gray_800</item>
|
<item name="colorWindowBackground">@color/custom_gray_800</item>
|
||||||
<item name="android:statusBarColor">@color/gray_800</item>
|
<item name="android:statusBarColor">@color/custom_gray_800</item>
|
||||||
<item name="android:navigationBarColor">@color/gray_800</item>
|
<item name="android:navigationBarColor">@color/custom_gray_800</item>
|
||||||
<item name="android:actionBarTheme">@style/Theme.Mastodon.Toolbar.Dark</item>
|
<item name="android:actionBarTheme">@style/Theme.Mastodon.Toolbar.Dark</item>
|
||||||
<item name="android:alertDialogTheme">@style/Theme.Mastodon.Dialog.Alert.Dark</item>
|
<item name="android:alertDialogTheme">@style/Theme.Mastodon.Dialog.Alert.Dark</item>
|
||||||
<item name="colorPollMostVoted">@color/primary_700</item>
|
<item name="colorPollMostVoted">@color/primary_700</item>
|
||||||
<item name="colorPollVoted">@color/gray_600</item>
|
<item name="colorPollVoted">@color/custom_gray_600</item>
|
||||||
<item name="colorAccentLight">@color/primary_600</item>
|
<item name="colorAccentLight">@color/primary_600</item>
|
||||||
<item name="colorAccentLightest">@color/primary_800</item>
|
<item name="colorAccentLightest">@color/primary_800</item>
|
||||||
<item name="colorTabInactive">@color/gray_400</item>
|
<item name="colorTabInactive">@color/gray_400</item>
|
||||||
<item name="profileHeaderBackground">?colorWindowBackground</item>
|
<item name="profileHeaderBackground">?colorWindowBackground</item>
|
||||||
|
|
||||||
<!-- TODO dark colors -->
|
<!-- TODO dark colors -->
|
||||||
<item name="colorSearchField">@color/gray_700</item>
|
<item name="colorSearchField">@color/custom_gray_700</item>
|
||||||
<item name="colorSearchHint">@color/gray_300</item>
|
<item name="colorSearchHint">@color/gray_300</item>
|
||||||
|
|
||||||
<item name="buttonBackground">@drawable/bg_button_primary_light_on_dark</item>
|
<item name="buttonBackground">@drawable/bg_button_primary_light_on_dark</item>
|
||||||
@@ -140,6 +144,10 @@
|
|||||||
<item name="colorM3Outline">@color/m3_sys_dark_outline</item>
|
<item name="colorM3Outline">@color/m3_sys_dark_outline</item>
|
||||||
<item name="colorM3DisabledBackground">#1FE3E3E3</item>
|
<item name="colorM3DisabledBackground">#1FE3E3E3</item>
|
||||||
<item name="colorM3PressedOverlay">@color/m3_sys_dark_primary</item>
|
<item name="colorM3PressedOverlay">@color/m3_sys_dark_primary</item>
|
||||||
|
<item name="colorM3Error">#F2B8B5</item>
|
||||||
|
<item name="colorM3OnError">#601410</item>
|
||||||
|
<item name="colorM3ErrorContainer">#8C1D18</item>
|
||||||
|
<item name="colorM3OnErrorContainer">#F9DEDC</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Dark.TrueBlack">
|
<style name="Theme.Mastodon.Dark.TrueBlack">
|
||||||
@@ -149,10 +157,10 @@
|
|||||||
<item name="android:actionBarTheme">@style/Theme.Mastodon.Toolbar.Dark.TrueBlack</item>
|
<item name="android:actionBarTheme">@style/Theme.Mastodon.Toolbar.Dark.TrueBlack</item>
|
||||||
<item name="colorBackgroundLight">@color/black</item>
|
<item name="colorBackgroundLight">@color/black</item>
|
||||||
<item name="colorButtonText">@color/black</item>
|
<item name="colorButtonText">@color/black</item>
|
||||||
<item name="colorPollVoted">@color/gray_800</item>
|
<item name="colorPollVoted">@color/custom_gray_800</item>
|
||||||
<item name="colorSearchField">@color/gray_900</item>
|
<item name="colorSearchField">@color/custom_gray_900</item>
|
||||||
<item name="colorBackgroundLightest">@color/black</item>
|
<item name="colorBackgroundLightest">@color/black</item>
|
||||||
<item name="colorBackgroundPopup">@color/gray_900</item>
|
<item name="colorBackgroundPopup">@color/custom_gray_900</item>
|
||||||
<item name="colorWindowBackground">@color/black</item>
|
<item name="colorWindowBackground">@color/black</item>
|
||||||
|
|
||||||
<item name="colorM3Background">#000</item>
|
<item name="colorM3Background">#000</item>
|
||||||
@@ -233,18 +241,18 @@
|
|||||||
|
|
||||||
<style name="Theme.Mastodon.Dark.Material3" parent="Theme.Mastodon.Dark.CustomBase">
|
<style name="Theme.Mastodon.Dark.Material3" parent="Theme.Mastodon.Dark.CustomBase">
|
||||||
<!-- needed to disable scrim on API 29+ -->
|
<!-- needed to disable scrim on API 29+ -->
|
||||||
<item name="android:colorBackground">@color/m3_gray_700</item>
|
<item name="android:colorBackground">@color/m3_gray_800</item>
|
||||||
<item name="colorButtonText">@color/m3_gray_800</item>
|
<item name="colorButtonText">@color/m3_gray_900</item>
|
||||||
<item name="colorBackgroundLight">@color/m3_gray_700</item>
|
<item name="colorBackgroundLight">@color/m3_gray_800</item>
|
||||||
<item name="colorBackgroundLightest">@color/m3_gray_900</item>
|
<item name="colorBackgroundLightest">@color/m3_gray_900</item>
|
||||||
<item name="colorBackgroundPopup">@color/m3_gray_900</item>
|
<item name="colorBackgroundPopup">@color/m3_gray_900</item>
|
||||||
<item name="colorDarkIcon">@color/m3_gray_25</item>
|
<item name="colorDarkIcon">@color/m3_gray_25</item>
|
||||||
<item name="colorWindowBackground">@color/m3_gray_800</item>
|
<item name="colorWindowBackground">@color/m3_gray_900</item>
|
||||||
<item name="android:statusBarColor">@color/m3_gray_800</item>
|
<item name="android:statusBarColor">@color/m3_gray_900</item>
|
||||||
<item name="android:navigationBarColor">@color/m3_gray_800</item>
|
<item name="android:navigationBarColor">@color/m3_gray_900</item>
|
||||||
<item name="colorPollVoted">@color/m3_gray_600</item>
|
<item name="colorPollVoted">@color/m3_gray_700</item>
|
||||||
<item name="profileHeaderBackground">?colorWindowBackground</item>
|
<item name="profileHeaderBackground">?colorWindowBackground</item>
|
||||||
<item name="android:actionBarTheme">@style/Theme.Mastodon.Toolbar.Dark.CustomBase</item>
|
<item name="android:actionBarTheme">@style/Theme.Mastodon.Toolbar.Dark.Material3</item>
|
||||||
|
|
||||||
<item name="android:colorAccent">@color/m3_primary_400</item>
|
<item name="android:colorAccent">@color/m3_primary_400</item>
|
||||||
<item name="android:colorPrimary">@color/m3_gray_50</item>
|
<item name="android:colorPrimary">@color/m3_gray_50</item>
|
||||||
@@ -688,6 +696,7 @@
|
|||||||
<item name="colorPollMostVoted">@color/original_primary_700</item>
|
<item name="colorPollMostVoted">@color/original_primary_700</item>
|
||||||
<item name="colorAccentLight">@color/original_primary_600</item>
|
<item name="colorAccentLight">@color/original_primary_600</item>
|
||||||
<item name="colorAccentLightest">@color/original_primary_800</item>
|
<item name="colorAccentLightest">@color/original_primary_800</item>
|
||||||
|
<item name="android:alertDialogTheme">@style/Theme.Mastodon.Dialog.Alert.Dark.Original</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Dark.TrueBlack.Original" parent="Theme.Mastodon.Dark.TrueBlack">
|
<style name="Theme.Mastodon.Dark.TrueBlack.Original" parent="Theme.Mastodon.Dark.TrueBlack">
|
||||||
@@ -695,6 +704,7 @@
|
|||||||
<item name="colorPollMostVoted">@color/original_primary_700</item>
|
<item name="colorPollMostVoted">@color/original_primary_700</item>
|
||||||
<item name="colorAccentLight">@color/original_primary_600</item>
|
<item name="colorAccentLight">@color/original_primary_600</item>
|
||||||
<item name="colorAccentLightest">@color/original_primary_800</item>
|
<item name="colorAccentLightest">@color/original_primary_800</item>
|
||||||
|
<item name="android:alertDialogTheme">@style/Theme.Mastodon.Dialog.Alert.Dark.Original</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Light.Original" parent="Theme.Mastodon.Light">
|
<style name="Theme.Mastodon.Light.Original" parent="Theme.Mastodon.Light">
|
||||||
@@ -702,20 +712,48 @@
|
|||||||
<item name="colorPollMostVoted">@color/original_primary_700</item>
|
<item name="colorPollMostVoted">@color/original_primary_700</item>
|
||||||
<item name="colorAccentLight">@color/original_primary_600</item>
|
<item name="colorAccentLight">@color/original_primary_600</item>
|
||||||
<item name="colorAccentLightest">@color/original_primary_800</item>
|
<item name="colorAccentLightest">@color/original_primary_800</item>
|
||||||
|
<item name="android:alertDialogTheme">@style/Theme.Mastodon.Dialog.Alert.Original</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.AutoLightDark.Original" parent="Theme.Mastodon.Light.Original"/>
|
<style name="Theme.Mastodon.AutoLightDark.Original" parent="Theme.Mastodon.Light.Original"/>
|
||||||
<style name="Theme.Mastodon.AutoLightDark.TrueBlack.Original" parent="Theme.Mastodon.Light.Original"/>
|
<style name="Theme.Mastodon.AutoLightDark.TrueBlack.Original" parent="Theme.Mastodon.Light.Original"/>
|
||||||
|
|
||||||
|
<style name="Theme.Mastodon.Dialog.Alert.Dark.Original" parent="android:Theme.Material.Dialog.Alert">
|
||||||
|
<item name="android:windowTitleStyle">@style/alert_title</item>
|
||||||
|
<item name="android:dialogPreferredPadding">24dp</item>
|
||||||
|
<item name="android:windowBackground">@drawable/bg_alert</item>
|
||||||
|
<item name="android:buttonBarButtonStyle">@style/Widget.Mastodon.ButtonBarButton</item>
|
||||||
|
|
||||||
|
<!-- colors -->
|
||||||
|
<item name="android:colorAccent">@color/original_primary_600</item>
|
||||||
|
<item name="android:colorPrimary">@color/gray_50</item>
|
||||||
|
<item name="android:colorBackground">@color/custom_gray_700</item>
|
||||||
|
<item name="android:textColorPrimary">@color/gray_50</item>
|
||||||
|
<item name="android:textColorSecondary">@color/gray_400</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.Mastodon.Dialog.Alert.Original" parent="android:Theme.Material.Light.Dialog.Alert">
|
||||||
|
<item name="android:windowTitleStyle">@style/alert_title</item>
|
||||||
|
<item name="android:dialogPreferredPadding">24dp</item>
|
||||||
|
<item name="android:windowBackground">@drawable/bg_alert</item>
|
||||||
|
<item name="android:buttonBarButtonStyle">@style/Widget.Mastodon.ButtonBarButton</item>
|
||||||
|
|
||||||
|
<!-- colors -->
|
||||||
|
<item name="android:colorAccent">@color/original_primary_700</item>
|
||||||
|
<item name="android:colorPrimary">@color/custom_gray_800</item>
|
||||||
|
<item name="android:colorBackground">@color/gray_100</item>
|
||||||
|
<item name="android:textColorPrimary">@color/custom_gray_800</item>
|
||||||
|
<item name="android:textColorSecondary">@color/custom_gray_500</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Toolbar" parent="android:ThemeOverlay.Material.ActionBar">
|
<style name="Theme.Mastodon.Toolbar" parent="android:ThemeOverlay.Material.ActionBar">
|
||||||
<item name="android:colorPrimary">@color/gray_50</item>
|
<item name="android:colorPrimary">@color/gray_50</item>
|
||||||
<item name="android:textColorPrimary">@color/gray_800</item>
|
<item name="android:textColorPrimary">@color/custom_gray_800</item>
|
||||||
<item name="android:textColorSecondary">@color/gray_800</item>
|
<item name="android:textColorSecondary">@color/custom_gray_800</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Toolbar.Dark" parent="android:ThemeOverlay.Material.Dark.ActionBar">
|
<style name="Theme.Mastodon.Toolbar.Dark" parent="android:ThemeOverlay.Material.Dark.ActionBar">
|
||||||
<item name="android:colorPrimary">@color/gray_800</item>
|
<item name="android:colorPrimary">@color/custom_gray_800</item>
|
||||||
<item name="android:textColorPrimary">@color/gray_50</item>
|
<item name="android:textColorPrimary">@color/gray_50</item>
|
||||||
<item name="android:textColorSecondary">@color/gray_50</item>
|
<item name="android:textColorSecondary">@color/gray_50</item>
|
||||||
</style>
|
</style>
|
||||||
@@ -727,7 +765,7 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Toolbar.Dark.Material3" parent="android:ThemeOverlay.Material.Dark.ActionBar">
|
<style name="Theme.Mastodon.Toolbar.Dark.Material3" parent="android:ThemeOverlay.Material.Dark.ActionBar">
|
||||||
<item name="android:colorPrimary">@color/m3_gray_800</item>
|
<item name="android:colorPrimary">@color/m3_gray_900</item>
|
||||||
<item name="android:textColorPrimary">@color/m3_gray_50</item>
|
<item name="android:textColorPrimary">@color/m3_gray_50</item>
|
||||||
<item name="android:textColorSecondary">@color/m3_gray_50</item>
|
<item name="android:textColorSecondary">@color/m3_gray_50</item>
|
||||||
</style>
|
</style>
|
||||||
@@ -817,10 +855,10 @@
|
|||||||
|
|
||||||
<!-- colors -->
|
<!-- colors -->
|
||||||
<item name="android:colorAccent">@color/primary_700</item>
|
<item name="android:colorAccent">@color/primary_700</item>
|
||||||
<item name="android:colorPrimary">@color/gray_800</item>
|
<item name="android:colorPrimary">@color/custom_gray_800</item>
|
||||||
<item name="android:colorBackground">@color/gray_100</item>
|
<item name="android:colorBackground">@color/gray_100</item>
|
||||||
<item name="android:textColorPrimary">@color/gray_800</item>
|
<item name="android:textColorPrimary">@color/custom_gray_800</item>
|
||||||
<item name="android:textColorSecondary">@color/gray_500</item>
|
<item name="android:textColorSecondary">@color/custom_gray_500</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.Mastodon.Dialog.Alert.Dark" parent="android:Theme.Material.Dialog.Alert">
|
<style name="Theme.Mastodon.Dialog.Alert.Dark" parent="android:Theme.Material.Dialog.Alert">
|
||||||
@@ -832,7 +870,7 @@
|
|||||||
<!-- colors -->
|
<!-- colors -->
|
||||||
<item name="android:colorAccent">@color/primary_600</item>
|
<item name="android:colorAccent">@color/primary_600</item>
|
||||||
<item name="android:colorPrimary">@color/gray_50</item>
|
<item name="android:colorPrimary">@color/gray_50</item>
|
||||||
<item name="android:colorBackground">@color/gray_700</item>
|
<item name="android:colorBackground">@color/custom_gray_700</item>
|
||||||
<item name="android:textColorPrimary">@color/gray_50</item>
|
<item name="android:textColorPrimary">@color/gray_50</item>
|
||||||
<item name="android:textColorSecondary">@color/gray_400</item>
|
<item name="android:textColorSecondary">@color/gray_400</item>
|
||||||
</style>
|
</style>
|
||||||
@@ -866,6 +904,13 @@
|
|||||||
<item name="android:paddingRight">24dp</item>
|
<item name="android:paddingRight">24dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="Widget.Mastodon.M3.Button.Text">
|
||||||
|
<item name="android:background">@drawable/bg_button_m3_text</item>
|
||||||
|
<item name="android:textColor">@color/button_text_m3_text</item>
|
||||||
|
<item name="android:paddingLeft">24dp</item>
|
||||||
|
<item name="android:paddingRight">24dp</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="alert_title">
|
<style name="alert_title">
|
||||||
<item name="android:textColor">?android:textColorPrimary</item>
|
<item name="android:textColor">?android:textColorPrimary</item>
|
||||||
<item name="android:textSize">24dp</item>
|
<item name="android:textSize">24dp</item>
|
||||||
@@ -885,6 +930,12 @@
|
|||||||
<item name="android:lineSpacingExtra">4dp</item>
|
<item name="android:lineSpacingExtra">4dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="m3_body_small">
|
||||||
|
<item name="android:textSize">12dp</item>
|
||||||
|
<item name="android:textColor">?android:textColorSecondary</item>
|
||||||
|
<item name="android:lineSpacingExtra">2dp</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="m3_title_medium">
|
<style name="m3_title_medium">
|
||||||
<item name="android:fontFamily">sans-serif-medium</item>
|
<item name="android:fontFamily">sans-serif-medium</item>
|
||||||
<item name="android:textSize">16dp</item>
|
<item name="android:textSize">16dp</item>
|
||||||
|
|||||||
4
metadata/es/changelogs/55.txt
Normal file
4
metadata/es/changelogs/55.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
- Corrige la representación errónea de etiquetas HTML y activa el formato Markdown
|
||||||
|
- Inicializa el <a href="https://translate.codeberg.org/projects/megalodon">proyecto de traducción vía Weblate</a>
|
||||||
|
- Añade un alternador para la cronología federada
|
||||||
|
- Las versiones 52-54 fueron ajustes menores para una versión para Google Play
|
||||||
6
metadata/es/changelogs/56.txt
Normal file
6
metadata/es/changelogs/56.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
- Temas personalizados por @LucasGGamerM
|
||||||
|
- Nuevo logotipo del texto "megalodón" enviado por @LucasGGamerM
|
||||||
|
- Mejor búsqueda de emojis
|
||||||
|
- Votación modificada (mostrar el voto propio, mostrar siempre el botón de voto, no cortar las respuestas largas)
|
||||||
|
- Agregar las configuraciones de las notificaciones push
|
||||||
|
- Corrección de errores
|
||||||
5
metadata/es/changelogs/58.txt
Normal file
5
metadata/es/changelogs/58.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
- Se añadió un selector de idiomas
|
||||||
|
- Se incluye una función para traducir
|
||||||
|
- Mejora la semántica para votar en encuestas (botones de opción y casillas)
|
||||||
|
- Permite votar por varias opciones en las encuestas
|
||||||
|
- Corrige varios defectos
|
||||||
@@ -1,17 +1,11 @@
|
|||||||
Megalodon es una versión modificada de la <a href="https://github.com/mastodon/mastodon-android">aplicación oficial de Mastodon para Android</a> que ha añadido opciones importantes que no tiene la versión oficial , como la línea de tiempo federada, la publicación sin listar, marcadores y un visor de la descripción de las imágenes.
|
Megalodon es una versión modificada de la <a href="https://github.com/mastodon/mastodon-android">aplicación oficial de Mastodon para Android</a> que añade funcionalidades importantes que le faltan a esta, como la cronología federada, la publicación descatalogada y un visor de descripciones de imágenes.
|
||||||
|
|
||||||
<b>Funcionalidades clave</b>
|
<b>Funcionalidades importantes</b>
|
||||||
|
|
||||||
— <b>Publicación sin listar</b>: Escribe de forma pública sin que la publicación se muestre en las tendencias, etiquetas o líneas de tiempo públicas.
|
- <b>Publicación descatalogada</b>: haga envíos públicos sin que estos figuren en tendencias, etiquetas o cronologías públicas.
|
||||||
— <b>Línea de tiempo federada</b>: Visualiza todas las publicaciones de personas del resto de barrios del Fedivers a los que está conectada tu instancia.
|
- <b>Cronología federada</b>: vea todos los envíos públicos de las personas en las instalaciones del Fediverso que estén conectadas con su instalación hogar.
|
||||||
— <b>Visor de la descripción de las imágenes.</b>: Comprueba rápidamente si una imagen o un vídeo tiene un texto alternativo adjunto.
|
- <b>Visor de descripciones de imágenes</b>: compruebe con rapidez si una imagen o un vídeo tiene texto alternativo.
|
||||||
— <b>Fijar publicaciones</b>: Fija tus publicaciones más importantes en tu perfil y mira qué han fijado otras personas en la pestaña Fijado.
|
- <b>Anclaje de publicaciones</b>: ancle sus envíos más importantes a su perfil y vea lo que otros han anclado mediante la pestaña «Ancladas».
|
||||||
— <b>Marcadores</b>: Guarda rápidamente publicaciones y búscalas más tarde en la lista de marcadores.
|
- <b>Seguir etiquetas</b>: vea envíos etiquetados directamente en su cronología de inicio siguiéndolas.
|
||||||
— <b>Seguimiento de etiquetas</b>: Visualiza nuevas publicaciones de etiquetas específicas directamente en la línea de tiempo, siguiendo estas etiquetas.
|
- <b>Respuesta a solicitudes de seguimiento</b>: acepte o rechace solicitudes de seguimiento desde sus notificaciones o desde la lista dedicada.
|
||||||
— <b>Responder las solicitudes de seguimiento</b>: Acepta o rechaza solicitudes de seguimiento desde las notificaciones o en la lista de solicitudes de seguimiento dedicada.
|
- <b>Eliminar y reescribir</b>: la tan querida función que hizo posible editar los envíos ante la falta de una función Editar propiamente dicha.
|
||||||
— <b>Eliminar y volver a escribir</b>: La característica tan querida que hizo posible la edición sin una función de edición real.
|
|
||||||
|
|
||||||
<b>Funcionalidades oficiales no lanzadas, disponibles por adelantado</b>
|
|
||||||
|
|
||||||
— Edición de publicaciones
|
|
||||||
- Actualizador integrado para los lanzamientos de GitHub
|
|
||||||
|
|||||||
4
metadata/fr-FR/changelogs/55.txt
Normal file
4
metadata/fr-FR/changelogs/55.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
- Correction du rendu des balises HTML et activation du formatage Markdown
|
||||||
|
- Initialisation du <a href="https://translate.codeberg.org/projects/megalodon">projet de traduction Weblate</a>
|
||||||
|
- Ajout d'une option pour activer la chronologie fédérée
|
||||||
|
- Les versions 52-54 contenaient de petits ajustements pour une sortie sur Google Play
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user