![benoitm@matrix.org](/assets/img/avatar_default.png)
![Benoit Marty](/assets/img/avatar_default.png)
20 changed files with 442 additions and 5 deletions
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.x.licenses |
||||
|
||||
import android.app.Activity |
||||
import com.squareup.anvil.annotations.ContributesBinding |
||||
import io.element.android.features.preferences.api.OpenSourceLicensesProvider |
||||
import io.element.android.libraries.di.AppScope |
||||
import javax.inject.Inject |
||||
|
||||
@ContributesBinding(AppScope::class) |
||||
class FdroidOpenSourceLicensesProvider @Inject constructor() : OpenSourceLicensesProvider { |
||||
override val hasOpenSourceLicenses: Boolean = false |
||||
|
||||
override fun navigateToOpenSourceLicenses(activity: Activity) { |
||||
error("Not supported, please ensure that hasOpenSourcesLicenses is true before calling this method") |
||||
} |
||||
} |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
|
||||
<application> |
||||
<activity |
||||
android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity" |
||||
android:theme="@style/Theme.OssLicenses" /> |
||||
<activity |
||||
android:name="com.google.android.gms.oss.licenses.OssLicensesActivity" |
||||
android:theme="@style/Theme.OssLicenses" /> |
||||
</application> |
||||
|
||||
</manifest> |
@ -0,0 +1,37 @@
@@ -0,0 +1,37 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.x.licenses |
||||
|
||||
import android.app.Activity |
||||
import android.content.Intent |
||||
import com.google.android.gms.oss.licenses.OssLicensesMenuActivity |
||||
import com.squareup.anvil.annotations.ContributesBinding |
||||
import io.element.android.features.preferences.api.OpenSourceLicensesProvider |
||||
import io.element.android.libraries.di.AppScope |
||||
import io.element.android.libraries.ui.strings.CommonStrings |
||||
import javax.inject.Inject |
||||
|
||||
@ContributesBinding(AppScope::class) |
||||
class OssOpenSourcesLicensesProvider @Inject constructor() : OpenSourceLicensesProvider { |
||||
override val hasOpenSourceLicenses: Boolean = true |
||||
|
||||
override fun navigateToOpenSourceLicenses(activity: Activity) { |
||||
val title = activity.getString(CommonStrings.common_open_source_licenses) |
||||
OssLicensesMenuActivity.setActivityTitle(title) |
||||
activity.startActivity(Intent(activity, OssLicensesMenuActivity::class.java)) |
||||
} |
||||
} |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- |
||||
~ Copyright (c) 2024 New Vector Ltd |
||||
~ |
||||
~ Licensed under the Apache License, Version 2.0 (the "License"); |
||||
~ you may not use this file except in compliance with the License. |
||||
~ You may obtain a copy of the License at |
||||
~ |
||||
~ https://www.apache.org/licenses/LICENSE-2.0 |
||||
~ |
||||
~ Unless required by applicable law or agreed to in writing, software |
||||
~ distributed under the License is distributed on an "AS IS" BASIS, |
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
~ See the License for the specific language governing permissions and |
||||
~ limitations under the License. |
||||
--> |
||||
|
||||
<resources> |
||||
|
||||
<style name="Theme.OssLicenses.v27" parent="Base.Theme.OssLicenses"> |
||||
<item name="android:windowLightNavigationBar">false</item> |
||||
</style> |
||||
|
||||
<style name="Theme.OssLicenses" parent="Theme.OssLicenses.v27"/> |
||||
|
||||
</resources> |
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- |
||||
~ Copyright (c) 2024 New Vector Ltd |
||||
~ |
||||
~ Licensed under the Apache License, Version 2.0 (the "License"); |
||||
~ you may not use this file except in compliance with the License. |
||||
~ You may obtain a copy of the License at |
||||
~ |
||||
~ https://www.apache.org/licenses/LICENSE-2.0 |
||||
~ |
||||
~ Unless required by applicable law or agreed to in writing, software |
||||
~ distributed under the License is distributed on an "AS IS" BASIS, |
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
~ See the License for the specific language governing permissions and |
||||
~ limitations under the License. |
||||
--> |
||||
|
||||
<resources> |
||||
|
||||
<!-- Use a few colors from compoundColorsLight --> |
||||
<!-- DarkColorTokens.colorThemeBg --> |
||||
<color name="colorThemeBg">#FF101317</color> |
||||
<!-- DarkColorTokens.colorGray1400 --> |
||||
<color name="textPrimary">#FFEBEEF2</color> |
||||
<!-- DarkColorTokens.colorGray900 --> |
||||
<color name="textSecondary">#ff808994</color> |
||||
|
||||
<style name="Base.Theme.OssLicenses" parent="Theme.MaterialComponents"> |
||||
<!-- Background of title bar --> |
||||
<item name="colorPrimary">@color/colorThemeBg</item> |
||||
<!-- Background of the screen --> |
||||
<item name="android:colorBackground">@color/colorThemeBg</item> |
||||
<!-- Text of the licenses --> |
||||
<item name="android:textColor">@color/textSecondary</item> |
||||
<!-- Title, back button and license item text color --> |
||||
<item name="android:textColorPrimary">@color/textPrimary</item> |
||||
<!-- Background of status bar --> |
||||
<item name="android:statusBarColor">@color/colorThemeBg</item> |
||||
<item name="android:windowLightStatusBar">false</item> |
||||
<!-- Background of navigation bar --> |
||||
<item name="android:navigationBarColor">@color/colorThemeBg</item> |
||||
</style> |
||||
|
||||
<style name="Theme.OssLicenses" parent="Base.Theme.OssLicenses" /> |
||||
|
||||
</resources> |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- |
||||
~ Copyright (c) 2024 New Vector Ltd |
||||
~ |
||||
~ Licensed under the Apache License, Version 2.0 (the "License"); |
||||
~ you may not use this file except in compliance with the License. |
||||
~ You may obtain a copy of the License at |
||||
~ |
||||
~ https://www.apache.org/licenses/LICENSE-2.0 |
||||
~ |
||||
~ Unless required by applicable law or agreed to in writing, software |
||||
~ distributed under the License is distributed on an "AS IS" BASIS, |
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
~ See the License for the specific language governing permissions and |
||||
~ limitations under the License. |
||||
--> |
||||
|
||||
<resources> |
||||
|
||||
<style name="Theme.OssLicenses.Light.v27" parent="Base.Theme.OssLicenses.Light"> |
||||
<item name="android:windowLightNavigationBar">true</item> |
||||
</style> |
||||
|
||||
<style name="Theme.OssLicenses" parent="Theme.OssLicenses.Light.v27"/> |
||||
|
||||
</resources> |
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- |
||||
~ Copyright (c) 2024 New Vector Ltd |
||||
~ |
||||
~ Licensed under the Apache License, Version 2.0 (the "License"); |
||||
~ you may not use this file except in compliance with the License. |
||||
~ You may obtain a copy of the License at |
||||
~ |
||||
~ https://www.apache.org/licenses/LICENSE-2.0 |
||||
~ |
||||
~ Unless required by applicable law or agreed to in writing, software |
||||
~ distributed under the License is distributed on an "AS IS" BASIS, |
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
~ See the License for the specific language governing permissions and |
||||
~ limitations under the License. |
||||
--> |
||||
|
||||
<resources> |
||||
|
||||
<style name="NoElevationToolbar" parent="Widget.MaterialComponents.Toolbar"> |
||||
<item name="android:elevation">0dp</item> |
||||
</style> |
||||
|
||||
</resources> |
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- |
||||
~ Copyright (c) 2024 New Vector Ltd |
||||
~ |
||||
~ Licensed under the Apache License, Version 2.0 (the "License"); |
||||
~ you may not use this file except in compliance with the License. |
||||
~ You may obtain a copy of the License at |
||||
~ |
||||
~ https://www.apache.org/licenses/LICENSE-2.0 |
||||
~ |
||||
~ Unless required by applicable law or agreed to in writing, software |
||||
~ distributed under the License is distributed on an "AS IS" BASIS, |
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
~ See the License for the specific language governing permissions and |
||||
~ limitations under the License. |
||||
--> |
||||
|
||||
<resources> |
||||
|
||||
<!-- Use a few colors from compoundColorsLight --> |
||||
<!-- LightColorTokens.colorThemeBg --> |
||||
<color name="colorThemeBg">#FFFFFFFF</color> |
||||
<!-- LightColorTokens.colorGray1400 --> |
||||
<color name="textPrimary">#FF1B1D22</color> |
||||
<!-- LightColorTokens.colorGray900 --> |
||||
<color name="textSecondary">#FF656D77</color> |
||||
|
||||
<style name="Base.Theme.OssLicenses.Light" parent="Theme.MaterialComponents.Light"> |
||||
<!-- Background of title bar --> |
||||
<item name="colorPrimary">@color/colorThemeBg</item> |
||||
<!-- Background of the screen --> |
||||
<item name="android:colorBackground">@color/colorThemeBg</item> |
||||
<!-- Text of the licenses --> |
||||
<item name="android:textColor">@color/textSecondary</item> |
||||
<!-- Title, back button and license item text color --> |
||||
<item name="android:textColorPrimary">@color/textPrimary</item> |
||||
<!-- Background of status bar --> |
||||
<item name="android:statusBarColor">@color/colorThemeBg</item> |
||||
<item name="android:windowLightStatusBar">true</item> |
||||
<!-- Background of navigation bar --> |
||||
<item name="android:navigationBarColor">@color/colorThemeBg</item> |
||||
<!-- Try to remove Toolbar elevation, but it does not work :/ --> |
||||
<item name="toolbarStyle">@style/NoElevationToolbar</item> |
||||
</style> |
||||
|
||||
<style name="Theme.OssLicenses" parent="Base.Theme.OssLicenses.Light" /> |
||||
|
||||
</resources> |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.preferences.api |
||||
|
||||
import android.app.Activity |
||||
|
||||
interface OpenSourceLicensesProvider { |
||||
val hasOpenSourceLicenses: Boolean |
||||
fun navigateToOpenSourceLicenses(activity: Activity) |
||||
} |
@ -0,0 +1,100 @@
@@ -0,0 +1,100 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.preferences.impl.about |
||||
|
||||
import androidx.activity.ComponentActivity |
||||
import androidx.compose.ui.test.junit4.AndroidComposeTestRule |
||||
import androidx.compose.ui.test.junit4.createAndroidComposeRule |
||||
import androidx.compose.ui.test.onNodeWithText |
||||
import androidx.test.ext.junit.runners.AndroidJUnit4 |
||||
import io.element.android.libraries.ui.strings.CommonStrings |
||||
import io.element.android.tests.testutils.EnsureNeverCalled |
||||
import io.element.android.tests.testutils.EnsureNeverCalledWithParam |
||||
import io.element.android.tests.testutils.clickOn |
||||
import io.element.android.tests.testutils.ensureCalledOnce |
||||
import io.element.android.tests.testutils.ensureCalledOnceWithParam |
||||
import io.element.android.tests.testutils.pressBack |
||||
import org.junit.Rule |
||||
import org.junit.Test |
||||
import org.junit.rules.TestRule |
||||
import org.junit.runner.RunWith |
||||
|
||||
@RunWith(AndroidJUnit4::class) |
||||
class AboutViewTest { |
||||
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>() |
||||
|
||||
@Test |
||||
fun `clicking on back invokes back callback`() { |
||||
ensureCalledOnce { callback -> |
||||
rule.setAboutView( |
||||
anAboutState(), |
||||
onBackClick = callback, |
||||
) |
||||
rule.pressBack() |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun `clicking on an item invokes the expected callback`() { |
||||
val state = anAboutState() |
||||
ensureCalledOnceWithParam(state.elementLegals.first()) { callback -> |
||||
rule.setAboutView( |
||||
state, |
||||
onElementLegalClick = callback, |
||||
) |
||||
rule.clickOn(state.elementLegals.first().titleRes) |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
fun `if open source licenses are not available, the entry is not displayed`() { |
||||
rule.setAboutView( |
||||
anAboutState(), |
||||
) |
||||
val text = rule.activity.getString(CommonStrings.common_open_source_licenses) |
||||
rule.onNodeWithText(text).assertDoesNotExist() |
||||
} |
||||
|
||||
@Test |
||||
fun `if open source licenses are available, clicking on the entry invokes the expected callback`() { |
||||
ensureCalledOnce { callback -> |
||||
rule.setAboutView( |
||||
anAboutState( |
||||
hasOpenSourcesLicenses = true, |
||||
), |
||||
onOpenSourceLicensesClick = callback, |
||||
) |
||||
rule.clickOn(CommonStrings.common_open_source_licenses) |
||||
} |
||||
} |
||||
} |
||||
|
||||
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setAboutView( |
||||
state: AboutState, |
||||
onElementLegalClick: (ElementLegal) -> Unit = EnsureNeverCalledWithParam(), |
||||
onOpenSourceLicensesClick: () -> Unit = EnsureNeverCalled(), |
||||
onBackClick: () -> Unit = EnsureNeverCalled(), |
||||
) { |
||||
setContent { |
||||
AboutView( |
||||
state = state, |
||||
onElementLegalClick = onElementLegalClick, |
||||
onOpenSourceLicensesClick = onOpenSourceLicensesClick, |
||||
onBackClick = onBackClick, |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.preferences.impl.about |
||||
|
||||
import android.app.Activity |
||||
import io.element.android.features.preferences.api.OpenSourceLicensesProvider |
||||
|
||||
class FakeOpenSourceLicensesProvider( |
||||
override val hasOpenSourceLicenses: Boolean, |
||||
) : OpenSourceLicensesProvider { |
||||
override fun navigateToOpenSourceLicenses(activity: Activity) = Unit |
||||
} |
Loading…
Reference in new issue