Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,6 @@ class ActivitiesActivityIT : AbstractIT() {
@ScreenshotTest
fun openDrawer() {
launchActivity<ActivitiesActivity>().use { scenario ->
scenario.onActivity { sut ->
sut.dismissSnackbar()
}

onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())

scenario.onActivity { sut ->
Expand All @@ -54,7 +50,6 @@ class ActivitiesActivityIT : AbstractIT() {
fun loading() {
launchActivity<ActivitiesActivity>().use { scenario ->
scenario.onActivity { sut ->
sut.dismissSnackbar()
sut.binding.emptyList.root.visibility = View.GONE
sut.binding.swipeContainingList.visibility = View.GONE
sut.binding.loadingContent.visibility = View.VISIBLE
Expand All @@ -76,7 +71,6 @@ class ActivitiesActivityIT : AbstractIT() {
scenario.onActivity { sut ->
sut.showActivities(mutableListOf(), nextcloudClient, -1)
sut.setProgressIndicatorState(false)
sut.dismissSnackbar()
}

val screenShotName = createName(testClassName + "_" + "empty", "")
Expand Down Expand Up @@ -170,7 +164,6 @@ class ActivitiesActivityIT : AbstractIT() {
scenario.onActivity { sut ->
sut.showActivities(activities as List<Any>?, nextcloudClient, -1)
sut.setProgressIndicatorState(false)
sut.dismissSnackbar()
}

val screenShotName = createName(testClassName + "_" + "showActivities", "")
Expand All @@ -189,7 +182,6 @@ class ActivitiesActivityIT : AbstractIT() {
scenario.onActivity { sut ->
sut.showEmptyContent("Error", "Error! Please try again later!")
sut.setProgressIndicatorState(false)
sut.dismissSnackbar()
}

val screenShotName = createName(testClassName + "_" + "error", "")
Expand Down
142 changes: 142 additions & 0 deletions app/src/androidTest/java/com/owncloud/android/utils/SnackbarTests.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.owncloud.android.utils

import android.app.Activity
import android.app.Instrumentation
import android.content.Intent
import androidx.annotation.StringRes
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.test.core.app.launchActivity
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.Intents.intending
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withText
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.nextcloud.client.onboarding.FirstRunActivity
import com.nextcloud.test.TestActivity
import com.owncloud.android.R
import com.owncloud.android.authentication.AuthenticatorActivity
import org.hamcrest.Matchers.anyOf
import org.junit.After
import org.junit.Before
import org.junit.Test

class SnackbarTests {

class NormalTestFragment : Fragment()
class DialogTestFragment : DialogFragment()
class BottomSheetTestFragment : BottomSheetDialogFragment()

@Before
fun setUp() {
Intents.init()
val cancelledResult = Instrumentation.ActivityResult(Activity.RESULT_CANCELED, Intent())
intending(
anyOf(
hasComponent(AuthenticatorActivity::class.java.name),
hasComponent(FirstRunActivity::class.java.name)
)
).respondWith(cancelledResult)
}

@After
fun tearDown() {
Intents.release()
}

private fun assertSnackbarVisible(msg: String) {
onView(withText(msg)).check(matches(isDisplayed()))
}

private fun assertSnackbarVisible(@StringRes msgRes: Int) {
onView(withText(msgRes)).check(matches(isDisplayed()))
}

private fun testFragmentSnackbar(fragment: Fragment, @StringRes msgRes: Int) {
launchActivity<TestActivity>().use { scenario ->
scenario.onActivity { sut ->
sut.addFragment(fragment)
}
scenario.onActivity {
DisplayUtils.showSnackMessage(fragment, msgRes)
}
assertSnackbarVisible(msgRes)
}
}

@Test
fun testNormalFragmentSnackbar() {
testFragmentSnackbar(NormalTestFragment(), R.string.app_name)
}

@Test
fun testDialogFragmentSnackbar() {
testFragmentSnackbar(DialogTestFragment(), R.string.app_name)
}

@Test
fun testBottomSheetFragmentSnackbar() {
testFragmentSnackbar(BottomSheetTestFragment(), R.string.app_name)
}

@Test
fun testNullFragmentSnackbarShouldNotCrash() {
DisplayUtils.showSnackMessage(null as Fragment?, R.string.app_name)
}

@Test
fun testActivityStringResSnackbar() {
launchActivity<TestActivity>().use { scenario ->
scenario.onActivity { sut ->
DisplayUtils.showSnackMessage(sut, R.string.app_name)
}
assertSnackbarVisible(R.string.app_name)
}
}

@Test
fun testActivityStringSnackbar() {
launchActivity<TestActivity>().use { scenario ->
var message = ""
scenario.onActivity { sut ->
message = sut.getString(R.string.app_name)
DisplayUtils.showSnackMessage(sut, message)
}
assertSnackbarVisible(message)
}
}

@Test
fun testViewStringResSnackbar() {
launchActivity<TestActivity>().use { scenario ->
scenario.onActivity { sut ->
val contentView = sut.findViewById<android.view.View>(android.R.id.content)
DisplayUtils.showSnackMessage(contentView, R.string.app_name)
}
assertSnackbarVisible(R.string.app_name)
}
}

@Test
fun testViewStringSnackbar() {
launchActivity<TestActivity>().use { scenario ->
var message = ""
scenario.onActivity { sut ->
message = sut.getString(R.string.app_name)
val contentView = sut.findViewById<android.view.View>(android.R.id.content)
DisplayUtils.showSnackMessage(contentView, message)
}
assertSnackbarVisible(message)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import android.view.MenuItem;
import android.view.View;

import com.google.android.material.snackbar.Snackbar;
import com.nextcloud.client.network.ClientFactory;
import com.nextcloud.client.network.ConnectivityService;
import com.nextcloud.common.NextcloudClient;
Expand Down Expand Up @@ -54,7 +53,6 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
private long lastGiven;
private boolean isLoadingActivities;
private ActivitiesContract.ActionListener actionListener;
private Snackbar snackbar;

@Inject ActivitiesRepository activitiesRepository;
@Inject FilesRepository filesRepository;
Expand Down Expand Up @@ -191,7 +189,7 @@ public void showActivities(List<Object> activities, NextcloudClient client, long
public void showActivitiesLoadError(String error) {
connectivityService.isNetworkAndServerAvailable(result -> {
if (result) {
snackbar = DisplayUtils.showSnackMessage(this, error);
DisplayUtils.showSnackMessage(this, error);
} else {
showEmptyContent(getString(R.string.server_not_reachable),
getString(R.string.server_not_reachable_content));
Expand All @@ -217,12 +215,12 @@ public void showActivityDetailUI(OCFile ocFile) {

@Override
public void showActivityDetailUIIsNull() {
snackbar = DisplayUtils.showSnackMessage(this, R.string.file_not_found);
DisplayUtils.showSnackMessage(this, R.string.file_not_found);
}

@Override
public void showActivityDetailError(String error) {
snackbar = DisplayUtils.showSnackMessage(this, error);
DisplayUtils.showSnackMessage(this, error);
}

@Override
Expand Down Expand Up @@ -255,12 +253,4 @@ protected void onStop() {

actionListener.onStop();
}

@VisibleForTesting
public void dismissSnackbar() {
if (snackbar != null && snackbar.isShown()) {
snackbar.dismiss();
snackbar = null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -186,10 +186,7 @@ private void fetchSharees() {
return Unit.INSTANCE;
}, () -> {
showShareContainer();
final var view = getView();
if (view != null) {
DisplayUtils.showSnackMessage(view, R.string.error_fetching_sharees);
}
DisplayUtils.showSnackMessage(this, R.string.error_fetching_sharees);
return Unit.INSTANCE;
});
}
Expand Down Expand Up @@ -414,10 +411,7 @@ public void copyInternalLink() {
OwnCloudAccount account = accountManager.getCurrentOwnCloudAccount();

if (account == null) {
final var view = getView();
if (view != null) {
DisplayUtils.showSnackMessage(view, getString(R.string.could_not_retrieve_url));
}
DisplayUtils.showSnackMessage(this, R.string.could_not_retrieve_url);
return;
}

Expand Down Expand Up @@ -581,10 +575,7 @@ public void refreshSharesFromDB() {
}

if (internalShareeListAdapter == null) {
final var view = getView();
if (view != null) {
DisplayUtils.showSnackMessage(view, getString(R.string.could_not_retrieve_shares));
}
DisplayUtils.showSnackMessage(this, R.string.could_not_retrieve_shares);
return;
}

Expand Down Expand Up @@ -642,7 +633,7 @@ private void pickContactEmail() {
if (intent.resolveActivity(requireContext().getPackageManager()) != null) {
onContactSelectionResultLauncher.launch(intent);
} else {
DisplayUtils.showSnackMessage(requireActivity(), getString(R.string.file_detail_sharing_fragment_no_contact_app_message));
DisplayUtils.showSnackMessage(this, R.string.file_detail_sharing_fragment_no_contact_app_message);
}
}

Expand All @@ -665,16 +656,16 @@ private void handleContactResult(@NonNull Uri contactUri) {
binding.searchView.requestFocus();
});
} else {
DisplayUtils.showSnackMessage(binding.getRoot(), R.string.email_pick_failed);
DisplayUtils.showSnackMessage(this, R.string.email_pick_failed);
Log_OC.e(FileDetailSharingFragment.class.getSimpleName(), "Failed to pick email address.");
}
} else {
DisplayUtils.showSnackMessage(binding.getRoot(), R.string.email_pick_failed);
DisplayUtils.showSnackMessage(this, R.string.email_pick_failed);
Log_OC.e(FileDetailSharingFragment.class.getSimpleName(), "Failed to pick email address as no Email found.");
}
cursor.close();
} else {
DisplayUtils.showSnackMessage(binding.getRoot(), R.string.email_pick_failed);
DisplayUtils.showSnackMessage(this, R.string.email_pick_failed);
Log_OC.e(FileDetailSharingFragment.class.getSimpleName(), "Failed to pick email address as Cursor is null.");
}
}
Expand Down Expand Up @@ -737,10 +728,7 @@ public void unShare(OCShare share) {
fileDataStorageManager.updateFileEntity(entity);
}
} else {
final var view = getView();
if (view != null) {
DisplayUtils.showSnackMessage(view, getString(R.string.failed_update_ui));
}
DisplayUtils.showSnackMessage(this, R.string.failed_update_ui);
}
}

Expand Down Expand Up @@ -778,7 +766,7 @@ public void openShareDetailWithCustomPermissions(OCShare share) {
if (isGranted) {
pickContactEmail();
} else {
DisplayUtils.showSnackMessage(binding.getRoot(), R.string.contact_no_permission);
DisplayUtils.showSnackMessage(this, R.string.contact_no_permission);
}
});

Expand All @@ -789,13 +777,13 @@ public void openShareDetailWithCustomPermissions(OCShare share) {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent intent = result.getData();
if (intent == null) {
DisplayUtils.showSnackMessage(binding.getRoot(), R.string.email_pick_failed);
DisplayUtils.showSnackMessage(this, R.string.email_pick_failed);
return;
}

Uri contactUri = intent.getData();
if (contactUri == null) {
DisplayUtils.showSnackMessage(binding.getRoot(), R.string.email_pick_failed);
DisplayUtils.showSnackMessage(this, R.string.email_pick_failed);
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -752,14 +752,14 @@ class FileDetailsSharingProcessFragment :
@Suppress("ReturnCount")
private fun validateShareProcessFirst() {
if (permission == OCShare.NO_PERMISSION) {
DisplayUtils.showSnackMessage(binding.root, R.string.no_share_permission_selected)
DisplayUtils.showSnackMessage(this, R.string.no_share_permission_selected)
return
}

if (binding.shareProcessSetPasswordSwitch.isChecked &&
binding.shareProcessEnterPassword.text?.isBlank() == true
) {
DisplayUtils.showSnackMessage(binding.root, R.string.share_link_empty_password)
DisplayUtils.showSnackMessage(this, R.string.share_link_empty_password)
return
}

Expand All @@ -773,7 +773,7 @@ class FileDetailsSharingProcessFragment :
if (binding.shareProcessChangeNameSwitch.isChecked &&
binding.shareProcessChangeName.text?.isBlank() == true
) {
DisplayUtils.showSnackMessage(binding.root, R.string.label_empty)
DisplayUtils.showSnackMessage(this, R.string.label_empty)
return
}

Expand All @@ -790,13 +790,13 @@ class FileDetailsSharingProcessFragment :
@Suppress("ReturnCount")
private fun createShareOrUpdateNoteShare() {
if (!isAnySharePermissionChecked()) {
DisplayUtils.showSnackMessage(requireActivity(), R.string.share_option_required)
DisplayUtils.showSnackMessage(this, R.string.share_option_required)
return
}

val noteText = binding.noteText.text.toString().trim()
if (file == null && (share != null && share?.note == noteText)) {
DisplayUtils.showSnackMessage(requireActivity(), R.string.share_cannot_update_empty_note)
DisplayUtils.showSnackMessage(this, R.string.share_cannot_update_empty_note)
return
}

Expand All @@ -807,7 +807,7 @@ class FileDetailsSharingProcessFragment :
}

file == null -> {
DisplayUtils.showSnackMessage(requireActivity(), R.string.file_not_found_cannot_share)
DisplayUtils.showSnackMessage(this, R.string.file_not_found_cannot_share)
return
}

Expand Down
Loading
Loading