Browse Source

wip

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 4 years ago
parent
commit
dcc246fd58

+ 15 - 1
src/androidTest/java/com/owncloud/android/datamodel/FileDataStorageManagerTest.java

@@ -31,6 +31,8 @@ import com.owncloud.android.lib.resources.files.CreateFolderRemoteOperation;
 import com.owncloud.android.lib.resources.files.SearchRemoteOperation;
 import com.owncloud.android.lib.resources.files.UploadFileRemoteOperation;
 import com.owncloud.android.lib.resources.files.model.RemoteFile;
+import com.owncloud.android.lib.resources.status.CapabilityBooleanType;
+import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.operations.RefreshFolderOperation;
 import com.owncloud.android.utils.FileStorageUtils;
 
@@ -240,11 +242,23 @@ abstract public class FileDataStorageManagerTest extends AbstractOnServerIT {
     }
 
     @Test(expected = IllegalArgumentException.class)
-    public void testSaveNewFile_NonexistingParent() {
+    public void testSaveNewFile_NonExistingParent() {
         assertTrue(new CreateFolderRemoteOperation("/1/1/", true).execute(client).isSuccess());
 
         OCFile newFile = new OCFile("/1/1/1.txt");
 
         sut.saveNewFile(newFile);
     }
+
+    @Test
+    public void testOCCapability() {
+        OCCapability capability = new OCCapability();
+        capability.setUserStatus(CapabilityBooleanType.TRUE);
+
+        sut.saveCapabilities(capability);
+
+        OCCapability newCapability = sut.getCapability(user);
+
+        assertEquals(capability.getUserStatus(), newCapability.getUserStatus());
+    }
 }

+ 49 - 0
src/androidTest/java/com/owncloud/android/datamodel/OCCapabilityIT.kt

