Browse Source

Merge pull request #7161 from nextcloud/serverStable20

Server stable20
Tobias Kaminsky 4 years ago
parent
commit
c2e6343e79

+ 3 - 3
.drone.yml

@@ -59,7 +59,7 @@ services:
     environment:
       EVAL: true
     commands:
-      - BRANCH='stable18' /usr/local/bin/initnc.sh
+      - BRANCH='stable20' /usr/local/bin/initnc.sh
       - echo 127.0.0.1 server >> /etc/hosts
       - su www-data -c "OC_PASS=user1 php /var/www/html/occ user:add --password-from-env --display-name='User One' user1"
       - su www-data -c "OC_PASS=user2 php /var/www/html/occ user:add --password-from-env --display-name='User Two' user2"
@@ -68,9 +68,9 @@ services:
       - su www-data -c "php /var/www/html/occ group:add users"
       - su www-data -c "php /var/www/html/occ group:adduser users user1"
       - su www-data -c "php /var/www/html/occ group:adduser users user2"
-      - su www-data -c "git clone -b stable18 https://github.com/nextcloud/activity.git /var/www/html/apps/activity/"
+      - su www-data -c "git clone -b stable20 https://github.com/nextcloud/activity.git /var/www/html/apps/activity/"
       - su www-data -c "php /var/www/html/occ app:enable activity"
-      - su www-data -c "git clone -b stable18 https://github.com/nextcloud/text.git /var/www/html/apps/text/"
+      - su www-data -c "git clone -b stable20 https://github.com/nextcloud/text.git /var/www/html/apps/text/"
       - su www-data -c "php /var/www/html/occ app:enable text"
       - su www-data -c "php /var/www/html/occ app:enable end_to_end_encryption"
       - /usr/local/bin/run.sh

+ 2 - 0
detekt.yml

@@ -56,6 +56,7 @@ complexity:
     threshold: 10
     ignoreSingleWhenExpression: false
     ignoreSimpleWhenEntries: false
+    excludes: ['**/androidTest/**']
   LabeledExpression:
     active: false
     ignoredLabels: ""
@@ -65,6 +66,7 @@ complexity:
   LongMethod:
     active: true
     threshold: 60
+    excludes: ['**/androidTest/**']
   LongParameterList:
     active: true
     threshold: 6

+ 1 - 1
scripts/checkIfRunDrone.sh

@@ -6,7 +6,7 @@ if [ -z $3 ] ; then
 fi
 
 export BRANCH=$(scripts/analysis/getBranchBase.sh $1 $2 $3 | sed s'/"//'g)
-if [ $(git diff --name-only origin/$BRANCH | grep -cE "^src|^screenshots|build.gradle") -eq 0 ] ; then
+if [ $(git diff --name-only origin/$BRANCH | grep -cE "^src|screenshots|build.gradle|.drone.yml") -eq 0 ] ; then
     echo "No source files changed"
     exit 1
 else

+ 5 - 2
src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt

@@ -54,7 +54,10 @@ import javax.inject.Inject
 
 private const val ARG_CURRENT_USER_PARAM = "currentUser"
 
