Browse Source

Merge pull request #8405 from nextcloud/grant-apps-access-to-trashbin

Allow 3rd party apps to open the trashbin for a specific account
Tobias Kaminsky 4 years ago
parent
commit
51b82fcdd4

+ 44 - 0
src/androidTest/java/com/owncloud/android/ui/trashbin/TrashbinActivityIT.kt

@@ -21,8 +21,13 @@
  */
 package com.owncloud.android.ui.trashbin
 
+import android.accounts.Account
+import android.accounts.AccountManager
+import android.content.Intent
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import com.owncloud.android.AbstractIT
+import com.owncloud.android.MainApp
+import com.owncloud.android.lib.common.accounts.AccountUtils
 import com.owncloud.android.utils.ScreenshotTest
 import org.junit.Rule
 import org.junit.Test
@@ -100,4 +105,43 @@ class TrashbinActivityIT : AbstractIT() {
 
         screenshot(sut)
     }
+
+    @Test
+    fun normalUser() {
+        val sut: TrashbinActivity = activityRule.launchActivity(null)
+
+        val trashbinRepository = TrashbinLocalRepository(TestCase.EMPTY)
+
+        sut.trashbinPresenter = TrashbinPresenter(trashbinRepository, sut)
+
+        sut.runOnUiThread { sut.showUser() }
+
+        shortSleep()
+
+        screenshot(sut)
+    }
+
+    @Test
+    fun differentUser() {
+        val temp = Account("differentUser@https://server.com", MainApp.getAccountType(targetContext))
+
+        val platformAccountManager = AccountManager.get(targetContext)
+        platformAccountManager.addAccountExplicitly(temp, "password", null)
+        platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, "https://server.com")
+        platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, "differentUser")
+
+        val intent = Intent()
+        intent.putExtra(Intent.EXTRA_USER, "differentUser@https://server.com")
+        val sut: TrashbinActivity = activityRule.launchActivity(intent)
+
+        val trashbinRepository = TrashbinLocalRepository(TestCase.EMPTY)
+
+        sut.trashbinPresenter = TrashbinPresenter(trashbinRepository, sut)
+
+        sut.runOnUiThread { sut.showUser() }
+
+        shortSleep()
+
+        screenshot(sut)
+    }
 }

+ 1 - 0
src/main/AndroidManifest.xml

@@ -346,6 +346,7 @@
         <activity android:name=".ui.activity.UploadListActivity" />
         <activity
             android:name=".ui.trashbin.TrashbinActivity"
+            android:exported="true"
             android:configChanges="orientation|screenSize|keyboardHidden"/>
         <activity android:name="com.nextcloud.client.onboarding.WhatsNewActivity"
                   android:theme="@style/Theme.ownCloud.noActionBar.Login" />

+ 30 - 3
src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

@@ -23,12 +23,14 @@
  */
 package com.owncloud.android.ui.trashbin;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.PopupMenu;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.client.account.CurrentAccountProvider;
@@ -36,6 +38,7 @@ import com.nextcloud.client.account.User;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.network.ClientFactory;
 import com.nextcloud.client.preferences.AppPreferences;
+import com.nextcloud.java.util.Optional;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.TrashbinActivityBinding;
 import com.owncloud.android.lib.resources.trashbin.model.TrashbinFile;
@@ -82,8 +85,21 @@ public class TrashbinActivity extends DrawerActivity implements
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        final User user = accountProvider.getUser();
-        final RemoteTrashbinRepository trashRepository = new RemoteTrashbinRepository(user, clientFactory);
+        final User currentUser = getUser().orElse(accountProvider.getUser());
+        final String targetAccount = getIntent().getStringExtra(Intent.EXTRA_USER);
+        if (targetAccount != null && !currentUser.nameEquals(targetAccount)) {
+            final Optional<User> targetUser = getUserAccountManager().getUser(targetAccount);
+            if (targetUser.isPresent()) {
+                setUser(targetUser.get());
+            } else {
+                Toast.makeText(this, R.string.associated_account_not_found, Toast.LENGTH_LONG).show();
+                finish();
+                return;
+            }
+        }
+
+        final RemoteTrashbinRepository trashRepository =
+            new RemoteTrashbinRepository(getUser().orElse(accountProvider.getUser()), clientFactory);
         trashbinPresenter = new TrashbinPresenter(trashRepository, this);
 
         binding = TrashbinActivityBinding.inflate(getLayoutInflater());
@@ -118,7 +134,7 @@ public class TrashbinActivity extends DrawerActivity implements
             getStorageManager(),
             preferences,
             this,
-            getUserAccountManager().getUser()
+            getUser().orElse(accountProvider.getUser())
         );
         recyclerView.setAdapter(trashbinListAdapter);
         recyclerView.setHasFixedSize(true);
@@ -269,6 +285,17 @@ public class TrashbinActivity extends DrawerActivity implements
         binding.list.setVisibility(View.GONE);
     }
 
+    @VisibleForTesting
+    public void showUser() {
+        binding.loadingContent.setVisibility(View.GONE);
+        binding.list.setVisibility(View.VISIBLE);
+        binding.swipeContainingList.setRefreshing(false);
+
+        binding.emptyList.emptyListViewText.setText(getUser().get().getAccountName());
+        binding.emptyList.emptyListViewText.setVisibility(View.VISIBLE);
+        binding.emptyList.emptyListView.setVisibility(View.VISIBLE);
+    }
+
     @Override
     public void showError(int message) {
         if (active) {