@@ -0,0 +1,49 @@
+/*
+ *
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2020 Tobias Kaminsky
+ * Copyright (C) 2020 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package com.owncloud.android.datamodel
+
+import com.owncloud.android.AbstractIT
+import com.owncloud.android.lib.resources.status.CapabilityBooleanType
+import com.owncloud.android.lib.resources.status.OCCapability
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class OCCapabilityIT : AbstractIT() {
+    @Test
+    fun saveCapability() {
+        val fileDataStorageManager = FileDataStorageManager(account, targetContext.contentResolver)
+
+        val capability = OCCapability()
+        capability.etag = "123"
+        capability.userStatus = CapabilityBooleanType.TRUE
+        capability.userStatusSupportsEmoji = CapabilityBooleanType.TRUE
+
+        fileDataStorageManager.saveCapabilities(capability)
+
+        val newCapability = fileDataStorageManager.getCapability(account.name)
+
+        assertEquals(capability.etag, newCapability.etag)
+        assertEquals(capability.userStatus, newCapability.userStatus)
+        assertEquals(capability.userStatusSupportsEmoji, newCapability.userStatusSupportsEmoji)
+    }
+}

+ 43 - 3
src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java

@@ -36,9 +36,12 @@ import com.nextcloud.client.account.Server;
 import com.nextcloud.ui.ChooseAccountDialogFragment;
 import com.owncloud.android.AbstractIT;
 import com.owncloud.android.MainApp;
+import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.accounts.AccountUtils;
+import com.owncloud.android.lib.resources.status.CapabilityBooleanType;
+import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.utils.ScreenshotTest;
@@ -131,7 +134,7 @@ public class DialogFragmentIT extends AbstractIT {
     @ScreenshotTest
     public void testAccountChooserDialog() throws AccountUtils.AccountNotFoundException {
         AccountManager accountManager = AccountManager.get(targetContext);
-        for (Account account : accountManager.getAccounts()) {
+        for (Account account : accountManager.getAccountsByType(MainApp.getAccountType(targetContext))) {
             accountManager.removeAccountExplicitly(account);
         }
 
@@ -145,13 +148,50 @@ public class DialogFragmentIT extends AbstractIT {
         accountManager.addAccountExplicitly(newAccount2, "password", null);
         accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_OC_BASE_URL, "https://server.com");
         accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_USER_ID, "user1");
-        accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_OC_VERSION, "19.0.0.0");
+        accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_OC_VERSION, "20.0.0");
+
+        FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(newAccount,
+                                                                                   targetContext.getContentResolver());
+
+        OCCapability capability = new OCCapability();
+        capability.setUserStatus(CapabilityBooleanType.TRUE);
+        capability.setUserStatusSupportsEmoji(CapabilityBooleanType.TRUE);
+        fileDataStorageManager.saveCapabilities(capability);
+
+        ChooseAccountDialogFragment sut =
+            ChooseAccountDialogFragment.newInstance(new RegisteredUser(newAccount,
+                                                                       new OwnCloudAccount(newAccount, targetContext),
+                                                                       new Server(URI.create("https://server.com"),
+                                                                                  OwnCloudVersion.nextcloud_20)));
+        showDialog(sut);
+    }
+
+    @Test
+    @ScreenshotTest
+    public void testAccountChooserDialogWithStatusDisabled() throws AccountUtils.AccountNotFoundException {
+        AccountManager accountManager = AccountManager.get(targetContext);
+        for (Account account : accountManager.getAccounts()) {
+            accountManager.removeAccountExplicitly(account);
+        }
+
+        Account newAccount = new Account("test@https://server.com", MainApp.getAccountType(targetContext));
+        accountManager.addAccountExplicitly(newAccount, "password", null);
+        accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_OC_BASE_URL, "https://server.com");
+        accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_USER_ID, "test");
+
+        FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(newAccount,
+                                                                                   targetContext.getContentResolver());
+
+        OCCapability capability = new OCCapability();
+        capability.setUserStatus(CapabilityBooleanType.FALSE);
+
+        fileDataStorageManager.saveCapabilities(capability);
 
         ChooseAccountDialogFragment sut =
             ChooseAccountDialogFragment.newInstance(new RegisteredUser(newAccount,
                                                                        new OwnCloudAccount(newAccount, targetContext),
                                                                        new Server(URI.create("https://server.com"),
-                                                                                  OwnCloudVersion.nextcloud_19)));
+                                                                                  OwnCloudVersion.nextcloud_20)));
         showDialog(sut);
     }
 

+ 16 - 0
src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt

@@ -34,6 +34,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.nextcloud.client.account.User
 import com.nextcloud.client.account.UserAccountManager
 import com.owncloud.android.R
+import com.owncloud.android.datamodel.FileDataStorageManager
+import com.owncloud.android.lib.resources.users.Status
+import com.owncloud.android.lib.resources.users.StatusType
 import com.owncloud.android.ui.activity.BaseActivity
 import com.owncloud.android.ui.activity.DrawerActivity
 import com.owncloud.android.ui.adapter.UserListAdapter
@@ -116,6 +119,19 @@ class ChooseAccountDialogFragment : DialogFragment(), AvatarGenerationListener,
             manage_accounts.setOnClickListener {
                 (activity as DrawerActivity).openManageAccounts()
             }
+
+            val capability = FileDataStorageManager(user.toPlatformAccount(), context?.contentResolver)
+                .getCapability(user)
+
+            if (capability.userStatus.isTrue) {
+                statusView.visibility = View.VISIBLE
+            }
+
+            val status = Status(StatusType.dnd, "Do not disturb", "", -1)
+
+            if (status) {
+                ticker.
+            }
         }
     }
 

+ 12 - 0
src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

@@ -38,6 +38,7 @@ import android.text.TextUtils;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonSyntaxException;
+import com.nextcloud.client.account.User;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
 import com.owncloud.android.lib.common.network.WebdavEntry;
@@ -2061,6 +2062,9 @@ public class FileDataStorageManager {
         contentValues.put(ProviderTableMeta.CAPABILITIES_DIRECT_EDITING_ETAG,
                           capability.getDirectEditingEtag());
         contentValues.put(ProviderTableMeta.CAPABILITIES_ETAG, capability.getEtag());
+        contentValues.put(ProviderTableMeta.CAPABILITIES_USER_STATUS, capability.getUserStatus().getValue());
+        contentValues.put(ProviderTableMeta.CAPABILITIES_USER_STATUS_SUPPORTS_EMOJI,
+                          capability.getUserStatusSupportsEmoji().getValue());
 
         return contentValues;
     }
@@ -2100,6 +2104,11 @@ public class FileDataStorageManager {
         return cursor;
     }
 
+    @NonNull
+    public OCCapability getCapability(User user) {
+        return getCapability(user.getAccountName());
+    }
+
     @NonNull
     public OCCapability getCapability(String accountName) {
         OCCapability capability;
@@ -2192,6 +2201,9 @@ public class FileDataStorageManager {
                                                              ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_PRODUCT_NAME));
             capability.setDirectEditingEtag(getString(cursor, ProviderTableMeta.CAPABILITIES_DIRECT_EDITING_ETAG));
             capability.setEtag(getString(cursor, ProviderTableMeta.CAPABILITIES_ETAG));
+            capability.setUserStatus(getBoolean(cursor, ProviderTableMeta.CAPABILITIES_USER_STATUS));
+            capability.setUserStatusSupportsEmoji(
+                getBoolean(cursor, ProviderTableMeta.CAPABILITIES_USER_STATUS_SUPPORTS_EMOJI));
         }
         return capability;
     }

+ 4 - 2
src/main/java/com/owncloud/android/db/ProviderMeta.java

@@ -35,7 +35,7 @@ import java.util.List;
  */
 public class ProviderMeta {
     public static final String DB_NAME = "filelist";
-    public static final int DB_VERSION = 59;
+    public static final int DB_VERSION = 60;
 
     private ProviderMeta() {
         // No instance
@@ -223,9 +223,11 @@ public class ProviderMeta {
         public static final String CAPABILITIES_RICHDOCUMENT_TEMPLATES = "richdocument_direct_templates";
         public static final String CAPABILITIES_RICHDOCUMENT_PRODUCT_NAME = "richdocument_product_name";
         public static final String CAPABILITIES_DEFAULT_SORT_ORDER = CAPABILITIES_ACCOUNT_NAME
-                + " collate nocase asc";
+            + " collate nocase asc";
         public static final String CAPABILITIES_DIRECT_EDITING_ETAG = "direct_editing_etag";
         public static final String CAPABILITIES_ETAG = "etag";
+        public static final String CAPABILITIES_USER_STATUS = "user_status";
+        public static final String CAPABILITIES_USER_STATUS_SUPPORTS_EMOJI = "user_status_supports_emoji";
 
         //Columns of Uploads table
         public static final String UPLOADS_LOCAL_PATH = "local_path";

+ 22 - 0
src/main/java/com/owncloud/android/providers/FileContentProvider.java

@@ -796,6 +796,8 @@ public class FileContentProvider extends ContentProvider {
                        + ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ASK_FOR_OPTIONAL_PASSWORD + INTEGER
                        + ProviderTableMeta.CAPABILITIES_RICHDOCUMENT_PRODUCT_NAME + TEXT
                        + ProviderTableMeta.CAPABILITIES_DIRECT_EDITING_ETAG + TEXT
+                       + ProviderTableMeta.CAPABILITIES_USER_STATUS + INTEGER
+                       + ProviderTableMeta.CAPABILITIES_USER_STATUS_SUPPORTS_EMOJI + INTEGER
                        + ProviderTableMeta.CAPABILITIES_ETAG + " TEXT );");
     }
 
@@ -2266,6 +2268,26 @@ public class FileContentProvider extends ContentProvider {
             if (!upgraded) {
                 Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion));
             }
+
+            if (oldVersion < 60 && newVersion >= 60) {
+                Log_OC.i(SQL, "Entering in the #60 add user status to capability table");
+                db.beginTransaction();
+                try {
+                    db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
+                                   ADD_COLUMN + ProviderTableMeta.CAPABILITIES_USER_STATUS + " INTEGER ");
+                    db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
+                                   ADD_COLUMN + ProviderTableMeta.CAPABILITIES_USER_STATUS_SUPPORTS_EMOJI + " INTEGER ");
+
+                    upgraded = true;
+                    db.setTransactionSuccessful();
+                } finally {
+                    db.endTransaction();
+                }
+            }
+
+            if (!upgraded) {
+                Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion));
+            }
         }
     }
 }