-class ChooseAccountDialogFragment : DialogFragment(),
+private const val STATUS_SIZE_IN_DP = 9f
+
+class ChooseAccountDialogFragment :
+    DialogFragment(),
     AvatarGenerationListener,
     UserListAdapter.ClickListener,
     Injectable {
@@ -199,7 +202,7 @@ class ChooseAccountDialogFragment : DialogFragment(),
     fun setStatus(newStatus: Status) {
         currentStatus = newStatus
 
-        val size = DisplayUtils.convertDpToPixel(9f, context)
+        val size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, context)
         ticker.background = null
         ticker.setImageDrawable(StatusDrawable(newStatus, size.toFloat(), context))
         ticker.visibility = View.VISIBLE

+ 6 - 4
src/main/java/com/nextcloud/ui/SetPredefinedCustomStatusTask.kt

@@ -27,10 +27,12 @@ import android.content.Context
 import com.owncloud.android.lib.common.OwnCloudClientFactory
 import com.owncloud.android.lib.resources.users.SetPredefinedCustomStatusMessageRemoteOperation
 
-public class SetPredefinedCustomStatusTask(val messageId: String,
-                                           val clearAt: Long?,
-                                           val account: Account?,
-                                           val context: Context?) : Function0<Boolean> {
+public class SetPredefinedCustomStatusTask(
+    val messageId: String,
+    val clearAt: Long?,
+    val account: Account?,
+    val context: Context?
+) : Function0<Boolean> {
     override fun invoke(): Boolean {
         val client = OwnCloudClientFactory.createNextcloudClient(account, context)
 

+ 61 - 36
src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt

@@ -68,7 +68,23 @@ import javax.inject.Inject
 private const val ARG_CURRENT_USER_PARAM = "currentUser"
 private const val ARG_CURRENT_STATUS_PARAM = "currentStatus"
 
-class SetStatusDialogFragment : DialogFragment(),
+private const val POS_DONT_CLEAR = 0
+private const val POS_HALF_AN_HOUR = 1
+private const val POS_AN_HOUR = 2
+private const val POS_FOUR_HOURS = 3
+private const val POS_TODAY = 4
+private const val POS_END_OF_WEEK = 5
+
+private const val ONE_SECOND_IN_MILLIS = 1000
+private const val ONE_MINUTE_IN_SECONDS = 60
+private const val THIRTY_MINUTES = 30
+private const val FOUR_HOURS = 4
+private const val LAST_HOUR_OF_DAY = 23
+private const val LAST_MINUTE_OF_HOUR = 59
+private const val LAST_SECOND_OF_MINUTE = 59
+
+class SetStatusDialogFragment :
+    DialogFragment(),
     PredefinedStatusClickListener,
     Injectable {
 
@@ -138,7 +154,7 @@ class SetStatusDialogFragment : DialogFragment(),
                 remainingClearTime.apply {
                     clearStatusMessageTextView.text = getString(R.string.clear_status_message)
                     visibility = View.VISIBLE
-                    text = DisplayUtils.getRelativeTimestamp(context, it.clearAt * 1000, true)
+                    text = DisplayUtils.getRelativeTimestamp(context, it.clearAt * ONE_SECOND_IN_MILLIS, true)
                         .toString()
                         .decapitalize(Locale.getDefault())
                     setOnClickListener {
@@ -204,65 +220,69 @@ class SetStatusDialogFragment : DialogFragment(),
 
     private fun setClearStatusAfterValue(item: Int) {
         when (item) {
-            0 -> {
+            POS_DONT_CLEAR -> {
                 // don't clear
                 clearAt = null
             }
 
-            1 -> {
+            POS_HALF_AN_HOUR -> {
                 // 30 minutes
-                clearAt = System.currentTimeMillis() / 1000 + 30 * 60
+                clearAt = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + THIRTY_MINUTES * ONE_MINUTE_IN_SECONDS
             }
 
-            2 -> {
+            POS_AN_HOUR -> {
                 // one hour
-                clearAt = System.currentTimeMillis() / 1000 + 60 * 60
+                clearAt =
+                    System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS
             }
 
-            3 -> {
+            POS_FOUR_HOURS -> {
                 // four hours
-                clearAt = System.currentTimeMillis() / 1000 + 4 * 60 * 60
+                clearAt =
+                    System.currentTimeMillis() / ONE_SECOND_IN_MILLIS
+                +FOUR_HOURS * ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS
             }
 
-            4 -> {
+            POS_TODAY -> {
                 // today
                 val date = Calendar.getInstance().apply {
-                    set(Calendar.HOUR_OF_DAY, 23)
-                    set(Calendar.MINUTE, 59)
-                    set(Calendar.SECOND, 59)
+                    set(Calendar.HOUR_OF_DAY, LAST_HOUR_OF_DAY)
+                    set(Calendar.MINUTE, LAST_MINUTE_OF_HOUR)
+                    set(Calendar.SECOND, LAST_SECOND_OF_MINUTE)
                 }
-                clearAt = date.timeInMillis / 1000
+                clearAt = date.timeInMillis / ONE_SECOND_IN_MILLIS
             }
 
-            5 -> {
+            POS_END_OF_WEEK -> {
                 // end of week
                 val date = Calendar.getInstance().apply {
-                    set(Calendar.HOUR_OF_DAY, 23)
-                    set(Calendar.MINUTE, 59)
-                    set(Calendar.SECOND, 59)
+                    set(Calendar.HOUR_OF_DAY, LAST_HOUR_OF_DAY)
+                    set(Calendar.MINUTE, LAST_MINUTE_OF_HOUR)
+                    set(Calendar.SECOND, LAST_SECOND_OF_MINUTE)
                 }
 
                 while (date.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
                     date.add(Calendar.DAY_OF_YEAR, 1)
                 }
 
-                clearAt = date.timeInMillis / 1000
+                clearAt = date.timeInMillis / ONE_SECOND_IN_MILLIS
             }
         }
     }
 
+    @Suppress("ReturnCount")
     private fun clearAtToUnixTime(clearAt: ClearAt?): Long {
         if (clearAt != null) {
             if (clearAt.type.equals("period")) {
-                return System.currentTimeMillis() / 1000 + clearAt.time.toLong()
+                return System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + clearAt.time.toLong()
             } else if (clearAt.type.equals("end-of")) {
                 if (clearAt.time.equals("day")) {
                     val date = Calendar.getInstance().apply {
-                        set(Calendar.HOUR_OF_DAY, 23)
-                        set(Calendar.MINUTE, 59)
-                        set(Calendar.SECOND, 59)
+                        set(Calendar.HOUR_OF_DAY, LAST_HOUR_OF_DAY)
+                        set(Calendar.MINUTE, LAST_MINUTE_OF_HOUR)
+                        set(Calendar.SECOND, LAST_SECOND_OF_MINUTE)
                     }
-                    return date.timeInMillis / 1000
+                    return date.timeInMillis / ONE_SECOND_IN_MILLIS
                 }
             }
         }
@@ -275,8 +295,10 @@ class SetStatusDialogFragment : DialogFragment(),
     }
 
     private fun clearStatus() {
-        asyncRunner.postQuickTask(ClearStatusTask(accountManager.currentOwnCloudAccount?.savedAccount, context),
-            { dismiss(it) })
+        asyncRunner.postQuickTask(
+            ClearStatusTask(accountManager.currentOwnCloudAccount?.savedAccount, context),
+            { dismiss(it) }
+        )
     }
 
     private fun setStatus(statusType: StatusType) {
@@ -286,7 +308,8 @@ class SetStatusDialogFragment : DialogFragment(),
             SetStatusTask(
                 statusType,
                 accountManager.currentOwnCloudAccount?.savedAccount,
-                context),
+                context
+            ),
             {
                 if (!it) {
                     clearTopStatus()
@@ -334,7 +357,8 @@ class SetStatusDialogFragment : DialogFragment(),
                     selectedPredefinedMessageId!!,
                     clearAt,
                     accountManager.currentOwnCloudAccount?.savedAccount,
-                    context),
+                    context
+                ),
                 { dismiss(it) }
             )
         } else {
@@ -344,7 +368,8 @@ class SetStatusDialogFragment : DialogFragment(),
                     emoji.text.toString(),
                     clearAt,
                     accountManager.currentOwnCloudAccount?.savedAccount,
-                    context),
+                    context
+                ),
                 { dismiss(it) }
             )
         }
@@ -393,16 +418,16 @@ class SetStatusDialogFragment : DialogFragment(),
             val clearAt = predefinedStatus.clearAt!!
             if (clearAt.type.equals("period")) {
                 when (clearAt.time) {
-                    "1800" -> clearStatusAfterSpinner.setSelection(1)
-                    "3600" -> clearStatusAfterSpinner.setSelection(2)
-                    "14400" -> clearStatusAfterSpinner.setSelection(3)
-                    else -> clearStatusAfterSpinner.setSelection(0)
+                    "1800" -> clearStatusAfterSpinner.setSelection(POS_HALF_AN_HOUR)
+                    "3600" -> clearStatusAfterSpinner.setSelection(POS_AN_HOUR)
+                    "14400" -> clearStatusAfterSpinner.setSelection(POS_FOUR_HOURS)
+                    else -> clearStatusAfterSpinner.setSelection(POS_DONT_CLEAR)
                 }
             } else if (clearAt.type.equals("end-of")) {
                 when (clearAt.time) {
-                    "day" -> clearStatusAfterSpinner.setSelection(4)
-                    "week" -> clearStatusAfterSpinner.setSelection(5)
-                    else -> clearStatusAfterSpinner.setSelection(0)
+                    "day" -> clearStatusAfterSpinner.setSelection(POS_TODAY)
+                    "week" -> clearStatusAfterSpinner.setSelection(POS_END_OF_WEEK)
+                    else -> clearStatusAfterSpinner.setSelection(POS_DONT_CLEAR)
                 }
             }
         }

+ 5 - 3
src/main/java/com/nextcloud/ui/SetStatusTask.kt

@@ -28,9 +28,11 @@ import com.owncloud.android.lib.common.OwnCloudClientFactory
 import com.owncloud.android.lib.resources.users.SetStatusRemoteOperation
 import com.owncloud.android.lib.resources.users.StatusType
 
-class SetStatusTask(val statusType: StatusType,
-                    val account: Account?,
-                    val context: Context?) : Function0<Boolean> {
+class SetStatusTask(
+    val statusType: StatusType,
+    val account: Account?,
+    val context: Context?
+) : Function0<Boolean> {
     override fun invoke(): Boolean {
         val client = OwnCloudClientFactory.createNextcloudClient(account, context)
 

+ 7 - 5
src/main/java/com/nextcloud/ui/SetUserDefinedCustomStatusTask.kt

@@ -27,11 +27,13 @@ import android.content.Context
 import com.owncloud.android.lib.common.OwnCloudClientFactory
 import com.owncloud.android.lib.resources.users.SetUserDefinedCustomStatusMessageRemoteOperation
 
-public class SetUserDefinedCustomStatusTask(val message: String,
-                                            val icon: String,
-                                            val clearAt: Long?,
-                                            val account: Account?,
-                                            val context: Context?) : Function0<Boolean> {
+public class SetUserDefinedCustomStatusTask(
+    val message: String,
+    val icon: String,
+    val clearAt: Long?,
+    val account: Account?,
+    val context: Context?
+) : Function0<Boolean> {
     override fun invoke(): Boolean {
         val client = OwnCloudClientFactory.createNextcloudClient(account, context)
 

+ 4 - 2
src/main/java/com/owncloud/android/ui/adapter/PredefinedStatusListAdapter.kt

@@ -29,8 +29,10 @@ import androidx.recyclerview.widget.RecyclerView
 import com.owncloud.android.databinding.PredefinedStatusBinding
 import com.owncloud.android.lib.resources.users.PredefinedStatus
 
-class PredefinedStatusListAdapter(private val clickListener: PredefinedStatusClickListener,
-                                  val context: Context) : RecyclerView.Adapter<PredefinedStatusViewHolder>() {
+class PredefinedStatusListAdapter(
+    private val clickListener: PredefinedStatusClickListener,
+    val context: Context
+) : RecyclerView.Adapter<PredefinedStatusViewHolder>() {
     internal var list: List<PredefinedStatus> = emptyList()
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PredefinedStatusViewHolder {

+ 6 - 2
src/main/java/com/owncloud/android/ui/adapter/PredefinedStatusViewHolder.kt

@@ -29,7 +29,10 @@ import com.owncloud.android.databinding.PredefinedStatusBinding
 import com.owncloud.android.lib.resources.users.PredefinedStatus
 import com.owncloud.android.utils.DisplayUtils
 
+private const val ONE_SECOND_IN_MILLIS = 1000
+
 class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : RecyclerView.ViewHolder(binding.root) {
+
     fun bind(status: PredefinedStatus, clickListener: PredefinedStatusClickListener, context: Context) {
         binding.root.setOnClickListener { clickListener.onClick(status) }
         binding.icon.text = status.icon
@@ -42,8 +45,9 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) :
             if (clearAt.type.equals("period")) {
                 binding.clearAt.text = DisplayUtils.getRelativeTimestamp(
                     context,
-                    System.currentTimeMillis() + clearAt.time.toInt() * 1000,
-                    true)
+                    System.currentTimeMillis() + clearAt.time.toInt() * ONE_SECOND_IN_MILLIS,
+                    true
+                )
             } else {
                 // end-of
                 if (clearAt.time.equals("day")) {

+ 0 - 56
src/main/java/com/owncloud/android/ui/components/AvatarWithStatus.kt

@@ -1,56 +0,0 @@
-/*
- *
- * 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.ui.components
-
-import android.graphics.Canvas
-import android.graphics.ColorFilter
-import android.graphics.Paint
-import android.graphics.PixelFormat
-import android.graphics.drawable.Drawable
-import androidx.core.graphics.drawable.RoundedBitmapDrawable
-
-class AvatarWithStatus(val roundedBitmapDrawable: RoundedBitmapDrawable) : Drawable() {
-    private val redPaint: Paint = Paint().apply { setARGB(255, 255, 0, 0) }
-
-    private val avatarSize = 100
-
-    override fun draw(canvas: Canvas) {
-        val width = avatarSize
-        val height = avatarSize
-        val radius: Float = Math.min(width, height).toFloat() / 2f
-
-        // Draw a red circle in the center
-        // canvas.drawBitmap(roundedBitmapDrawable.bitmap!!, 0f, 0f, null)
-        canvas.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), radius, redPaint)
-    }
-
-    override fun setAlpha(alpha: Int) {
-        TODO("Not yet implemented")
-    }
-
-    override fun setColorFilter(colorFilter: ColorFilter?) {
-        TODO("Not yet implemented")
-    }
-
-    override fun getOpacity(): Int = PixelFormat.OPAQUE
-}

+ 1 - 0
src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.kt

@@ -37,6 +37,7 @@ import java.io.InputStream
 /**
  * Fetcher with OwnCloudClient
  */
+@Suppress("TooGenericExceptionCaught")
 class HttpStreamFetcher internal constructor(
     private val currentAccount: CurrentAccountProvider,
     private val clientFactory: ClientFactory,