Przeglądaj źródła

Merge pull request #12266 from nextcloud/depocc/notifications

Deprecate OwncloudClient - Notifications
Tobias Kaminsky 11 miesięcy temu
rodzic
commit
1b617d2123

+ 7 - 11
app/src/gplay/java/com/owncloud/android/utils/PushUtils.java

@@ -19,6 +19,7 @@ import com.google.gson.Gson;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
+import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
@@ -26,9 +27,7 @@ import com.owncloud.android.datamodel.ArbitraryDataProviderImpl;
 import com.owncloud.android.datamodel.PushConfigurationState;
 import com.owncloud.android.datamodel.SignatureVerification;
 import com.owncloud.android.lib.common.OwnCloudAccount;
-import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
-import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.notifications.RegisterAccountDeviceForNotificationsOperation;
@@ -131,14 +130,11 @@ public final class PushUtils {
 
         try {
             ocAccount = new OwnCloudAccount(account, context);
-            OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
-                    getClientFor(ocAccount, context);
+            NextcloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
+                getNextcloudClientFor(ocAccount, context);
 
-            RemoteOperation unregisterAccountDeviceForNotificationsOperation = new
-                    UnregisterAccountDeviceForNotificationsOperation();
-
-            RemoteOperationResult remoteOperationResult = unregisterAccountDeviceForNotificationsOperation.
-                    execute(mClient);
+            RemoteOperationResult<Void> remoteOperationResult =
+                new UnregisterAccountDeviceForNotificationsOperation().execute(mClient);
 
             if (remoteOperationResult.getHttpCode() == HttpStatus.SC_ACCEPTED) {
                 String arbitraryValue;
@@ -201,8 +197,8 @@ public final class PushUtils {
                             TextUtils.isEmpty(providerValue)) {
                         try {
                             OwnCloudAccount ocAccount = new OwnCloudAccount(account, context);
-                            OwnCloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton().
-                                    getClientFor(ocAccount, context);
+                            NextcloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton().
+                                getNextcloudClientFor(ocAccount, context);
 
                             RemoteOperationResult<PushResponse> remoteOperationResult =
                                 new RegisterAccountDeviceForNotificationsOperation(pushTokenHash,

+ 4 - 3
app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt

@@ -29,6 +29,7 @@ import com.nextcloud.client.integrations.deck.DeckApi
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.DecryptedPushMessage
 import com.owncloud.android.lib.common.OwnCloudClient
+import com.owncloud.android.lib.common.OwnCloudClientFactory
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
 import com.owncloud.android.lib.common.operations.RemoteOperation
 import com.owncloud.android.lib.common.utils.Log_OC
@@ -236,8 +237,7 @@ class NotificationWork constructor(
         }
         val user = optionalUser.get()
         try {
-            val client = OwnCloudClientManagerFactory.getDefaultSingleton()
-                .getClientFor(user.toOwnCloudAccount(), context)
+            val client = OwnCloudClientFactory.createNextcloudClient(user, context)
             val result = GetNotificationRemoteOperation(decryptedPushMessage.nid)
                 .execute(client)
             if (result.isSuccess) {
@@ -287,6 +287,7 @@ class NotificationWork constructor(
                                 val user = optionalUser.get()
                                 val client = OwnCloudClientManagerFactory.getDefaultSingleton()
                                     .getClientFor(user.toOwnCloudAccount(), context)
+                                val nextcloudClient = OwnCloudClientFactory.createNextcloudClient(user, context)
                                 val actionType = intent.getStringExtra(KEY_NOTIFICATION_ACTION_TYPE)
                                 val actionLink = intent.getStringExtra(KEY_NOTIFICATION_ACTION_LINK)
                                 val success: Boolean = if (!actionType.isNullOrEmpty() && !actionLink.isNullOrEmpty()) {
@@ -294,7 +295,7 @@ class NotificationWork constructor(
                                     resultCode == HttpStatus.SC_OK || resultCode == HttpStatus.SC_ACCEPTED
                                 } else {
                                     DeleteNotificationRemoteOperation(numericNotificationId)
-                                        .execute(client).isSuccess
+                                        .execute(nextcloudClient).isSuccess
                                 }
                                 if (success) {
                                     if (oldNotification == null) {

+ 24 - 0
app/src/main/java/com/nextcloud/utils/extensions/OwnCloudClientExtensions.kt

@@ -0,0 +1,24 @@
+/*
+ * Nextcloud - Android Client
+ *
+ * SPDX-FileCopyrightText: 2023 ZetaTom
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH
+ * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
+ */
+
+package com.nextcloud.utils.extensions
+
+import android.content.Context
+import com.nextcloud.common.NextcloudClient
+import com.owncloud.android.lib.common.OwnCloudClient
+import com.owncloud.android.lib.common.OwnCloudClientFactory
+
+fun OwnCloudClient.toNextcloudClient(context: Context): NextcloudClient {
+    return OwnCloudClientFactory.createNextcloudClient(
+        baseUri,
+        userId,
+        credentials.toOkHttpCredentials(),
+        context,
+        isFollowRedirects
+    )
+}

+ 20 - 19
app/src/main/java/com/owncloud/android/services/OperationsService.java

@@ -29,6 +29,7 @@ import android.util.Pair;
 
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.common.NextcloudClient;
 import com.nextcloud.utils.extensions.IntentExtensionsKt;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
@@ -260,7 +261,7 @@ public class OperationsService extends Service {
          */
         private final ConcurrentMap<OnRemoteOperationListener, Handler> mBoundListeners = new ConcurrentHashMap<>();
 
-        private ServiceHandler mServiceHandler;
+        private final ServiceHandler mServiceHandler;
 
         public OperationsServiceBinder(ServiceHandler serviceHandler) {
             mServiceHandler = serviceHandler;
@@ -380,7 +381,7 @@ public class OperationsService extends Service {
         OperationsService mService;
 
 
-        private ConcurrentLinkedQueue<Pair<Target, RemoteOperation>> mPendingOperations =
+        private final ConcurrentLinkedQueue<Pair<Target, RemoteOperation>> mPendingOperations =
             new ConcurrentLinkedQueue<>();
         private RemoteOperation mCurrentOperation;
         private Target mLastTarget;
@@ -416,11 +417,12 @@ public class OperationsService extends Service {
             if (next != null) {
                 mCurrentOperation = next.second;
                 RemoteOperationResult result;
+                OwnCloudAccount ocAccount = null;
+
                 try {
                     /// prepare client object to send the request to the ownCloud server
                     if (mLastTarget == null || !mLastTarget.equals(next.first)) {
                         mLastTarget = next.first;
-                        OwnCloudAccount ocAccount;
                         if (mLastTarget.mAccount != null) {
                             ocAccount = new OwnCloudAccount(mLastTarget.mAccount, mService);
                         } else {
@@ -430,19 +432,21 @@ public class OperationsService extends Service {
                             getClientFor(ocAccount, mService);
                     }
 
-                    /// perform the operation
-                    result = mCurrentOperation.execute(mOwnCloudClient);
-                } catch (AccountsException e) {
-                    if (mLastTarget.mAccount == null) {
-                        Log_OC.e(TAG, "Error while trying to get authorization for a NULL account",
-                                 e);
-                    } else {
-                        Log_OC.e(TAG, "Error while trying to get authorization for " +
-                            mLastTarget.mAccount.name, e);
-                    }
-                    result = new RemoteOperationResult(e);
+                    // perform the operation
+                    try {
+                        result = mCurrentOperation.execute(mOwnCloudClient);
+                    } catch (UnsupportedOperationException e) {
+                        // TODO remove - added to aid in transition to NextcloudClient
+
+                        if (ocAccount == null) {
+                            throw e;
+                        }
 
-                } catch (IOException e) {
+                        NextcloudClient nextcloudClient = OwnCloudClientManagerFactory.getDefaultSingleton()
+                            .getNextcloudClientFor(ocAccount, mService.getBaseContext());
+                        result = mCurrentOperation.run(nextcloudClient);
+                    }
+                } catch (AccountsException | IOException e) {
                     if (mLastTarget.mAccount == null) {
                         Log_OC.e(TAG, "Error while trying to get authorization for a NULL account",
                                  e);
@@ -451,6 +455,7 @@ public class OperationsService extends Service {
                             mLastTarget.mAccount.name, e);
                     }
                     result = new RemoteOperationResult(e);
+
                 } catch (Exception e) {
                     if (mLastTarget.mAccount == null) {
                         Log_OC.e(TAG, "Unexpected error for a NULL account", e);
@@ -537,10 +542,6 @@ public class OperationsService extends Service {
                                                                                        false);
                             updateLinkOperation.setHideFileDownload(hideFileDownload);
 
-//                            if (operationIntent.hasExtra(EXTRA_SHARE_PUBLIC_UPLOAD)) {
-//                                updateLinkOperation.setPublicUpload(true);
-//                            }
-
                             if (operationIntent.hasExtra(EXTRA_SHARE_PUBLIC_LABEL)) {
                                 updateLinkOperation.setLabel(operationIntent.getStringExtra(EXTRA_SHARE_PUBLIC_LABEL));
                             }

+ 7 - 7
app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt

@@ -19,11 +19,11 @@ import com.nextcloud.client.account.User
 import com.nextcloud.client.account.UserAccountManager
 import com.nextcloud.client.jobs.NotificationWork
 import com.nextcloud.client.network.ClientFactory.CreationException
+import com.nextcloud.common.NextcloudClient
 import com.owncloud.android.R
 import com.owncloud.android.databinding.NotificationsLayoutBinding
 import com.owncloud.android.datamodel.ArbitraryDataProvider
 import com.owncloud.android.datamodel.ArbitraryDataProviderImpl
-import com.owncloud.android.lib.common.OwnCloudClient
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.lib.resources.notifications.GetNotificationsRemoteOperation
 import com.owncloud.android.lib.resources.notifications.models.Notification
@@ -44,7 +44,7 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
 
     private var adapter: NotificationListAdapter? = null
     private var snackbar: Snackbar? = null
-    private var client: OwnCloudClient? = null
+    private var client: NextcloudClient? = null
     private var optionalUser: Optional<User>? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -213,16 +213,16 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
         val t = Thread {
             initializeAdapter()
             val getRemoteNotificationOperation = GetNotificationsRemoteOperation()
-            val result = getRemoteNotificationOperation.execute(client)
-            if (result.isSuccess && result.resultData != null) {
+            val result = client?.let { getRemoteNotificationOperation.execute(it) }
+            if (result?.isSuccess == true && result.resultData != null) {
                 runOnUiThread { populateList(result.resultData) }
             } else {
-                Log_OC.d(TAG, result.logMessage)
+                Log_OC.d(TAG, result?.logMessage)
                 // show error
                 runOnUiThread {
                     setEmptyContent(
                         getString(R.string.notifications_no_results_headline),
-                        result.logMessage
+                        result?.logMessage
                     )
                 }
             }
@@ -235,7 +235,7 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
         if (client == null && optionalUser?.isPresent == true) {
             try {
                 val user = optionalUser?.get()
-                client = clientFactory.create(user)
+                client = clientFactory.createNextcloudClient(user)
             } catch (e: CreationException) {
                 Log_OC.e(TAG, "Error initializing client", e)
             }

+ 3 - 3
app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java

@@ -36,9 +36,9 @@ import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
 import com.caverock.androidsvg.SVG;
 import com.google.android.material.button.MaterialButton;
 import com.nextcloud.android.common.ui.theme.utils.ColorRole;
+import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.NotificationListItemBinding;
-import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.resources.notifications.models.Action;
 import com.owncloud.android.lib.resources.notifications.models.Notification;
 import com.owncloud.android.lib.resources.notifications.models.RichObject;
@@ -71,11 +71,11 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
     private final ForegroundColorSpan foregroundColorSpanBlack;
 
     private final List<Notification> notificationsList;
-    private final OwnCloudClient client;
+    private final NextcloudClient client;
     private final NotificationsActivity notificationsActivity;
     private final ViewThemeUtils viewThemeUtils;
 
-    public NotificationListAdapter(OwnCloudClient client,
+    public NotificationListAdapter(NextcloudClient client,
                                    NotificationsActivity notificationsActivity,
                                    ViewThemeUtils viewThemeUtils) {
         this.notificationsList = new ArrayList<>();

+ 4 - 4
app/src/main/java/com/owncloud/android/ui/asynctasks/DeleteAllNotificationsTask.java

@@ -9,7 +9,7 @@ package com.owncloud.android.ui.asynctasks;
 
 import android.os.AsyncTask;
 
-import com.owncloud.android.lib.common.OwnCloudClient;
+import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.resources.notifications.DeleteAllNotificationsRemoteOperation;
 import com.owncloud.android.lib.resources.notifications.models.Action;
@@ -17,10 +17,10 @@ import com.owncloud.android.ui.activity.NotificationsActivity;
 import com.owncloud.android.ui.notifications.NotificationsContract;
 
 public class DeleteAllNotificationsTask extends AsyncTask<Action, Void, Boolean> {
-    private OwnCloudClient client;
-    private NotificationsContract.View notificationsActivity;
+    private NextcloudClient client;
+    private final NotificationsContract.View notificationsActivity;
 
-    public DeleteAllNotificationsTask(OwnCloudClient client, NotificationsActivity notificationsActivity) {
+    public DeleteAllNotificationsTask(NextcloudClient client, NotificationsActivity notificationsActivity) {
         this.client = client;
         this.notificationsActivity = notificationsActivity;
     }

+ 3 - 3
app/src/main/java/com/owncloud/android/ui/asynctasks/DeleteNotificationTask.java

@@ -9,7 +9,7 @@ package com.owncloud.android.ui.asynctasks;
 
 import android.os.AsyncTask;
 
-import com.owncloud.android.lib.common.OwnCloudClient;
+import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.resources.notifications.DeleteNotificationRemoteOperation;
 import com.owncloud.android.lib.resources.notifications.models.Action;
@@ -21,10 +21,10 @@ import com.owncloud.android.ui.notifications.NotificationsContract;
 public class DeleteNotificationTask extends AsyncTask<Action, Void, Boolean> {
     private Notification notification;
     private NotificationListAdapter.NotificationViewHolder holder;
-    private OwnCloudClient client;
+    private NextcloudClient client;
     private NotificationsContract.View notificationsActivity;
 
-    public DeleteNotificationTask(OwnCloudClient client, Notification notification,
+    public DeleteNotificationTask(NextcloudClient client, Notification notification,
                                   NotificationListAdapter.NotificationViewHolder holder,
                                   NotificationsActivity notificationsActivity) {
         this.client = client;

+ 26 - 31
app/src/main/java/com/owncloud/android/ui/asynctasks/NotificationExecuteActionTask.java

@@ -8,7 +8,12 @@ package com.owncloud.android.ui.asynctasks;
 
 import android.os.AsyncTask;
 
-import com.owncloud.android.lib.common.OwnCloudClient;
+import com.nextcloud.common.NextcloudClient;
+import com.nextcloud.common.OkHttpMethodBase;
+import com.nextcloud.operations.DeleteMethod;
+import com.nextcloud.operations.GetMethod;
+import com.nextcloud.operations.PostMethod;
+import com.nextcloud.operations.PutMethod;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.notifications.models.Action;
@@ -16,23 +21,20 @@ import com.owncloud.android.lib.resources.notifications.models.Notification;
 import com.owncloud.android.ui.activity.NotificationsActivity;
 import com.owncloud.android.ui.adapter.NotificationListAdapter;
 
-import org.apache.commons.httpclient.HttpMethod;
 import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.DeleteMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
-import org.apache.commons.httpclient.methods.Utf8PostMethod;
 
 import java.io.IOException;
 
+import okhttp3.RequestBody;
+
 public class NotificationExecuteActionTask extends AsyncTask<Action, Void, Boolean> {
 
-    private NotificationListAdapter.NotificationViewHolder holder;
-    private OwnCloudClient client;
-    private Notification notification;
-    private NotificationsActivity notificationsActivity;
+    private final NotificationListAdapter.NotificationViewHolder holder;
+    private final NextcloudClient client;
+    private final Notification notification;
+    private final NotificationsActivity notificationsActivity;
 
-    public NotificationExecuteActionTask(OwnCloudClient client,
+    public NotificationExecuteActionTask(NextcloudClient client,
                                          NotificationListAdapter.NotificationViewHolder holder,
                                          Notification notification,
                                          NotificationsActivity notificationsActivity) {
@@ -44,36 +46,29 @@ public class NotificationExecuteActionTask extends AsyncTask<Action, Void, Boole
 
     @Override
     protected Boolean doInBackground(Action... actions) {
-        HttpMethod method;
+        OkHttpMethodBase method;
         Action action = actions[0];
 
-        switch (action.type) {
-            case "GET":
-                method = new GetMethod(action.link);
-                break;
-
-            case "POST":
-                method = new Utf8PostMethod(action.link);
-                break;
-
-            case "DELETE":
-                method = new DeleteMethod(action.link);
-                break;
-
-            case "PUT":
-                method = new PutMethod(action.link);
-                break;
+        if (action.type == null || action.link == null) {
+            return Boolean.FALSE;
+        }
 
-            default:
+        switch (action.type) {
+            case "GET" -> method = new GetMethod(action.link, true);
+            case "POST" -> method = new PostMethod(action.link, true, RequestBody.create("", null));
+            case "DELETE" -> method = new DeleteMethod(action.link, true);
+            case "PUT" -> method = new PutMethod(action.link, true, null);
+            default -> {
                 // do nothing
                 return Boolean.FALSE;
+            }
         }
 
-        method.setRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE);
+        method.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE);
 
         int status;
         try {
-            status = client.executeMethod(method);
+            status = client.execute(method);
         } catch (IOException e) {
             Log_OC.e(this, "Execution of notification action failed: " + e);
             return Boolean.FALSE;

+ 1 - 1
build.gradle

@@ -10,7 +10,7 @@
  */
 buildscript {
     ext {
-        androidLibraryVersion ="26dc8477962f12356db840bb1a774f0186b38e4d"
+        androidLibraryVersion = "cda1b08aa81b74201177f29c2326abee62f32c15"
         androidPluginVersion = '8.4.0'
         androidxMediaVersion = '1.3.1'
         androidxTestVersion = "1.5.0"

+ 11 - 0
gradle/verification-metadata.xml

@@ -5805,6 +5805,17 @@
             <sha256 value="66afb9f2eea39427f6f03c14c5b82ca240157e22b8b2a764f0a7c8ad87cb2d3e" origin="Generated by Gradle" reason="Artifact is not signed"/>
          </artifact>
       </component>
+       <component group="com.github.nextcloud" name="android-library"
+           version="cda1b08aa81b74201177f29c2326abee62f32c15">
+           <artifact name="android-library-cda1b08aa81b74201177f29c2326abee62f32c15.aar">
+               <sha256 value="39c76af292201a94cf0753f296a18deb5512d88e97537f7c4e9a766ec50c1520"
+                   origin="Generated by Gradle" reason="Artifact is not signed" />
+           </artifact>
+           <artifact name="android-library-cda1b08aa81b74201177f29c2326abee62f32c15.module">
+               <sha256 value="c7686ef2125d141196bb3e1937a12f0647e5300accc132ddc11dfe37f9db66f2"
+                   origin="Generated by Gradle" reason="Artifact is not signed" />
+           </artifact>
+       </component>
       <component group="com.github.nextcloud" name="android-library" version="e7a13d03c1e7549a301edb8b4b58d1c5dda84123">
          <artifact name="android-library-e7a13d03c1e7549a301edb8b4b58d1c5dda84123.aar">
             <sha256 value="57ab4fd7c922875a7e0b5feac20aa27ab5df0fd3b4e042f92ed727c0b6316e81" origin="Generated by Gradle" reason="Artifact is not signed"/>

+ 16 - 4
scripts/analysis/detectWrongSettings.sh

@@ -4,12 +4,24 @@
 # SPDX-FileCopyrightText: 2016 Tobias Kaminsky <tobias@kaminsky.me>
 # SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
 
-snapshotCount=$(./gradlew dependencies | grep SNAPSHOT | grep -v "com.github.nextcloud:android-library" -c)
+snapshotCount=$(./gradlew dependencies | grep SNAPSHOT -c)
 betaCount=$(grep "<bool name=\"is_beta\">true</bool>" app/src/main/res/values/setup.xml -c)
+libraryHash=$(grep androidLibraryVersion build.gradle | cut -f2 -d'"' | grep "^[0-9a-zA-Z]\{40\}$" -c)
 
-if [[ $snapshotCount -eq 0 && $betaCount -eq 0 ]] ; then
-    exit 0
-else
+
+if [[ $snapshotCount -gt 0 ]] ; then
+    echo "Snapshot found in dependencies"
+    exit 1
+fi
+if [[ $betaCount -gt 0 ]] ; then
+    echo "Beta is set in setup.xml"
     exit 1
 fi
+ 
+if [[ $libraryHash -eq 0 ]] ; then
+    echo "Library hash is wrong!"
+    exit 1
+fi
+
+exit 0