. */
+
+package com.keylesspalace.tusky.service
+
+import android.content.Context
+import android.os.Build
+
+interface ServiceClient {
+ fun sendToot(tootToSend: TootToSend)
+}
+
+class ServiceClientImpl(private val context: Context) : ServiceClient {
+ override fun sendToot(tootToSend: TootToSend) {
+ val intent = SendTootService.sendTootIntent(context, tootToSend)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ context.startForegroundService(intent)
+ } else {
+ context.startService(intent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt b/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt
index f064089da..1e170da84 100644
--- a/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt
@@ -18,7 +18,6 @@ package com.keylesspalace.tusky.service
import android.annotation.TargetApi
import android.content.Intent
import android.service.quicksettings.TileService
-
import com.keylesspalace.tusky.MainActivity
/**
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/CountUpDownLatch.java b/app/src/main/java/com/keylesspalace/tusky/util/CountUpDownLatch.java
deleted file mode 100644
index 70a084867..000000000
--- a/app/src/main/java/com/keylesspalace/tusky/util/CountUpDownLatch.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright 2017 Andrew Dawson
- *
- * This file is a part of Tusky.
- *
- * This program is free software; you can redistribute it and/or modify it under the terms of the
- * GNU General Public License as published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- * Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with Tusky; if not,
- * see . */
-
-package com.keylesspalace.tusky.util;
-
-/**
- * This is a synchronization primitive related to {@link java.util.concurrent.CountDownLatch}
- * except that it starts at zero and can count upward.
- *
- * The intended use case is for waiting for all tasks to be finished when the number of tasks isn't
- * known ahead of time, or may change while waiting.
- */
-public class CountUpDownLatch {
- private int count;
-
- public CountUpDownLatch() {
- this.count = 0;
- }
-
- public synchronized void countDown() {
- count--;
- notifyAll();
- }
-
- public synchronized void countUp() {
- count++;
- notifyAll();
- }
-
- public synchronized void await() throws InterruptedException {
- while (count != 0) {
- wait();
- }
- }
-
- public synchronized boolean isEmpty() {
- return count == 0;
- }
-}
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.java
index f6dd82f0a..270f01222 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.java
+++ b/app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.java
@@ -19,6 +19,7 @@ import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.os.Build;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
@@ -68,8 +69,8 @@ public class LinkHelper {
* @param listener to notify about particular spans that are clicked
*/
public static void setClickableText(TextView view, Spanned content,
- @Nullable Status.Mention[] mentions, final LinkListener listener,
- boolean removeQuote) {
+ @Nullable Status.Mention[] mentions, final LinkListener listener,
+ boolean removeQuote) {
SpannableStringBuilder builder = new SpannableStringBuilder(content);
URLSpan[] urlSpans = content.getSpans(0, content.length(), URLSpan.class);
for (URLSpan span : urlSpans) {
@@ -186,6 +187,14 @@ public class LinkHelper {
view.setMovementMethod(LinkMovementMethod.getInstance());
}
+ public static CharSequence createClickableText(String text, String link) {
+ URLSpan span = new CustomURLSpan(link);
+
+ SpannableStringBuilder clickableText = new SpannableStringBuilder(text);
+ clickableText.setSpan(span, 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ return clickableText;
+ }
+
/**
* Opens a link, depending on the settings, either in the browser or in a custom tab
*
@@ -229,10 +238,17 @@ public class LinkHelper {
public static void openLinkInCustomTab(Uri uri, Context context) {
int toolbarColor = ThemeUtils.getColor(context, R.attr.custom_tab_toolbar);
- CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
+ CustomTabsIntent.Builder customTabsIntentBuilder = new CustomTabsIntent.Builder()
.setToolbarColor(toolbarColor)
- .setShowTitle(true)
- .build();
+ .setShowTitle(true);
+
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
+ customTabsIntentBuilder.setNavigationBarColor(
+ ThemeUtils.getColor(context, android.R.attr.navigationBarColor)
+ );
+ }
+
+ CustomTabsIntent customTabsIntent = customTabsIntentBuilder.build();
try {
customTabsIntent.launchUrl(context, uri);
} catch (ActivityNotFoundException e) {
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/LiveDataUtil.kt b/app/src/main/java/com/keylesspalace/tusky/util/LiveDataUtil.kt
new file mode 100644
index 000000000..b0048aefb
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/util/LiveDataUtil.kt
@@ -0,0 +1,93 @@
+/* Copyright 2019 Tusky Contributors
+ *
+ * This file is a part of Tusky.
+ *
+ * This program is free software; you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Tusky; if not,
+ * see . */
+
+package com.keylesspalace.tusky.util
+
+import androidx.lifecycle.*
+import io.reactivex.BackpressureStrategy
+import io.reactivex.Observable
+import io.reactivex.Single
+
+inline fun LiveData.map(crossinline mapFunction: (X) -> Y): LiveData =
+ Transformations.map(this) { input -> mapFunction(input) }
+
+inline fun LiveData.switchMap(
+ crossinline switchMapFunction: (X) -> LiveData
+): LiveData = Transformations.switchMap(this) { input -> switchMapFunction(input) }
+
+inline fun LiveData.filter(crossinline predicate: (X) -> Boolean): LiveData {
+ val liveData = MediatorLiveData()
+ liveData.addSource(this) { value ->
+ if (predicate(value)) {
+ liveData.value = value
+ }
+ }
+ return liveData
+}
+
+fun LifecycleOwner.withLifecycleContext(body: LifecycleContext.() -> Unit) =
+ LifecycleContext(this).apply(body)
+
+class LifecycleContext(val lifecycleOwner: LifecycleOwner) {
+ inline fun LiveData.observe(crossinline observer: (T) -> Unit) =
+ this.observe(lifecycleOwner, Observer { observer(it) })
+
+ /**
+ * Just hold a subscription,
+ */
+ fun LiveData.subscribe() =
+ this.observe(lifecycleOwner, Observer { })
+}
+
+/**
+ * Invokes @param [combiner] when value of both @param [a] and @param [b] are not null. Returns
+ * [LiveData] with value set to the result of calling [combiner] with value of both.
+ * Important! You still need to observe to the returned [LiveData] for [combiner] to be invoked.
+ */
+fun combineLiveData(a: LiveData, b: LiveData, combiner: (A, B) -> R): LiveData {
+ val liveData = MediatorLiveData()
+ liveData.addSource(a) {
+ if (a.value != null && b.value != null) {
+ liveData.value = combiner(a.value!!, b.value!!)
+ }
+ }
+ liveData.addSource(b) {
+ if (a.value != null && b.value != null) {
+ liveData.value = combiner(a.value!!, b.value!!)
+ }
+ }
+ return liveData
+}
+
+/**
+ * Returns [LiveData] with value set to the result of calling [combiner] with value of [a] and [b]
+ * after either changes. Doesn't check if either has value.
+ * Important! You still need to observe to the returned [LiveData] for [combiner] to be invoked.
+ */
+fun combineOptionalLiveData(a: LiveData, b: LiveData, combiner: (A?, B?) -> R): LiveData {
+ val liveData = MediatorLiveData()
+ liveData.addSource(a) {
+ liveData.value = combiner(a.value, b.value)
+ }
+ liveData.addSource(b) {
+ liveData.value = combiner(a.value, b.value)
+ }
+ return liveData
+}
+
+fun Single.toLiveData() = LiveDataReactiveStreams.fromPublisher(this.toFlowable())
+fun Observable.toLiveData(
+ backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST
+) = LiveDataReactiveStreams.fromPublisher(this.toFlowable(BackpressureStrategy.LATEST))
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt
index 453b42d2a..43f05e9cb 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt
@@ -16,13 +16,10 @@
package com.keylesspalace.tusky.util
import android.content.ContentResolver
-import android.content.Context
import android.database.Cursor
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
-import android.media.MediaMetadataRetriever
-import android.media.ThumbnailUtils
import android.net.Uri
import android.provider.OpenableColumns
import androidx.annotation.Px
@@ -106,26 +103,6 @@ fun getSampledBitmap(contentResolver: ContentResolver, uri: Uri, @Px reqWidth: I
}
}
-fun getImageThumbnail(contentResolver: ContentResolver, uri: Uri, @Px thumbnailSize: Int): Bitmap? {
- val source = getSampledBitmap(contentResolver, uri, thumbnailSize, thumbnailSize) ?: return null
- return ThumbnailUtils.extractThumbnail(source, thumbnailSize, thumbnailSize, ThumbnailUtils.OPTIONS_RECYCLE_INPUT)
-}
-
-fun getVideoThumbnail(context: Context, uri: Uri, @Px thumbnailSize: Int): Bitmap? {
- val retriever = MediaMetadataRetriever()
- try {
- retriever.setDataSource(context, uri)
- } catch (e: IllegalArgumentException) {
- Log.w(TAG, e)
- return null
- } catch (e: SecurityException) {
- Log.w(TAG, e)
- return null
- }
- val source = retriever.frameAtTime ?: return null
- return ThumbnailUtils.extractThumbnail(source, thumbnailSize, thumbnailSize, ThumbnailUtils.OPTIONS_RECYCLE_INPUT)
-}
-
@Throws(FileNotFoundException::class)
fun getImageSquarePixels(contentResolver: ContentResolver, uri: Uri): Long {
val input = contentResolver.openInputStream(uri)
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java
index edc8ab92d..690098309 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java
+++ b/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java
@@ -5,16 +5,18 @@ import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.content.FileProvider;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.FileProvider;
+
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.keylesspalace.tusky.BuildConfig;
+import com.keylesspalace.tusky.db.AppDatabase;
import com.keylesspalace.tusky.db.TootDao;
import com.keylesspalace.tusky.db.TootEntity;
import com.keylesspalace.tusky.entity.NewPoll;
@@ -27,6 +29,8 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
+import javax.inject.Inject;
+
public final class SaveTootHelper {
private static final String TAG = "SaveTootHelper";
@@ -35,15 +39,16 @@ public final class SaveTootHelper {
private Context context;
private Gson gson = new Gson();
- public SaveTootHelper(@NonNull TootDao tootDao, @NonNull Context context) {
- this.tootDao = tootDao;
+ @Inject
+ public SaveTootHelper(@NonNull AppDatabase appDatabase, @NonNull Context context) {
+ this.tootDao = appDatabase.tootDao();
this.context = context;
}
@SuppressLint("StaticFieldLeak")
public boolean saveToot(@NonNull String content,
@NonNull String contentWarning,
- @Nullable String savedJsonUrls,
+ @Nullable List savedJsonUrls,
@NonNull List mediaUris,
@NonNull List mediaDescriptions,
int savedTootUid,
@@ -58,31 +63,25 @@ public final class SaveTootHelper {
}
// Get any existing file's URIs.
- ArrayList existingUris = null;
- if (!TextUtils.isEmpty(savedJsonUrls)) {
- existingUris = gson.fromJson(savedJsonUrls,
- new TypeToken>() {
- }.getType());
- }
String mediaUrlsSerialized = null;
String mediaDescriptionsSerialized = null;
if (!ListUtils.isEmpty(mediaUris)) {
- List savedList = saveMedia(mediaUris, existingUris);
+ List savedList = saveMedia(mediaUris, savedJsonUrls);
if (!ListUtils.isEmpty(savedList)) {
mediaUrlsSerialized = gson.toJson(savedList);
- if (!ListUtils.isEmpty(existingUris)) {
- deleteMedia(setDifference(existingUris, savedList));
+ if (!ListUtils.isEmpty(savedJsonUrls)) {
+ deleteMedia(setDifference(savedJsonUrls, savedList));
}
} else {
return false;
}
mediaDescriptionsSerialized = gson.toJson(mediaDescriptions);
- } else if (!ListUtils.isEmpty(existingUris)) {
+ } else if (!ListUtils.isEmpty(savedJsonUrls)) {
/* If there were URIs in the previous draft, but they've now been removed, those files
* can be deleted. */
- deleteMedia(existingUris);
+ deleteMedia(savedJsonUrls);
}
final TootEntity toot = new TootEntity(savedTootUid, content, mediaUrlsSerialized, mediaDescriptionsSerialized, contentWarning,
inReplyToId,
@@ -103,15 +102,16 @@ public final class SaveTootHelper {
public void deleteDraft(int tootId) {
TootEntity item = tootDao.find(tootId);
- if(item != null) {
+ if (item != null) {
deleteDraft(item);
}
}
- public void deleteDraft(@NonNull TootEntity item){
+ public void deleteDraft(@NonNull TootEntity item) {
// Delete any media files associated with the status.
ArrayList uris = gson.fromJson(item.getUrls(),
- new TypeToken>() {}.getType());
+ new TypeToken>() {
+ }.getType());
if (uris != null) {
for (String uriString : uris) {
Uri uri = Uri.parse(uriString);
@@ -172,7 +172,7 @@ public final class SaveTootHelper {
}
return null;
}
- Uri resultUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID+".fileprovider", file);
+ Uri resultUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file);
results.add(resultUri.toString());
}
return results;
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/VersionUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/VersionUtils.java
index 76dcd4510..dceef0f30 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/VersionUtils.java
+++ b/app/src/main/java/com/keylesspalace/tusky/util/VersionUtils.java
@@ -15,6 +15,8 @@
package com.keylesspalace.tusky.util;
+import androidx.annotation.NonNull;
+
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -24,7 +26,7 @@ public class VersionUtils {
private int minor;
private int patch;
- public VersionUtils(String versionString) {
+ public VersionUtils(@NonNull String versionString) {
String regex = "([0-9]+)\\.([0-9]+)\\.([0-9]+).*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(versionString);
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt b/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt
index b976a5d63..389995ae2 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt
@@ -51,4 +51,13 @@ inline fun EditText.onTextChanged(
callback(s, start, before, count)
}
})
+}
+
+inline fun EditText.afterTextChanged(
+ crossinline callback: (s: Editable) -> Unit) {
+ addTextChangedListener(object : DefaultTextWatcher() {
+ override fun afterTextChanged(s: Editable) {
+ callback(s)
+ }
+ })
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt
index adbcaa43e..ad90cacc9 100644
--- a/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt
@@ -6,12 +6,11 @@ import androidx.lifecycle.ViewModel
import com.keylesspalace.tusky.appstore.*
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.entity.Account
+import com.keylesspalace.tusky.entity.Field
+import com.keylesspalace.tusky.entity.IdentityProof
import com.keylesspalace.tusky.entity.Relationship
import com.keylesspalace.tusky.network.MastodonApi
-import com.keylesspalace.tusky.util.Error
-import com.keylesspalace.tusky.util.Loading
-import com.keylesspalace.tusky.util.Resource
-import com.keylesspalace.tusky.util.Success
+import com.keylesspalace.tusky.util.*
import io.reactivex.disposables.Disposable
import retrofit2.Call
import retrofit2.Callback
@@ -27,6 +26,14 @@ class AccountViewModel @Inject constructor(
val accountData = MutableLiveData>()
val relationshipData = MutableLiveData>()
+ private val identityProofData = MutableLiveData>()
+
+ val accountFieldData = combineOptionalLiveData(accountData, identityProofData) { accountRes, identityProofs ->
+ identityProofs.orEmpty().map { Either.Left(it) }
+ .plus(accountRes?.data?.fields.orEmpty().map { Either.Right(it) })
+ }
+
+
private val callList: MutableList> = mutableListOf()
private val disposable: Disposable = eventHub.events
.subscribe { event ->
@@ -60,6 +67,7 @@ class AccountViewModel @Inject constructor(
}
override fun onFailure(call: Call, t: Throwable) {
+ Log.w(TAG, "failed obtaining account", t)
accountData.postValue(Error())
isDataLoading = false
isRefreshing.postValue(false)
@@ -90,6 +98,7 @@ class AccountViewModel @Inject constructor(
}
override fun onFailure(call: Call>, t: Throwable) {
+ Log.w(TAG, "failed obtaining relationships", t)
relationshipData.postValue(Error())
}
})
@@ -98,6 +107,30 @@ class AccountViewModel @Inject constructor(
}
}
+ private fun obtainIdentityProof(reload: Boolean = false) {
+ if (identityProofData.value == null || reload) {
+
+ val call = mastodonApi.identityProofs(accountId)
+ call.enqueue(object : Callback> {
+ override fun onResponse(call: Call>,
+ response: Response>) {
+ val proofs = response.body()
+ if (response.isSuccessful && proofs != null ) {
+ identityProofData.postValue(proofs)
+ } else {
+ identityProofData.postValue(emptyList())
+ }
+ }
+
+ override fun onFailure(call: Call>, t: Throwable) {
+ Log.w(TAG, "failed obtaining identity proofs", t)
+ }
+ })
+
+ callList.add(call)
+ }
+ }
+
fun changeFollowState() {
val relationship = relationshipData.value?.data
if (relationship?.following == true || relationship?.requested == true) {
@@ -227,6 +260,7 @@ class AccountViewModel @Inject constructor(
return
accountId.let {
obtainAccount(isReload)
+ obtainIdentityProof()
if (!isSelf)
obtainRelationship(isReload)
}
diff --git a/app/src/main/java/net/accelf/yuito/QuickTootHelper.java b/app/src/main/java/net/accelf/yuito/QuickTootHelper.java
index d1ab5c127..976d4fae2 100644
--- a/app/src/main/java/net/accelf/yuito/QuickTootHelper.java
+++ b/app/src/main/java/net/accelf/yuito/QuickTootHelper.java
@@ -12,13 +12,13 @@ import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
-import com.keylesspalace.tusky.ComposeActivity;
import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.appstore.DrawerFooterClickedEvent;
import com.keylesspalace.tusky.appstore.Event;
import com.keylesspalace.tusky.appstore.EventHub;
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent;
import com.keylesspalace.tusky.appstore.QuickReplyEvent;
+import com.keylesspalace.tusky.components.compose.ComposeActivity;
import com.keylesspalace.tusky.db.AccountEntity;
import com.keylesspalace.tusky.db.AccountManager;
import com.keylesspalace.tusky.entity.Status;
@@ -28,8 +28,9 @@ import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
-import static com.keylesspalace.tusky.ComposeActivity.PREF_DEFAULT_TAG;
-import static com.keylesspalace.tusky.ComposeActivity.PREF_USE_DEFAULT_TAG;
+import static com.keylesspalace.tusky.components.compose.ComposeActivity.CAN_USE_UNLEAKABLE;
+import static com.keylesspalace.tusky.components.compose.ComposeActivity.PREF_DEFAULT_TAG;
+import static com.keylesspalace.tusky.components.compose.ComposeActivity.PREF_USE_DEFAULT_TAG;
public class QuickTootHelper {
@@ -74,8 +75,7 @@ public class QuickTootHelper {
public void composeButton() {
if (tootEditText.getText().length() == 0 && inReplyTo == null) {
- Intent composeIntent = new Intent(context, ComposeActivity.class);
- context.startActivity(composeIntent);
+ context.startActivity(getComposeIntent(context, true, false));
} else {
startComposeWithQuickComposeData();
}
@@ -107,43 +107,45 @@ public class QuickTootHelper {
}
private void startComposeWithQuickComposeData() {
- Intent composeIntent = setupIntentBuilder(false);
+ Intent intent = getComposeIntent(context, false, false);
resetQuickCompose();
- context.startActivity(composeIntent);
+ context.startActivity(intent);
}
private void quickToot() {
if (tootEditText.getText().toString().length() > 0) {
- Intent composeIntent = setupIntentBuilder(true);
+ Intent intent = getComposeIntent(context, false, true);
resetQuickCompose();
- context.startActivity(composeIntent);
+ context.startActivity(intent);
}
}
- private Intent setupIntentBuilder(boolean tootRightNow) {
- ComposeActivity.IntentBuilder intentBuilder = new ComposeActivity.IntentBuilder()
- .tootText(tootEditText.getText().toString())
- .visibility(getCurrentVisibility())
- .tootRightNow(tootRightNow);
+ private Intent getComposeIntent(Context context, boolean onlyVisibility, boolean tootRightNow) {
+ ComposeActivity.ComposeOptions options = new ComposeActivity.ComposeOptions();
+ options.setVisibility(getCurrentVisibility());
+ if (onlyVisibility) {
+ return ComposeActivity.startIntent(context, options);
+ }
+ options.setTootText(tootEditText.getText().toString());
+ options.setTootRightNow(tootRightNow);
- if (inReplyTo == null) {
- return intentBuilder.build(context);
+ if (inReplyTo != null) {
+ Status.Mention[] mentions = inReplyTo.getMentions();
+ Set mentionedUsernames = new LinkedHashSet<>();
+ mentionedUsernames.add(inReplyTo.getAccount().getUsername());
+ for (Status.Mention mention : mentions) {
+ mentionedUsernames.add(mention.getUsername());
+ }
+ mentionedUsernames.remove(loggedInUsername);
+
+ options.setInReplyToId(inReplyTo.getId());
+ options.setContentWarning(inReplyTo.getSpoilerText());
+ options.setMentionedUsernames(mentionedUsernames);
+ options.setReplyingStatusAuthor(inReplyTo.getAccount().getLocalUsername());
+ options.setReplyingStatusContent(inReplyTo.getContent().toString());
}
- Status.Mention[] mentions = inReplyTo.getMentions();
- Set mentionedUsernames = new LinkedHashSet<>();
- mentionedUsernames.add(inReplyTo.getAccount().getUsername());
- for (Status.Mention mention : mentions) {
- mentionedUsernames.add(mention.getUsername());
- }
- mentionedUsernames.remove(loggedInUsername);
-
- return intentBuilder.inReplyToId(inReplyTo.getId())
- .contentWarning(inReplyTo.getSpoilerText())
- .mentionedUsernames(mentionedUsernames)
- .replyingStatusAuthor(inReplyTo.getAccount().getLocalUsername())
- .replyingStatusContent(inReplyTo.getContent().toString())
- .build(context);
+ return ComposeActivity.startIntent(context, options);
}
private void resetQuickCompose() {
@@ -178,7 +180,7 @@ public class QuickTootHelper {
private Status.Visibility getCurrentVisibility() {
Status.Visibility visibility = Status.Visibility.byNum(defPrefs.getInt(PREF_CURRENT_VISIBILITY, Status.Visibility.PUBLIC.getNum()));
- if (!Arrays.asList(ComposeActivity.CAN_USE_UNLEAKABLE)
+ if (!Arrays.asList(CAN_USE_UNLEAKABLE)
.contains(domain) && visibility == Status.Visibility.UNLEAKABLE) {
defPrefs.edit()
.putInt(PREF_CURRENT_VISIBILITY, Status.Visibility.PUBLIC.getNum())
@@ -217,8 +219,7 @@ public class QuickTootHelper {
visibility = Status.Visibility.PRIVATE;
break;
case PRIVATE:
- if (Arrays.asList(ComposeActivity.CAN_USE_UNLEAKABLE)
- .contains(domain)) {
+ if (Arrays.asList(CAN_USE_UNLEAKABLE).contains(domain)) {
visibility = Status.Visibility.UNLEAKABLE;
} else {
visibility = Status.Visibility.PUBLIC;
diff --git a/app/src/main/res/layout/activity_compose.xml b/app/src/main/res/layout/activity_compose.xml
index a4be93bd3..e6ca45628 100644
--- a/app/src/main/res/layout/activity_compose.xml
+++ b/app/src/main/res/layout/activity_compose.xml
@@ -2,7 +2,7 @@
@@ -30,10 +30,9 @@
android:layout_gravity="end"
android:padding="8dp"
android:text="@string/at_symbol"
- android:textStyle="bold"
android:textColor="?android:textColorTertiary"
android:textSize="?attr/status_text_large"
- />
+ android:textStyle="bold" />
+ android:textStyle="bold" />
-
-
-
-
-
-
-
-
-
-
+ android:scrollbars="none" />
+
@@ -178,7 +170,7 @@
android:paddingBottom="52dp" >
@@ -214,7 +206,7 @@
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
-
-
+ app:srcCompat="@drawable/ic_cw_24dp" />
-
@@ -24,6 +26,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
android:layout_weight="1"
android:drawablePadding="12dp"
android:textColor="?android:attr/textColorSecondary"
@@ -32,10 +36,23 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/imageView"
app:layout_constraintTop_toTopOf="parent"
- app:layout_goneMarginBottom="16dp"
+ app:layout_goneMarginBottom="8dp"
tools:drawableStart="@drawable/ic_home_24dp"
tools:text="Home" />
+
+
-
diff --git a/app/src/main/res/layout/view_compose_schedule.xml b/app/src/main/res/layout/view_compose_schedule.xml
index dde00743d..98ef4f166 100644
--- a/app/src/main/res/layout/view_compose_schedule.xml
+++ b/app/src/main/res/layout/view_compose_schedule.xml
@@ -5,27 +5,28 @@
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_compose.xml b/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_compose.xml
deleted file mode 100644
index bcb8a0638..000000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_shortcut_compose.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 7c2597ad1..16af41f24 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -487,7 +487,6 @@
التبويقات المبَرمَجة
برمجة تبويق
صفّر
- اضغط هنا لضبط برمجة التبويق.
خطأ أثناء البحث عن منشور %s
الفواصل المرجعية
@@ -495,4 +494,6 @@
الفواصل المرجعية
مدعوم بِـ Tusky
أضيف إلى الفواصل المرجعية
+ اختر قائمة
+ القائمة
diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml
index 3af47d16f..a06c4cc92 100644
--- a/app/src/main/res/values-bn-rIN/strings.xml
+++ b/app/src/main/res/values-bn-rIN/strings.xml
@@ -508,7 +508,6 @@
নির্ধারিত টুটগুলি
নির্ধারিত টুট
রিসেট
- নির্ধারিত টুট কনফিগার করতে এখানে আলতো চাপুন।
টাস্কি দ্বারা চালিত
%s পোস্ট অনুসন্ধানে ত্রুটি
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 2b66cd7be..6635492d2 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -518,4 +518,18 @@
Afegeix una tria
Múltiples tries
Tria %d
-
+ Preferits
+ Toots programats
+ Preferit
+ Editar
+ Preferits
+ Toots programats
+ Programar el toot
+ Reiniciar
+ Desenvolupat per Tusky
+ Afegit a les adreces d\'interès
+ Seleccionar la llista
+ Llista
+ S\'ha produït un error en cercar la publicació %s
+
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 1d0fd5a3d..a00160a96 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -470,7 +470,6 @@
Plánované tooty
Naplánovat toot
Obnovit
- Klepnutím sem nastavíte plánovaný toot.
Vždy rozbalovat tooty označené varováními o obsahu
Celé slovo
Je-li klíčové slovo nebo fráze pouze alfanumerická, bude použita pouze, pokud odpovídá celému slovu
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 3dab97d04..11d2d4a4c 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -451,6 +451,5 @@
Geplante Beiträge
Plane Beitrag
Zurücksetzen
- Drücke hier, um den geplanten Beitrag zu konfigurieren.
Dies sind Zeitstempel für Status. Beispiele: \"16s\" oder \"2t\".
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 776cc95c2..5c2f9d91a 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -456,4 +456,18 @@
Elekton %d
Redaktigi
+Legosignoj
+ Planitaj mesaĝoj
+ Aldoni al legosignoj
+ Redakti
+ Legosignoj
+ Planitaj mesaĝoj
+ Plani mesaĝon
+ Restarigi
+ Funkciigita de Tusky
+ Aldonita al la legosignoj
+ Elekti la liston
+ Listo
+ Eraro dum elserĉo de la mesaĝo %s
+
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index b8dcc8e28..3c85c2870 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -465,7 +465,6 @@
Estados programados
Programar estado
Reiniciar
- Pulsa aquí para configurar un estado programado.
Error al buscar el post %s
Potenciado por Tusky
@@ -473,4 +472,6 @@
Favorito
Favoritos
Marcado como favorito
+ Seleccionar lista
+ Lista
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index b813f84e5..99f64ce18 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -311,7 +311,6 @@
%s ez dago ezkutatua
- Sakatu hemen programatutako tuta konfiguratzeko.
Tut hau ezabatu eta zirriborro berria egin\?
Ziur al zaude %s ezabatu nahi duzula\? Domeinu horretatik datorren edukia ez duzu denbora-lerro publikoetan edo jakinarazpenentan ikusiko. Domeinu horretan dituzun jarraitzaileak ezabatuko dira.
Domeinu osoa ezkutatu
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index fd18d7566..58f5f5fe4 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -460,7 +460,6 @@
بوقهای زمانبندیشده
زمانبندی بوق
بازنشانی
- برای پیکربندی بوق زمانبندیشده، اینجا را بزنید.
مطمئنید میخواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچیک از خط زمانیها یا در آگاهیهایتان نخواهید دید. پیروانتان از آن دامنه، برداشته خواهند شد.
هنگامی که کلیدواژه یا عبارت، فقط حروفعددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد
عبارت پالایش
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 7943a30fa..eef4e92f0 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -26,7 +26,7 @@
Messages directs
Onglets
Pouet
- Pouets
+ Messages
Pouets & réponses
Épinglés
Abonnements
@@ -170,8 +170,8 @@
Me notifier lorsque
on me mentionne
on me suit
- mes pouets sont boostés
- mes pouets sont mis en favoris
+ mes messages sont boostés
+ mes messages sont mis en favoris
Apparence
Thème de l’application
Fils chronologiques
@@ -472,12 +472,13 @@
Pouets planifiés
Planifier le pouet
Réinitialiser
- Appuyez ici pour configurer le pouet planifié.
- Erreur lors de la recherche du post %s
+ Erreur lors de la récupération du message %s
Propulsé par Tusky
- Signets
- Marquer comme signet
- Signets
- Marqué comme un signet
+ Marque-pages
+ Ajouter aux marque-pages
+ Marque-pages
+ Ajouté aux marque-pages
+ Sélectionner la liste
+ Liste
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 9b85ab5df..8b6ca2d23 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -470,7 +470,13 @@
Időzített tülkök
Tülk Időzítése
Visszaállítás
- Ide nyúlj az időzített tülkök beállításához.
Nem találjuk ezt a posztot %s
-
+Könyvjelzők
+ Könyvjelző
+ Könyvjelzők
+ Tusky által hatjva
+ Könyvjelzőzve
+ Lista kiválasztása
+ Lista
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index f2f8f77ce..885eea05e 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -325,9 +325,9 @@
Non fissare
Fissa
- - <b>%1$s</b> Mi piace
- - <b>%1$s</b> Mi piace
-
+ - %1$s Mi piace
+ - %1$s Mi piace
+
- <b>%s</b> Boost
- <b>%s</b> Boost
@@ -392,9 +392,9 @@
Domini nascosti
Domini nascosti
Silenzia %s
- %s
+ %s mostrati
- Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi
+ Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi.
Nascondi l\'intero dominio
Le votazioni sono finite
@@ -405,7 +405,76 @@
Parola intera
- Quando la parola chiave o la frase sono composte da caratteri alfanumerici, sara\' applicata solo se corrisponde alla parola completa
+ Quando la parola chiave o la frase sono composte da soli caratteri alfanumerici, sarà applicata solo se corrisponde alla parola completa
Insieme di emoji di Google
+ Segnalibri
+ Segnalibro
+ Modifica
+ Segnalibri
+ Aggiungi sondaggio
+ Fatto con Tusky
+ Espandi sempre i toot segnalati come contenuto sensibile
+ Messo nei segnalibri
+ Sondaggio con scelte: %1$s, %2$s, %3$s, %4$s; %5$s
+
+ Scegli lista
+ Lista
+ Azioni per l\'immagine %s
+
+ Un sondaggio che hai votato è terminato
+ Un sondaggio che hai creato è terminato
+
+
+ - %d giorno
+ - %d giorni
+
+
+ - %d ora
+ - %d ore
+
+
+ - %d minuto
+ - %d minuti
+
+
+ - %d secondo
+ - %d secondi
+
+
+ Continua
+ Indietro
+ Fatto
+ Inviato con successo @%s
+ Altri commenti
+ Inoltra a %s
+ Errore durante l\'invio
+ Errore durante lo scaricamento degli aggiornamenti
+ La segnalazione sarà inviata al moderatore del tuo server. Puoi spiegare perchè vuoi segnalare questo utente qui sotto:
+ L\'utente è su un altro server. Mandare una copia della segnalazione anche lì\?
+ Utenti
+ Errore durante la ricerca
+
+ Mostra il filtro delle notifiche
+
+
+ Sondaggio
+ 5 minuti
+ 30 minuti
+ 1 ora
+ 6 ore
+ 1 giorno
+ 3 giorni
+ 7 giorni
+ Aggiungi scelta
+ Scelte multiple
+ Scelta %d
+ Modifica
+ Errore nella ricerca del post %s
+
+Toot programmati
+ Toot programmati
+ Programma un toot
+ RIpristina
+ %1$s • %2$s
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
index 6ab982f7b..dc0f4a878 100644
--- a/app/src/main/res/values-night/styles.xml
+++ b/app/src/main/res/values-night/styles.xml
@@ -50,7 +50,7 @@
- @color/account_toolbar_icon_collapsed_dark
- @color/toolbar_icon_dark
- - @color/compose_media_button_disabled_dark
+ - @color/image_button_disabled_dark
- @drawable/border_background_dark
- @color/compose_reply_content_background_dark
diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml
index 179401859..2f48dcd9d 100644
--- a/app/src/main/res/values-no-rNB/strings.xml
+++ b/app/src/main/res/values-no-rNB/strings.xml
@@ -507,7 +507,6 @@
Planlagte toots
Planlegg toot
Tilbakestill
- Klikk her for å konfigurere planlagt toot.
Det oppsto en feil under henting av %s
Drevet av Tusky
@@ -515,4 +514,6 @@
Bokmerke
Bokmerker
Bokmerke lagt til
+ Velg liste
+ Liste
diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml
index 53fa232aa..20f531c1f 100644
--- a/app/src/main/res/values-oc/strings.xml
+++ b/app/src/main/res/values-oc/strings.xml
@@ -477,7 +477,6 @@
Tuts planificats
Planificar de tuts
Escafar
- Tocatz aquí per configurar los tuts planificats.
Error en cercant la publicacion %s
Propulsat per Tusky
@@ -485,4 +484,6 @@
Ajustar als marcapaginas
Marcapaginas
Ajustat als marcapaginas
+ Seleccionar la list
+ Lista
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 2c1d9c0c1..ca6a497ca 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -368,9 +368,9 @@
Przypnij do profilu
- - <b>%1$s</b> polubienie
- - <b>%1$s</b> polubienia
- - <b>%1$s</b> polubień
+ - <b>%1$s</b> polubienie
+ - <b>%1$s</b> polubienia
+ - <b>%1$s</b> polubień
@@ -484,7 +484,6 @@
Zaplanowane wpisy
Zaplanuj wpis
Resetuj
- Dotknij tutaj, żeby skonfigurować zaplanowany wpis.
Napędzane przez Tusky
Błąd przy wyszukiwaniu wpisu %s
@@ -492,4 +491,6 @@
Zakładka
Zakładki
Dodane do zakładek
+ Wybierz listę
+ Lista
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 7cd0662a4..634e5e2dc 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -191,9 +191,9 @@
Grande
Maior
- Novas Menções
+ Menções
Notificar sobre novas menções
- Novos Seguidores
+ Seguidores
Notificar sobre novos seguidores
Boosts
Notificar quando derem boost nos seus toots
@@ -342,7 +342,7 @@
Remover conta da lista
Descrever para deficientes visuais
-\n(limite de %d caracteres)
+\n(até %d caracteres)
CC-BY 4.0
CC-BY-SA 4.0
@@ -467,17 +467,18 @@
Opção %d
Editar
-Toots agendados
+Agendados
Editar
- Toots agendados
+ Agendados
Agendar toot
Cancelar
- Toque aqui para agendar
Erro ao pesquisar %s
Salvos
- Salvo
+ Salvar
Salvos
Desenvolvido por Tusky
Salvo
+ Selecionar lista
+ Lista
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 30d312dc0..a7cbd11d4 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -540,7 +540,13 @@
Отложенные записи
Отложить запись
Сброс
- Нажмите для выбора времени отправки.
Ошибка при поиске сообщения / ний
-
+Закладки
+ Добавить в закладки
+ Закладки
+ Под управлением Tusky
+ Добавлено в закладки
+ Выбрать список
+ Список
+
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index ba78d6824..cfd7e781b 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -521,7 +521,6 @@
Napovedani tuti
Ponastavi
Napovej tut
- Dotaknite se tukaj, da nastavite napovedan tut.
Napaka pri iskanju objave %s
Poganja ga Tusky
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 828c2e899..26b81361d 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -468,7 +468,6 @@
Schemalagda toots
Schemalägg toot
Återställ
- Knacka här för att konfigurera schemalagd toot.
Fel vid uppslagning av status %s
diff --git a/app/src/main/res/values-sw360dp/toot_button.xml b/app/src/main/res/values-sw380dp/toot_button.xml
similarity index 100%
rename from app/src/main/res/values-sw360dp/toot_button.xml
rename to app/src/main/res/values-sw380dp/toot_button.xml
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 496716f5a..15a27e043 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -50,7 +50,7 @@
Burada hiçbir şey yok.
Burada henüz hiçbir şey yok. Yenilemek için aşağıya çekin!
%s iletini yineledi
- %s iletini favorilerine ekledi
+ %s ileti favorilerine ekledi
%s seni takip etti
\@%s bildir
Daha fazla yorum?
@@ -294,8 +294,8 @@
- <b>%1$s</b> Favoriler
- - <b>%s</b> Yinelenen
- - <b>%s</b> Yinelenenler
+ - <b>%s</b> Yinelenen
+ - <b>%s</b> Yinelenenler
tarafından yinelendi
Tarafından favorilendi
@@ -425,4 +425,36 @@
Bahsedenler
#%d medyayı aç
+ Yer imleri
+ Zamanlanmış iletiler
+ Yerimi
+ Düzenle
+ Sil ve düzenle
+ Yer imleri
+ Anket ekle
+ Zamanlanmış iletiler
+ İleti zamanla
+ Sıfırla
+ Bu iletiyi silip yeniden düzenlemek istiyor musun\?
+ Botlar için gösterge göster
+ Tusky tarafından desteklenmektedir
+ Yerimine eklendi
+ Liste seç
+ Liste
+ Hesaplar
+ Arama başarısız
+
+ Anket
+ 5 dakika
+ 30 dakika
+ 1 saat
+ 6 saat
+ 1 gün
+ 3 gün
+ 7 gün
+ Seçenek ekle
+ Çoklu seçim
+ Düzenle
+ \@%s olarak yanıtla
+ Bot
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index f91fea547..bcccc59e6 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -33,7 +33,7 @@
-
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 92770f4cf..35a972cd2 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -26,7 +26,7 @@
#2f3441
#1a1c23
#ffffff
- #586173
+ #586173
#313543
#373c4b
#424a5b
@@ -54,7 +54,7 @@
#cfcfcf
#cfcfcf
#DE000000
- #a3a5ab
+ #a3a5ab
#EFEFEF
#ffffff
#e0e1e6
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 58a7b7c57..f436f1ba7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -168,7 +168,6 @@
Which instance?
What\'s happening?
- Tap here to configure scheduled toot.
Content warning
Display name
Bio
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 18ef8584c..b277eb8c2 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -108,7 +108,7 @@
- @color/toolbar_icon_light
- - @color/compose_media_button_disabled_light
+
- @color/image_button_disabled_light
- @drawable/border_background_light
-
diff --git a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt
index c8a06252f..a14ebcd10 100644
--- a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt
@@ -18,16 +18,21 @@ package com.keylesspalace.tusky
import android.text.SpannedString
import android.widget.EditText
-import com.keylesspalace.tusky.db.AccountEntity
-import com.keylesspalace.tusky.db.AccountManager
-import com.keylesspalace.tusky.db.AppDatabase
-import com.keylesspalace.tusky.db.InstanceDao
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.keylesspalace.tusky.components.compose.ComposeActivity
+import com.keylesspalace.tusky.components.compose.ComposeViewModel
+import com.keylesspalace.tusky.components.compose.DEFAULT_CHARACTER_LIMIT
+import com.keylesspalace.tusky.components.compose.MediaUploader
+import com.keylesspalace.tusky.db.*
+import com.keylesspalace.tusky.di.ViewModelFactory
import com.keylesspalace.tusky.entity.Account
-import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.entity.Instance
import com.keylesspalace.tusky.network.MastodonApi
-import okhttp3.Request
-import org.junit.Assert
+import com.keylesspalace.tusky.service.ServiceClient
+import com.keylesspalace.tusky.util.SaveTootHelper
+import com.nhaarman.mockitokotlin2.any
+import io.reactivex.Single
+import io.reactivex.SingleObserver
import org.junit.Assert.*
import org.junit.Before
import org.junit.Test
@@ -35,15 +40,8 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.robolectric.Robolectric
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import io.reactivex.Single
-import io.reactivex.SingleObserver
import org.robolectric.annotation.Config
import org.robolectric.fakes.RoboMenuItem
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
/**
* Created by charlag on 3/7/18.
@@ -52,14 +50,15 @@ import retrofit2.Response
@Config(application = FakeTuskyApplication::class, sdk = [28])
@RunWith(AndroidJUnit4::class)
class ComposeActivityTest {
-
private lateinit var activity: ComposeActivity
private lateinit var accountManagerMock: AccountManager
private lateinit var apiMock: MastodonApi
+ private val instanceDomain = "example.domain"
+
private val account = AccountEntity(
id = 1,
- domain = "example.token",
+ domain = instanceDomain,
accessToken = "token",
isActive = true,
accountId = "1",
@@ -83,30 +82,10 @@ class ComposeActivityTest {
activity = controller.get()
accountManagerMock = mock(AccountManager::class.java)
+ `when`(accountManagerMock.activeAccount).thenReturn(account)
apiMock = mock(MastodonApi::class.java)
- `when`(apiMock.getCustomEmojis()).thenReturn(object: Call
> {
- override fun isExecuted(): Boolean {
- return false
- }
- override fun clone(): Call> {
- throw Error("not implemented")
- }
- override fun isCanceled(): Boolean {
- throw Error("not implemented")
- }
- override fun cancel() {
- throw Error("not implemented")
- }
- override fun execute(): Response> {
- throw Error("not implemented")
- }
- override fun request(): Request {
- throw Error("not implemented")
- }
-
- override fun enqueue(callback: Callback>?) {}
- })
+ `when`(apiMock.getCustomEmojis()).thenReturn(Single.just(emptyList()))
`when`(apiMock.getInstance()).thenReturn(object: Single() {
override fun subscribeActual(observer: SingleObserver) {
val instance = instanceResponseCallback?.invoke()
@@ -119,15 +98,27 @@ class ComposeActivityTest {
})
val instanceDaoMock = mock(InstanceDao::class.java)
+ `when`(instanceDaoMock.loadMetadataForInstance(any())).thenReturn(
+ Single.just(InstanceEntity(instanceDomain, emptyList(),null, null, null, null))
+ )
+
val dbMock = mock(AppDatabase::class.java)
`when`(dbMock.instanceDao()).thenReturn(instanceDaoMock)
- activity.mastodonApi = apiMock
+ val viewModel = ComposeViewModel(
+ apiMock,
+ accountManagerMock,
+ mock(MediaUploader::class.java),
+ mock(ServiceClient::class.java),
+ mock(SaveTootHelper::class.java),
+ dbMock
+ )
+
+ val viewModelFactoryMock = mock(ViewModelFactory::class.java)
+ `when`(viewModelFactoryMock.create(ComposeViewModel::class.java)).thenReturn(viewModel)
+
activity.accountManager = accountManagerMock
- activity.database = dbMock
-
- `when`(accountManagerMock.activeAccount).thenReturn(account)
-
+ activity.viewModelFactory = viewModelFactoryMock
controller.create().start()
}
@@ -164,7 +155,7 @@ class ComposeActivityTest {
fun whenMaximumTootCharsIsNull_defaultLimitIsUsed() {
instanceResponseCallback = { getInstanceWithMaximumTootCharacters(null) }
setupActivity()
- assertEquals(ComposeActivity.STATUS_CHARACTER_LIMIT, activity.maximumTootCharacters)
+ assertEquals(DEFAULT_CHARACTER_LIMIT, activity.maximumTootCharacters)
}
@Test
@@ -196,7 +187,7 @@ class ComposeActivityTest {
val url = "https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM:"
val additionalContent = " Check out this @image #search result: "
insertSomeTextInContent(shortUrl + additionalContent + url)
- Assert.assertEquals(activity.calculateTextLength(), additionalContent.length + shortUrl.length + ComposeActivity.MAXIMUM_URL_LENGTH)
+ assertEquals(activity.calculateTextLength(), additionalContent.length + shortUrl.length + ComposeActivity.MAXIMUM_URL_LENGTH)
}
@Test
@@ -204,7 +195,7 @@ class ComposeActivityTest {
val url = "https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM:"
val additionalContent = " Check out this @image #search result: "
insertSomeTextInContent(url + additionalContent + url)
- Assert.assertEquals(activity.calculateTextLength(), additionalContent.length + (ComposeActivity.MAXIMUM_URL_LENGTH * 2))
+ assertEquals(activity.calculateTextLength(), additionalContent.length + (ComposeActivity.MAXIMUM_URL_LENGTH * 2))
}
private fun clickUp() {
@@ -256,13 +247,5 @@ class ComposeActivityTest {
)
}
- private fun getSuccessResponseCallbackWithMaximumTootCharacters(maximumTootCharacters: Int?): (Call?, Callback?) -> Unit
- {
- return {
- call: Call?, callback: Callback? ->
- if (call != null) {
- callback?.onResponse(call, Response.success(getInstanceWithMaximumTootCharacters(maximumTootCharacters)))
- }
- }
- }
-}
\ No newline at end of file
+}
+
diff --git a/app/src/test/java/com/keylesspalace/tusky/util/VersionUtilsTest.kt b/app/src/test/java/com/keylesspalace/tusky/util/VersionUtilsTest.kt
new file mode 100644
index 000000000..03ab3d947
--- /dev/null
+++ b/app/src/test/java/com/keylesspalace/tusky/util/VersionUtilsTest.kt
@@ -0,0 +1,36 @@
+package com.keylesspalace.tusky.util
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+class VersionUtilsTest(
+ private val versionString: String,
+ private val supportsScheduledToots: Boolean
+) {
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters
+ fun data() = listOf(
+ arrayOf("2.0.0", false),
+ arrayOf("2a9a0", false),
+ arrayOf("1.0", false),
+ arrayOf("error", false),
+ arrayOf("", false),
+ arrayOf("2.6.9", false),
+ arrayOf("2.7.0", true),
+ arrayOf("2.00008.0", true),
+ arrayOf("2.7.2 (compatible; Pleroma 1.0.0-1168-ge18c7866-pleroma-dot-site)", true),
+ arrayOf("3.0.1", true)
+ )
+ }
+
+ @Test
+ fun testVersionUtils() {
+ assertEquals(VersionUtils(versionString).supportsScheduledToots(), supportsScheduledToots)
+ }
+
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 265660c6f..9d9a324e0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,14 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.3.50'
+ ext.kotlin_version = '1.3.61'
repositories {
jcenter()
google()
}
dependencies {
- classpath 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta07'
- classpath 'com.android.tools.build:gradle:3.5.2'
+ classpath 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta08'
+ classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
diff --git a/fastlane/metadata/android/ca/changelogs/58.txt b/fastlane/metadata/android/ca/changelogs/58.txt
index 835551122..3e76f92f1 100644
--- a/fastlane/metadata/android/ca/changelogs/58.txt
+++ b/fastlane/metadata/android/ca/changelogs/58.txt
@@ -1,10 +1,9 @@
-670/5000
Tusky v6.0
- Els filtres de línia de temps s'han canviat a Preferències del compte i es sincronitzaran amb el servidor
- Ara podeu tenir un hashtag personalitzat com a pestanya a la interfície principal
- Ara es poden editar llistes
-- Seguretat: es va suprimir el suport per a TLS 1.0 i TLS 1.1, i es va afegir suport per a TLS 1.3 a Android 6+
+- Seguretat: es va suprimir el suport per a TLS 1.0 i TLS 1.1 i es va afegir suport per a TLS 1.3 a Android 6+
- La vista de redacció ara suggerirà emojis personalitzats en començar a escriure
- Configuració nova del tema "seguir el tema del sistema"
-- Mil
+- Millora de l’
diff --git a/fastlane/metadata/android/ca/changelogs/67.txt b/fastlane/metadata/android/ca/changelogs/67.txt
new file mode 100644
index 000000000..6b039ef73
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/67.txt
@@ -0,0 +1,9 @@
+Tusky v9.0
+
+- Ara podeu crear enquestes a partir de Tusky
+- Millora de la cerca
+- Nova opció a Preferències del compte per ampliar sempre els avisos de contingut
+- Els avatars del calaix de navegació tenen ara una forma quadrada arrodonida
+- Ara és possible informar als usuaris fins i tot quan mai no han publicat un estat
+- Ara Tusky es negarà a connectar-se a connexions de text clar a Android 6+
+- Un munt d’altres petites millores i solucions d’errors
diff --git a/fastlane/metadata/android/ca/changelogs/68.txt b/fastlane/metadata/android/ca/changelogs/68.txt
new file mode 100644
index 000000000..81ca68dc9
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/68.txt
@@ -0,0 +1,3 @@
+Tusky v9.1
+
+Aquesta versió garanteix la compatibilitat amb Mastodon 3 i millora el rendiment i l'estabilitat.
diff --git a/fastlane/metadata/android/it/changelogs/58.txt b/fastlane/metadata/android/it/changelogs/58.txt
new file mode 100644
index 000000000..08c03baac
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/58.txt
@@ -0,0 +1,8 @@
+Tusky v6.0
+
+- I filtri della timeline sono stati spostati in Preferenze Utente e si sincronizzeranno con il server
+- Ora è possibile avere un hashtag personalizzato come scheda nell'interfaccia principale
+- Le liste possono ora essere modificate
+- Sicurezza: rimosso il supporto per TLS 1.0 e TLS 1.1.1, e aggiunto il supporto per TLS 1.3 su Android 6+.
+- La vista della composizione suggerirà ora le emojis personalizzate quando si inizia a digitare
+- Nuova impostazione del tema "Segui il tema del
diff --git a/fastlane/metadata/android/it/changelogs/61.txt b/fastlane/metadata/android/it/changelogs/61.txt
new file mode 100644
index 000000000..748d37919
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/61.txt
@@ -0,0 +1,7 @@
+Tusky v7.0
+
+- Supporto per la visualizzazione di sondaggi, voti e relative notifiche
+- Nuovi bottoni per filtrare le notifiche ed eliminarle tutte
+- Cancella e riscrivi i tuoi toots
+- Nuovo indicatore che mostra sull'immagine del profilo se un account è un bot (può essere disattivato nelle preferenze)
+- Nuove traduzioni: Norvegese Bokmål e sloveno.
diff --git a/fastlane/metadata/android/it/changelogs/67.txt b/fastlane/metadata/android/it/changelogs/67.txt
new file mode 100644
index 000000000..3ee9dcc19
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/67.txt
@@ -0,0 +1,9 @@
+Tusky v9.0
+
+- Si possono creare sondaggi da Tusky
+- Ricerca migliorata
+- Nuova opzione nelle preferenze utente per espandere sempre i contenuti sensibili
+- Le icone di navigazione hanno ora una forma quadrata arrotondata
+- È ora possibile segnalare gli utenti anche prima che pubblichino nulla
+- Tusky ora si rifiuterà di connettersi attraverso connessioni non cifrate su Android 6+
+- Molti altri piccoli miglioramenti e correzioni di errori
diff --git a/fastlane/metadata/android/it/changelogs/68.txt b/fastlane/metadata/android/it/changelogs/68.txt
new file mode 100644
index 000000000..645fb39c4
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/68.txt
@@ -0,0 +1,3 @@
+Tusky v9.1
+
+Questa versione è compatibile con Mastodon 3 e migliora prestazioni e stabilità.
diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it/full_description.txt
new file mode 100644
index 000000000..a123d9538
--- /dev/null
+++ b/fastlane/metadata/android/it/full_description.txt
@@ -0,0 +1,12 @@
+Tusky è un client leggero per Mastodon, un server gratuito e open-source per social network.
+
+• "Material Design"
+• Implementa la maggior parte delle API di Mastodon
+• Supporta più utenti simultanei
+• Temi scuro e chiaro con possibilità di transizione automatica in base all'ora del giorno
+• Bozze - per comporre i toots e conservarli per dopo
+• Scelta tra diversi stili di emoji
+• Ottimizzato per tutte le dimensioni di schermo
+• Completamente open-source - nessuna dipendenza non libera es. servizi Google
+
+Per saperne di più su Mastodon, visita https://joinmastodon.org/
diff --git a/fastlane/metadata/android/it/short_description.txt b/fastlane/metadata/android/it/short_description.txt
new file mode 100644
index 000000000..06089da00
--- /dev/null
+++ b/fastlane/metadata/android/it/short_description.txt
@@ -0,0 +1 @@
+Un client multi-utente per il social network Mastodon
diff --git a/fastlane/metadata/android/it/title.txt b/fastlane/metadata/android/it/title.txt
new file mode 100644
index 000000000..0238ffc0a
--- /dev/null
+++ b/fastlane/metadata/android/it/title.txt
@@ -0,0 +1 @@
+Tusky
diff --git a/fastlane/metadata/android/tr/changelogs/61.txt b/fastlane/metadata/android/tr/changelogs/61.txt
new file mode 100644
index 000000000..dc9c4fb04
--- /dev/null
+++ b/fastlane/metadata/android/tr/changelogs/61.txt
@@ -0,0 +1,7 @@
+Tusky v7.0
+
+- Anket, oylama ve anket bildirimlerini görüntüleme desteği
+- Bildirim sekmesini filtrelemek ve tüm bildirimleri silmek için yeni düğmeler
+- Kendi iletilerini sil ve yeniden tasarla
+- Bir hesabın profil resminde bot olup olmadığını gösteren yeni gösterge (tercihlerden kapatılabilir)
+- Yeni çeviriler: Norveççe Bokmål ve Slovence.
diff --git a/fastlane/metadata/android/tr/changelogs/67.txt b/fastlane/metadata/android/tr/changelogs/67.txt
new file mode 100644
index 000000000..4816d6035
--- /dev/null
+++ b/fastlane/metadata/android/tr/changelogs/67.txt
@@ -0,0 +1,9 @@
+Tusky v9.0
+
+- Artık Tusky'den Anket oluşturabilirsiniz
+- Geliştirilmiş arama
+- İçerik tercihlerini her zaman genişletmek için Hesap Tercihlerinde yeni seçenek
+- Navigasyon çekmecesindeki avatarlar artık yuvarlatılmış kare şeklinde
+- Artık kullanıcıları hiç durum bildirmemiş olsalar bile bildirmek mümkün.
+- Tusky şimdi Android 6+ üzerindeki cleartext bağlantılarına bağlanmayı reddedecek
+- Diğer bir sürü küçük iyileştirme ve hata düzeltmeleri
diff --git a/fastlane/metadata/android/tr/changelogs/68.txt b/fastlane/metadata/android/tr/changelogs/68.txt
new file mode 100644
index 000000000..05b1f9147
--- /dev/null
+++ b/fastlane/metadata/android/tr/changelogs/68.txt
@@ -0,0 +1,3 @@
+Tusky v9.1
+
+Bu sürüm Mastodon 3 ile uyumluluğu sağlar, performansı ve kararlılığı arttırır.
diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt
new file mode 100644
index 000000000..d741acbd6
--- /dev/null
+++ b/fastlane/metadata/android/tr/full_description.txt
@@ -0,0 +1,12 @@
+Tusky, ücretsiz ve açık kaynaklı bir sosyal ağ sunucusu olan Mastodon için hafif bir istemcidir.
+
+• Materyal Tasarım
+• Çoğu Mastodon API'si uygulandı
+• Çoklu Hesap desteği
+• Gün içinde karanlık ve aydınlık tema arasında otomatik geçiş imkanı
+• Taslak - ileti oluşturun ve daha sonra kullanmak üzere saklayın
+• Farklı emoji stilleri arasında seçim yapma imkanı
+• Tüm ekran boyutları için optimize edilmiş arayüz
+• Tamamen açık kaynak - Google hizmet servisi gibi özgür olmayan bağımlılıklar yok
+
+Mastodon hakkında daha fazla bilgi edinmek için https://joinmastodon.org/ adresini ziyaret edin
diff --git a/fastlane/metadata/android/tr/short_description.txt b/fastlane/metadata/android/tr/short_description.txt
new file mode 100644
index 000000000..17a83c133
--- /dev/null
+++ b/fastlane/metadata/android/tr/short_description.txt
@@ -0,0 +1 @@
+Mastodon için çoklu hesap istemcisi
diff --git a/fastlane/metadata/android/tr/title.txt b/fastlane/metadata/android/tr/title.txt
new file mode 100644
index 000000000..0238ffc0a
--- /dev/null
+++ b/fastlane/metadata/android/tr/title.txt
@@ -0,0 +1 @@
+Tusky
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index ee69dd68d..1ba7206f8 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists