diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java
index 95b7e665d..2fb61a98e 100644
--- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java
+++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java
@@ -270,6 +270,11 @@ public class ConversationsListController extends BaseController implements Searc
currentUser = userUtils.getCurrentUser();
if (currentUser != null) {
+ if (currentUser.isServerEOL()) {
+ showServerEOLDialog();
+ return;
+ }
+
credentials = ApiUtils.getCredentials(currentUser.getUsername(), currentUser.getToken());
shouldUseLastMessageLayout = currentUser.hasSpreedFeatureCapability("last-room-activity");
if (getActivity() != null && getActivity() instanceof MainActivity) {
@@ -863,6 +868,50 @@ public class ConversationsListController extends BaseController implements Searc
}
}
+ private void showServerEOLDialog() {
+ new LovelyStandardDialog(getActivity(), LovelyStandardDialog.ButtonLayout.HORIZONTAL)
+ .setTopColorRes(R.color.nc_darkRed)
+ .setIcon(DisplayUtils.getTintedDrawable(context.getResources(),
+ R.drawable.ic_warning_white,
+ R.color.bg_default))
+ .setPositiveButtonColor(context.getResources().getColor(R.color.nc_darkRed))
+ .setCancelable(false)
+ .setTitle(R.string.nc_settings_server_eol_title)
+ .setMessage(R.string.nc_settings_server_eol)
+ .setPositiveButton(R.string.nc_settings_remove_account, new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ boolean otherUserExists = userUtils.scheduleUserForDeletionWithId(currentUser.getId());
+
+ OneTimeWorkRequest accountRemovalWork = new OneTimeWorkRequest.Builder(AccountRemovalWorker.class).build();
+ WorkManager.getInstance().enqueue(accountRemovalWork);
+
+ if (otherUserExists && getView() != null) {
+ onViewBound(getView());
+ onAttach(getView());
+ } else if (!otherUserExists) {
+ getRouter().setRoot(RouterTransaction.with(
+ new ServerSelectionController())
+ .pushChangeHandler(new VerticalChangeHandler())
+ .popChangeHandler(new VerticalChangeHandler()));
+ }
+ }
+ })
+ .setNegativeButton(R.string.nc_cancel, new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (userUtils.hasMultipleUsers()) {
+ getRouter().pushController(RouterTransaction.with(new SwitchAccountController()));
+ } else {
+ getActivity().finishAffinity();
+ getActivity().finish();
+ }
+ }
+ })
+ .setInstanceStateHandler(ID_DELETE_CONVERSATION_DIALOG, saveStateHandler)
+ .show();
+ }
+
private void deleteConversation(Data data) {
OneTimeWorkRequest deleteConversationWorker =
new OneTimeWorkRequest.Builder(DeleteConversationWorker.class).setInputData(data).build();
diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java
index 12e9fb678..3af9b8cd8 100644
--- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java
+++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java
@@ -29,6 +29,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -45,6 +46,7 @@ import android.view.WindowManager;
import android.widget.Button;
import android.widget.Checkable;
import android.widget.EditText;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -56,6 +58,7 @@ import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
import com.bluelinelabs.logansquare.LoganSquare;
import com.facebook.drawee.view.SimpleDraweeView;
+import com.google.android.material.card.MaterialCardView;
import com.google.android.material.textfield.TextInputLayout;
import com.nextcloud.talk.BuildConfig;
import com.nextcloud.talk.R;
@@ -103,6 +106,7 @@ import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.emoji.widget.EmojiTextView;
import androidx.work.OneTimeWorkRequest;
@@ -144,6 +148,12 @@ public class SettingsController extends BaseController {
EmojiTextView displayNameTextView;
@BindView(R.id.base_url_text)
TextView baseUrlTextView;
+ @BindView(R.id.server_age_warning_text_card)
+ MaterialCardView serverAgeCardView;
+ @BindView(R.id.server_age_warning_text)
+ TextView serverAgeTextView;
+ @BindView(R.id.server_age_warning_icon)
+ ImageView serverAgeIcon;
@BindView(R.id.settings_call_sound)
MaterialStandardPreference settingsCallSound;
@BindView(R.id.settings_message_sound)
@@ -551,6 +561,20 @@ public class SettingsController extends BaseController {
baseUrlTextView.setText(Uri.parse(currentUser.getBaseUrl()).getHost());
+ if (currentUser.isServerEOL()) {
+ serverAgeTextView.setTextColor(ContextCompat.getColor(context, R.color.nc_darkRed));
+ serverAgeTextView.setText(R.string.nc_settings_server_eol);
+ serverAgeIcon.setColorFilter(ContextCompat.getColor(context, R.color.nc_darkRed),
+ PorterDuff.Mode.SRC_IN);
+ } else if (currentUser.isServerAlmostEOL()) {
+ serverAgeTextView.setTextColor(ContextCompat.getColor(context, R.color.nc_darkYellow));
+ serverAgeTextView.setText(R.string.nc_settings_server_almost_eol);
+ serverAgeIcon.setColorFilter(ContextCompat.getColor(context, R.color.nc_darkYellow),
+ PorterDuff.Mode.SRC_IN);
+ } else {
+ serverAgeCardView.setVisibility(View.GONE);
+ }
+
reauthorizeButton.addPreferenceClickListener(view14 -> {
getRouter().pushController(RouterTransaction.with(
new WebViewLoginController(currentUser.getBaseUrl(), true))
diff --git a/app/src/main/java/com/nextcloud/talk/models/database/User.java b/app/src/main/java/com/nextcloud/talk/models/database/User.java
index 1d02b0e9a..7e599f782 100644
--- a/app/src/main/java/com/nextcloud/talk/models/database/User.java
+++ b/app/src/main/java/com/nextcloud/talk/models/database/User.java
@@ -92,6 +92,16 @@ public interface User extends Parcelable, Persistable, Serializable {
return false;
}
+ default boolean isServerEOL() {
+ // Capability is available since Talk 4 => Nextcloud 14 => Autmn 2018
+ return !hasSpreedFeatureCapability("no-ping");
+ }
+
+ default boolean isServerAlmostEOL() {
+ // Capability is available since Talk 8 => Nextcloud 18 => January 2020
+ return !hasSpreedFeatureCapability("chat-replies");
+ }
+
default boolean hasSpreedFeatureCapability(String capabilityName) {
if (getCapabilities() != null) {
try {
diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java
index 6871a740a..cf3458353 100644
--- a/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java
+++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/UserUtils.java
@@ -48,6 +48,11 @@ public class UserUtils {
.limit(1).get().value() > 0);
}
+ public boolean hasMultipleUsers() {
+ return (dataStore.count(User.class).where(UserEntity.SCHEDULED_FOR_DELETION.notEqual(Boolean.TRUE))
+ .get().value() > 1);
+ }
+
public List getUsers() {
Result findUsersQueryResult = dataStore.select(User.class).where
(UserEntity.SCHEDULED_FOR_DELETION.notEqual(true)).get();
diff --git a/app/src/main/res/layout/controller_settings.xml b/app/src/main/res/layout/controller_settings.xml
index f49e4492a..d459ef2f0 100644
--- a/app/src/main/res/layout/controller_settings.xml
+++ b/app/src/main/res/layout/controller_settings.xml
@@ -22,6 +22,7 @@
+ tools:text="nextcloud.com" />
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index f847fe189..c1ad8456c 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -50,6 +50,7 @@
#222222
#D32F2F
+ #FF9800
#006400
#E8E8E8
#757575
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index edfb50d7a..54aa13108 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -85,6 +85,10 @@
Please confirm your intent to remove the current account.
Remove account
Add a new account
+ Unsupported server
+ The server version is too old and not supported by this version of the Android app
+ The server version is very old and will not be supported in the next release!
+ Warning
Add
Only current account can be reauthorized
Talk app is not installed on the server you tried to authenticate against
diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt
index 83c84a5b9..21a6df58f 100644
--- a/scripts/analysis/lint-results.txt
+++ b/scripts/analysis/lint-results.txt
@@ -1,2 +1,2 @@
DO NOT TOUCH; GENERATED BY DRONE
- Lint Report: 3 errors and 346 warnings
+ Lint Report: 3 errors and 348 warnings