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

Merge remote-tracking branch 'origin/13035-only-pictures-are-enabled-but-videos-also-auto-synced' into 13035-only-pictures-are-enabled-but-videos-also-auto-synced

# Conflicts:
#	app/src/main/java/com/owncloud/android/datamodel/SyncedFolder.java
Jonas Mayer 11 сар өмнө
parent
commit
86ddaa3b5b

+ 55 - 0
app/src/androidTest/java/com/owncloud/android/utils/SessionMixinTest.kt

@@ -0,0 +1,55 @@
+/*
+ * Nextcloud - Android Client
+ *
+ * SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+package com.owncloud.android.utils
+
+import android.content.Intent
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import com.nextcloud.client.account.UserAccountManager
+import com.nextcloud.client.account.UserAccountManagerImpl
+import com.nextcloud.client.mixins.SessionMixin
+import com.owncloud.android.AbstractIT
+import com.owncloud.android.ui.activity.FileDisplayActivity
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+class SessionMixinTest : AbstractIT() {
+
+    private lateinit var userAccountManager: UserAccountManager
+    private lateinit var session: SessionMixin
+
+    private var scenario: ActivityScenario<FileDisplayActivity>? = null
+    val intent = Intent(ApplicationProvider.getApplicationContext(), FileDisplayActivity::class.java)
+
+    @get:Rule
+    val activityRule = ActivityScenarioRule<FileDisplayActivity>(intent)
+
+    @Before
+    fun setUp() {
+        userAccountManager = UserAccountManagerImpl.fromContext(targetContext)
+
+        scenario = activityRule.scenario
+        scenario?.onActivity { sut ->
+            session = SessionMixin(
+                sut,
+                userAccountManager
+            )
+        }
+    }
+
+    @Test
+    fun startAccountCreation() {
+        session.startAccountCreation()
+
+        scenario = activityRule.scenario
+        scenario?.onActivity { sut ->
+            assert(sut.account.name == userAccountManager.accounts.first().name)
+        }
+    }
+}

+ 1 - 1
app/src/main/java/com/nextcloud/client/mixins/SessionMixin.kt

@@ -29,7 +29,7 @@ class SessionMixin(
     private val activity: Activity,
     private val accountManager: UserAccountManager
 ) : ActivityMixin {
-    lateinit var currentAccount: Account
+    var currentAccount: Account = getDefaultAccount()
         private set
 
     val capabilities: OCCapability?

+ 23 - 0
app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java

@@ -31,6 +31,7 @@ import com.owncloud.android.databinding.RichdocumentsWebviewBinding;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+import com.owncloud.android.ui.asynctasks.TextEditorLoadUrlTask;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.WebViewUtil;
@@ -99,6 +100,23 @@ public abstract class EditorWebView extends ExternalSiteWebView {
         finish();
     }
 
+    public void reload() {
+        if (getWebView().getVisibility() != View.VISIBLE) {
+            return;
+        }
+
+        Optional<User> user = getUser();
+        if (!user.isPresent()) {
+            return;
+        }
+
+        OCFile file = getFile();
+        if (file != null) {
+            TextEditorLoadUrlTask task = new TextEditorLoadUrlTask(this, user.get(), file, editorUtils);
+            task.execute();
+        }
+    }
+
     @Override
     protected void bindView() {
         binding = RichdocumentsWebviewBinding.inflate(getLayoutInflater());
@@ -281,6 +299,11 @@ public abstract class EditorWebView extends ExternalSiteWebView {
         public void loaded() {
             runOnUiThread(EditorWebView.this::hideLoading);
         }
+
+        @JavascriptInterface
+        public void reload() {
+            EditorWebView.this.reload();
+        }
     }
 
 }

+ 30 - 39
app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -69,6 +69,7 @@ import javax.inject.Inject;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.appcompat.widget.SearchView;
 import androidx.core.content.ContextCompat;
@@ -99,8 +100,6 @@ public class ExtendedListFragment extends Fragment implements
     public static final float minColumnSize = 2.0f;
 
     private int maxColumnSize = 5;
-    private int maxColumnSizePortrait = 5;
-    private int maxColumnSizeLandscape = 10;
 
     @Inject AppPreferences preferences;
     @Inject UserAccountManager accountManager;
@@ -116,10 +115,10 @@ public class ExtendedListFragment extends Fragment implements
     protected ImageView mEmptyListIcon;
 
     // Save the state of the scroll in browsing
-    private ArrayList<Integer> mIndexes;
-    private ArrayList<Integer> mFirstPositions;
-    private ArrayList<Integer> mTops;
-    private int mHeightCell;
+    private ArrayList<Integer> mIndexes = new ArrayList<>();
+    private ArrayList<Integer> mFirstPositions = new ArrayList<>();
+    private ArrayList<Integer> mTops = new ArrayList<>();
+    private int mHeightCell = 0;
 
     private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener;
 
@@ -127,7 +126,7 @@ public class ExtendedListFragment extends Fragment implements
 
     protected SearchView searchView;
     private ImageView closeButton;
-    private Handler handler = new Handler(Looper.getMainLooper());
+    private final Handler handler = new Handler(Looper.getMainLooper());
 
     private float mScale = AppPreferencesImpl.DEFAULT_GRID_COLUMN;
 
@@ -178,7 +177,7 @@ public class ExtendedListFragment extends Fragment implements
         searchView.setOnQueryTextListener(this);
         searchView.setOnCloseListener(this);
 
-        final Handler handler = new Handler();
+        final Handler handler = new Handler(Looper.getMainLooper());
 
         DisplayMetrics displaymetrics = new DisplayMetrics();
         Activity activity;
@@ -399,35 +398,27 @@ public class ExtendedListFragment extends Fragment implements
         mEmptyListIcon = binding.emptyList.emptyListIcon;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        if (savedInstanceState != null) {
-            mIndexes = savedInstanceState.getIntegerArrayList(KEY_INDEXES);
-            mFirstPositions = savedInstanceState.getIntegerArrayList(KEY_FIRST_POSITIONS);
-            mTops = savedInstanceState.getIntegerArrayList(KEY_TOPS);
-            mHeightCell = savedInstanceState.getInt(KEY_HEIGHT_CELL);
-            setMessageForEmptyList(savedInstanceState.getString(KEY_EMPTY_LIST_MESSAGE));
-
-            if (savedInstanceState.getBoolean(KEY_IS_GRID_VISIBLE, false) && getRecyclerView().getAdapter() != null) {
-                switchToGridView();
-            }
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        if (savedInstanceState == null) {
+            return;
+        }
 
-            int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION);
-            Log_OC.v(TAG, "Setting grid position " + referencePosition);
-            scrollToPosition(referencePosition);
-        } else {
-            mIndexes = new ArrayList<>();
-            mFirstPositions = new ArrayList<>();
-            mTops = new ArrayList<>();
-            mHeightCell = 0;
+        mIndexes = savedInstanceState.getIntegerArrayList(KEY_INDEXES);
+        mFirstPositions = savedInstanceState.getIntegerArrayList(KEY_FIRST_POSITIONS);
+        mTops = savedInstanceState.getIntegerArrayList(KEY_TOPS);
+        mHeightCell = savedInstanceState.getInt(KEY_HEIGHT_CELL);
+        setMessageForEmptyList(savedInstanceState.getString(KEY_EMPTY_LIST_MESSAGE));
+
+        if (savedInstanceState.getBoolean(KEY_IS_GRID_VISIBLE, false) && getRecyclerView().getAdapter() != null) {
+            switchToGridView();
         }
-    }
 
+        int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION);
+        Log_OC.v(TAG, "Setting grid position " + referencePosition);
+        scrollToPosition(referencePosition);
+    }
 
     @Override
     public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
@@ -485,8 +476,9 @@ public class ExtendedListFragment extends Fragment implements
      * Save index and top position
      */
     protected void saveIndexAndTopPosition(int index) {
-
-        mIndexes.add(index);
+        if (mIndexes != null) {
+            mIndexes.add(index);
+        }
 
         RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
         int firstPosition;
@@ -519,8 +511,7 @@ public class ExtendedListFragment extends Fragment implements
             searchView.onActionViewCollapsed();
 
             Activity activity;
-            if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) {
-                FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity;
+            if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity fileDisplayActivity) {
                 fileDisplayActivity.setDrawerIndicatorEnabled(fileDisplayActivity.isDrawerIndicatorAvailable());
                 fileDisplayActivity.hideSearchView(fileDisplayActivity.getCurrentDir());
             }
