Skip to content

Commit 2d9b783

Browse files
committed
Login related customization.
NMC-3250 -> opening login flow in internal webview instead of external browser. NMC-1885: Splash screen customized NMC-571 -- removed usesCleartextTraffic from Manifest. NMC-3773 -- close app on access denied error comes NMC-3964 -- fix app crash on logout for Xiaomi Android 15 devices
1 parent 379382e commit 2d9b783

File tree

12 files changed

+232
-238
lines changed

12 files changed

+232
-238
lines changed

app/src/androidTest/java/com/nmc/android/ui/LauncherActivityIT.kt

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,72 +6,33 @@
66
*/
77
package com.nmc.android.ui
88

9-
import androidx.annotation.UiThread
10-
import androidx.test.core.app.launchActivity
119
import androidx.test.espresso.Espresso.onView
12-
import androidx.test.espresso.IdlingRegistry
1310
import androidx.test.espresso.assertion.ViewAssertions.matches
14-
import androidx.test.espresso.matcher.ViewMatchers
1511
import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
16-
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
1712
import androidx.test.espresso.matcher.ViewMatchers.withId
13+
import androidx.test.espresso.matcher.ViewMatchers.withText
14+
import androidx.test.ext.junit.rules.ActivityScenarioRule
1815
import androidx.test.ext.junit.runners.AndroidJUnit4
1916
import com.owncloud.android.AbstractIT
2017
import com.owncloud.android.R
21-
import com.owncloud.android.utils.EspressoIdlingResource
22-
import org.junit.After
23-
import org.junit.Before
18+
import org.junit.Rule
2419
import org.junit.Test
2520
import org.junit.runner.RunWith
2621

2722
@RunWith(AndroidJUnit4::class)
2823
class LauncherActivityIT : AbstractIT() {
2924

30-
@Before
31-
fun registerIdlingResource() {
32-
IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource)
33-
}
34-
35-
@After
36-
fun unregisterIdlingResource() {
37-
IdlingRegistry.getInstance().unregister(EspressoIdlingResource.countingIdlingResource)
38-
}
39-
40-
@Test
41-
@UiThread
42-
fun testSplashScreenWithEmptyTitlesShouldHideTitles() {
43-
launchActivity<LauncherActivity>().use { scenario ->
44-
scenario.onActivity { _ ->
45-
onIdleSync {
46-
onView(withId(R.id.ivSplash)).check(matches(isCompletelyDisplayed()))
47-
onView(
48-
withId(R.id.splashScreenBold)
49-
).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
50-
onView(
51-
withId(R.id.splashScreenNormal)
52-
).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
53-
}
54-
}
55-
}
56-
}
25+
@get:Rule
26+
val activityRule = ActivityScenarioRule(LauncherActivity::class.java)
5727

5828
@Test
59-
@UiThread
60-
fun testSplashScreenWithTitlesShouldShowTitles() {
61-
launchActivity<LauncherActivity>().use { scenario ->
62-
scenario.onActivity {
63-
onIdleSync {
64-
onView(withId(R.id.ivSplash)).check(matches(isCompletelyDisplayed()))
65-
66-
EspressoIdlingResource.increment()
67-
it.setSplashTitles("Example", "Cloud")
68-
EspressoIdlingResource.decrement()
69-
70-
val onePercentArea = ViewMatchers.isDisplayingAtLeast(1)
71-
onView(withId(R.id.splashScreenBold)).check(matches(onePercentArea))
72-
onView(withId(R.id.splashScreenNormal)).check(matches(onePercentArea))
73-
}
74-
}
75-
}
29+
fun verifyUIElements() {
30+
onView(withId(R.id.ivSplash)).check(matches(isCompletelyDisplayed()))
31+
onView(withId(R.id.splashScreenBold)).check(matches(isCompletelyDisplayed()))
32+
onView(withId(R.id.splashScreenNormal)).check(matches(isCompletelyDisplayed()))
33+
34+
onView(withId(R.id.splashScreenBold)).check(matches(withText("Magenta")))
35+
onView(withId(R.id.splashScreenNormal)).check(matches(withText("CLOUD")))
36+
shortSleep()
7637
}
7738
}

app/src/debug/res/values/setup.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<!-- webview_login_url should be empty in debug mode to show login url input screen
4+
this will be useful in switching the environments during testing -->
5+
<string name="webview_login_url" translatable="false" />
6+
</resources>

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@
123123
android:supportsRtl="true"
124124
android:enableOnBackInvokedCallback="false"
125125
android:theme="@style/Theme.ownCloud.Toolbar"
126-
android:usesCleartextTraffic="true"
127126
tools:ignore="UnusedAttribute"
128127
tools:replace="android:allowBackup">
129128

app/src/main/java/com/owncloud/android/MainApp.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import android.os.StrictMode;
3838
import android.text.TextUtils;
3939
import android.view.WindowManager;
40+
import android.webkit.WebView;
4041

4142
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
4243
import com.nextcloud.appReview.InAppReviewHelper;
@@ -382,6 +383,8 @@ public void onCreate() {
382383
networkChangeReceiver = new NetworkChangeReceiver(this, connectivityService);
383384
registerNetworkChangeReceiver();
384385

386+
configureWebViewForMultiProcess();
387+
385388
if (!MDMConfig.INSTANCE.sendFilesSupport(this)) {
386389
disableDocumentsStorageProvider();
387390
}
@@ -397,6 +400,18 @@ public void disableDocumentsStorageProvider() {
397400
packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
398401
}
399402

403+
// NMC-3964 fix
404+
// crash was happening for Xiaomi Android 15 devices
405+
private void configureWebViewForMultiProcess(){
406+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
407+
String processName = getProcessName();
408+
if (processName != null && !processName.equals(getPackageName())) {
409+
// this ensures each process uses a unique directory, preventing conflicts.
410+
WebView.setDataDirectorySuffix(processName);
411+
}
412+
}
413+
}
414+
400415
private final LifecycleEventObserver lifecycleEventObserver = ((lifecycleOwner, event) -> {
401416
if (event == Lifecycle.Event.ON_START) {
402417
Log_OC.d(TAG, "APP IN FOREGROUND");

0 commit comments

Comments
 (0)