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