Эх сурвалжийг харах

Merge pull request #1215 from nextcloud/bugfix/noid/add-server-version-warning

Add a warning when the server version is (almost) EOL
Andy Scherzinger 4 жил өмнө
parent
commit
067af733c3

+ 49 - 0
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();

+ 24 - 0
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))

+ 10 - 0
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 {

+ 5 - 0
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();

+ 42 - 3
app/src/main/res/layout/controller_settings.xml

@@ -22,6 +22,7 @@
 
 <com.yarolegovich.mp.MaterialPreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:apc="http://schemas.android.com/apk/res-auto"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/settings_screen"
     android:layout_width="match_parent"
@@ -71,7 +72,46 @@
                 android:layout_centerHorizontal="true"
                 android:layout_margin="4dp"
                 android:textColor="@color/medium_emphasis_text"
-                tools:text="jane@nextcloud.com" />
+                tools:text="nextcloud.com" />
+
+            <com.google.android.material.card.MaterialCardView
+                android:id="@+id/server_age_warning_text_card"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/base_url_text"
+                android:layout_margin="@dimen/standard_margin"
+                app:cardCornerRadius="8dp"
+                app:cardElevation="2dp"
+                app:strokeWidth="0dp">
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:padding="@dimen/standard_padding">
+
+                    <ImageView
+                        android:id="@+id/server_age_warning_icon"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/ic_warning_white"
+                        android:layout_centerVertical="true"
+                        app:tint="@color/nc_darkRed"
+                        android:contentDescription="@string/nc_settings_warning" />
+
+                    <TextView
+                        android:id="@+id/server_age_warning_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toEndOf="@id/server_age_warning_icon"
+                        android:paddingStart="@dimen/standard_padding"
+                        android:paddingEnd="0dp"
+                        android:layout_centerHorizontal="true"
+                        android:textColor="@color/nc_darkRed"
+                        tools:text="@string/nc_settings_server_almost_eol" />
+
+                </RelativeLayout>
+
+            </com.google.android.material.card.MaterialCardView>
 
             <com.facebook.drawee.view.SimpleDraweeView
                 android:id="@+id/avatar_image"
@@ -82,12 +122,11 @@
                 apc:roundAsCircle="true"
                 tools:src="@tools:sample/avatars[0]" />
 
-
             <com.yarolegovich.mp.MaterialStandardPreference
                 android:id="@+id/settings_switch"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_below="@id/base_url_text"
+                android:layout_below="@id/server_age_warning_text_card"
                 android:tag="switchAccountButton"
                 apc:mp_title="@string/nc_settings_switch_account" />
 

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -50,6 +50,7 @@
     <color name="conversation_unread_bubble_text">#222222</color>
 
     <color name="nc_darkRed">#D32F2F</color>
+    <color name="nc_darkYellow">#FF9800</color>
     <color name="nc_darkGreen">#006400</color>
     <color name="controller_chat_separator">#E8E8E8</color>
     <color name="grey_600">#757575</color>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -85,6 +85,10 @@
     <string name="nc_settings_remove_confirmation">Please confirm your intent to remove the current account.</string>
     <string name="nc_settings_remove_account">Remove account</string>
     <string name="nc_settings_add_account">Add a new account</string>
+    <string name="nc_settings_server_eol_title">Unsupported server</string>
+    <string name="nc_settings_server_eol">The server version is too old and not supported by this version of the Android app</string>
+    <string name="nc_settings_server_almost_eol">The server version is very old and will not be supported in the next release!</string>
+    <string name="nc_settings_warning">Warning</string>
     <string name="nc_add">Add</string>
     <string name="nc_settings_wrong_account">Only current account can be reauthorized</string>
     <string name="nc_settings_no_talk_installed">Talk app is not installed on the server you tried to authenticate against</string>

+ 1 - 1
scripts/analysis/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 3 errors and 346 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 3 errors and 348 warnings</span>