+ 21 - 3
src/main/res/layout/account_item.xml

@@ -61,7 +61,8 @@
                 android:layout_gravity="bottom|end"
                 android:background="@drawable/round_bgnd"
                 android:contentDescription="@string/active_user"
-                android:src="@drawable/ic_check_circle" />
+                android:src="@drawable/ic_check_circle"
+                tools:visibility="gone" />
         </FrameLayout>
 
 
@@ -86,7 +87,23 @@
                 android:gravity="bottom"
                 android:maxLines="1"
                 android:text="@string/placeholder_filename"
-                android:textAppearance="?android:attr/textAppearanceListItem" />
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                tools:text="Firstname Lastname" />
+
+            <TextView
+                android:id="@+id/status"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/standard_half_margin"
+                android:layout_marginEnd="@dimen/standard_double_margin"
+                android:layout_marginBottom="@dimen/standard_quarter_margin"
+                android:ellipsize="end"
+                android:gravity="top"
+                android:maxLines="1"
+                android:text="@string/placeholder_sentence"
+                android:textColor="?android:attr/textColorSecondary"
+                android:visibility="gone"
+                tools:text="☁️ My custom status" />
 
             <TextView
                 android:id="@+id/account"
@@ -99,7 +116,8 @@
                 android:gravity="top"
                 android:maxLines="1"
                 android:text="@string/placeholder_sentence"