@@ -683,9 +674,9 @@ public class ExtendedListFragment extends Fragment implements
         super.onConfigurationChanged(newConfig);
 
         if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
-            maxColumnSize = maxColumnSizeLandscape;
+            maxColumnSize = 10;
         } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
-            maxColumnSize = maxColumnSizePortrait;
+            maxColumnSize = 5;
         }
 
         if (isGridEnabled() && getColumnsCount() > maxColumnSize) {

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

@@ -92,6 +92,7 @@
     <string name="auth_unsupported_multiaccount">%1$s ne prend pas en charge les comptes multiples</string>
     <string name="auth_wrong_connection_title">Impossible d\'établir la connexion</string>
     <string name="authenticator_activity_cancel_login">Annuler la connexion</string>
+    <string name="authenticator_activity_login_error">Un problème est survenu lors du traitement de votre demande de connexion. Veuillez réessayer plus tard.</string>
     <string name="authenticator_activity_please_complete_login_process">Veuillez finaliser la connexion dans votre navigateur</string>
     <string name="auto_upload_file_behaviour_kept_in_folder">conservé dans le dossier original (puisqu\'il est en lecture seule)</string>
     <string name="auto_upload_on_wifi">Téléverser par Wi-Fi uniquement</string>
@@ -321,6 +322,7 @@
     <string name="error_showing_encryption_dialog">Erreur d\'affichage de la boîte de dialogue de configuration du chiffrement !</string>
     <string name="error_starting_direct_camera_upload">Erreur au démarrage de l\'appareil photo</string>
     <string name="error_starting_doc_scan">Erreur lors de la numérisation du document</string>
+    <string name="error_uploading_direct_camera_upload">Échec du téléversement du média capturé</string>
     <string name="etm_accounts">Comptes</string>
     <string name="etm_background_execution_count">Temps d’exécution en 48h</string>
     <string name="etm_background_job_created">Créée</string>
@@ -352,6 +354,7 @@
     <string name="failed_update_ui">Échec de la mise à jour de l\'interface utilisateur</string>
     <string name="favorite">Ajouter aux favoris</string>
     <string name="favorite_icon">Favoris</string>
+    <string name="file_activity_shared_file_cannot_be_updated">Le fichier partagé ne peut pas être mis à jour</string>
     <string name="file_already_exists">Ce nom de fichier existe déjà</string>
     <string name="file_delete">Supprimer</string>
     <string name="file_detail_activity_error">Erreur lors de la récupération de l’activité du fichier</string>
@@ -672,6 +675,7 @@
     <string name="push_notifications_old_login">Aucune notification push à cause d\'une connexion expirée. Veuillez ajouter de nouveau votre compte. </string>
     <string name="push_notifications_temp_error">Les notifications push ne sont pas disponibles actuellement.</string>
     <string name="qr_could_not_be_read">Le code QR ne peut être lu</string>
+    <string name="receive_external_files_activity_start_sync_folder_is_not_exists_message">Le dossier est introuvable, l\'opération de synchronisation est annulée.</string>
     <string name="recommend_subject">Essayez %1$s sur votre appareil !</string>
     <string name="recommend_text">J\'aimerais vous inviter à utiliser %1$s sur votre appareil.\nTéléchargez-la ici : %2$s</string>
     <string name="recommend_urls">%1$s ou %2$s</string>
@@ -902,7 +906,10 @@
     <string name="upload_cannot_create_file">Impossible de créer le fichier local</string>
     <string name="upload_chooser_title">Téléverser depuis…</string>
     <string name="upload_content_from_other_apps">Téléverser du contenu à partir d\'autres applications</string>
+    <string name="upload_direct_camera_photo">Photo</string>
+    <string name="upload_direct_camera_promt">Vous souhaitez prendre une photo ou une vidéo ?</string>
     <string name="upload_direct_camera_upload">Téléverser depuis l\'appareil photo</string>
+    <string name="upload_direct_camera_video">Vidéo</string>
     <string name="upload_file_dialog_filename">Nom de fichier</string>
     <string name="upload_file_dialog_filetype">Type de fichier</string>
     <string name="upload_file_dialog_filetype_googlemap_shortcut">Raccourci(%s) Google Maps</string>
@@ -921,6 +928,7 @@
     <string name="upload_local_storage_not_copied">Le fichier n\'a pas pu être copié sur le stockage local</string>
     <string name="upload_lock_failed">Impossible de verrouiller le dossier</string>
     <string name="upload_manually_cancelled">Le téléversement a été annulé par l\'utilisateur</string>
+    <string name="upload_notification_manager_start_text">%1$d / %2$d - %3$s</string>
     <string name="upload_old_android">Le chiffrement n\'est disponible que pour les versions d\'Android&gt;= 5.0</string>
     <string name="upload_query_move_foreign_files">Il n\'y a pas assez d\'espace pour copier les fichiers sélectionnés dans le dossier %1$s. Souhaitez-vous plutôt les déplacer ?</string>
     <string name="upload_quota_exceeded">Quota de stockage dépassé</string>

+ 6 - 0
app/src/main/res/values-pt-rBR/strings.xml

@@ -92,6 +92,7 @@
     <string name="auth_unsupported_multiaccount">%1$s não tem suporte a múltiplas contas</string>
     <string name="auth_wrong_connection_title">Não foi possível estabelecer a conexão</string>
     <string name="authenticator_activity_cancel_login">Cancelar login</string>
+    <string name="authenticator_activity_login_error">Ocorreu um problema ao processar o seu pedido de início de sessão. Tente novamente mais tarde.</string>
     <string name="authenticator_activity_please_complete_login_process">Conclua o processo de login no seu navegador</string>
     <string name="auto_upload_file_behaviour_kept_in_folder">mantido na pasta original, já que é somente leitura</string>
     <string name="auto_upload_on_wifi">Enviar só por WiFi não medida</string>
@@ -321,6 +322,7 @@
     <string name="error_showing_encryption_dialog">Erro ao mostrar o diálogo de configuração de criptografia!</string>
     <string name="error_starting_direct_camera_upload">Erro ao inicializar a câmera</string>
     <string name="error_starting_doc_scan">Erro ao iniciar a digitalização do documento</string>
+    <string name="error_uploading_direct_camera_upload">Falha ao carregar mídia tirada</string>
     <string name="etm_accounts">Contas</string>
     <string name="etm_background_execution_count">Os tempos correm em 48h</string>
     <string name="etm_background_job_created">Criada</string>
@@ -352,6 +354,7 @@
     <string name="failed_update_ui">Falha ao atualizar a interface gráfica</string>
     <string name="favorite">Adicionar aos favoritos</string>
     <string name="favorite_icon">Favorito</string>
+    <string name="file_activity_shared_file_cannot_be_updated">O arquivo compartilhado não pode ser atualizado</string>
     <string name="file_already_exists">O nome do arquivo já existe</string>
     <string name="file_delete">Excluir</string>
     <string name="file_detail_activity_error">Erro ao recuperar atividades do arquivo</string>
@@ -903,7 +906,10 @@
     <string name="upload_cannot_create_file">Não foi possível criar o arquivo local</string>
     <string name="upload_chooser_title">Enviar de…</string>
     <string name="upload_content_from_other_apps">Enviar conteúdo de outros aplicativos</string>
+    <string name="upload_direct_camera_photo">Fotografia</string>
+    <string name="upload_direct_camera_promt">Quer tirar uma foto ou gravar um vídeo?</string>
     <string name="upload_direct_camera_upload">Enviar da câmera</string>
+    <string name="upload_direct_camera_video">Vídeo</string>
     <string name="upload_file_dialog_filename">Nome do arquivo</string>
     <string name="upload_file_dialog_filetype">Tipo de arquivo</string>
     <string name="upload_file_dialog_filetype_googlemap_shortcut">Arquivo de atalho do Google Maps (%s)</string>

+ 0 - 52
app/src/test/java/com/nextcloud/client/mixins/SessionMixinTest.kt

@@ -1,52 +0,0 @@
-/*
- * Nextcloud - Android Client
- *
- * SPDX-FileCopyrightText: 2020 Chris Narkiewicz <hello@ezaquarii.com>
- * SPDX-FileCopyrightText: 2020 Nextcloud GmbH
- * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
- */
-package com.nextcloud.client.mixins
-
-import android.app.Activity
-import com.nextcloud.client.account.UserAccountManager
-import org.junit.Before
-import org.junit.Test
-import org.mockito.Mock
-import org.mockito.Mockito.same
-import org.mockito.Mockito.spy
-import org.mockito.MockitoAnnotations
-import org.mockito.kotlin.verify
-
-class SessionMixinTest {
-
-    @Mock
-    private lateinit var activity: Activity
-
-    @Mock
-    private lateinit var userAccountManager: UserAccountManager
-
-    private lateinit var session: SessionMixin
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-        session = spy(
-            SessionMixin(
-                activity,
-                userAccountManager
-            )
-        )
-    }
-
-    @Test
-    fun `start account creation`() {
-        // WHEN
-        //      start account creation flow
-        session.startAccountCreation()
-
-        // THEN
-        //      start is delegated to account manager
-        //      account manager receives parent activity
-        verify(userAccountManager).startAccountCreation(same(activity))
-    }
-}