-                android:textColor="?android:attr/textColorSecondary" />
+                android:textColor="?android:attr/textColorSecondary"
+                tools:text="https://server.com/nextcloud" />
 
         </LinearLayout>
 

+ 37 - 1
src/main/res/layout/dialog_choose_account.xml

@@ -33,6 +33,42 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <LinearLayout
+        android:id="@+id/statusView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:visibility="gone"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/current_account"
+        tools:visibility="visible">
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="@dimen/standard_quarter_margin"
+            android:background="@color/list_divider_background" />
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/set_status"
+            style="@style/Widget.MaterialComponents.Button.TextButton.Icon"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/account_action_button_height"
+            android:layout_marginStart="@dimen/account_action_button_margin"
+            android:layout_marginEnd="@dimen/account_action_button_margin"
+            android:paddingStart="10dp"
+            android:paddingEnd="0dp"
+            android:text="@string/set_status"
+            android:textAlignment="textStart"
+            android:textAllCaps="false"
+            android:textColor="@color/fontAppbar"
+            app:icon="@drawable/ic_edit"
+            app:iconGravity="start"
+            app:iconPadding="22dp"
+            app:iconTint="@color/fontAppbar" />
+    </LinearLayout>
+
     <View
         android:id="@+id/separator_line"
         android:layout_width="0dp"
@@ -41,7 +77,7 @@
         android:background="@color/list_divider_background"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/current_account" />
+        app:layout_constraintTop_toBottomOf="@id/statusView" />
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/accounts_list"

+ 2 - 0
src/main/res/values/strings.xml

@@ -937,4 +937,6 @@
     <string name="could_not_retrieve_shares">Could not retrieve shares</string>
     <string name="failed_update_ui">Failed to update UI</string>
     <string name="remote">(remote)</string>
+    <string name="status_description">Your avatar with status</string>
+    <string name="set_status">Set status</string>
 </resources>