Benoit Marty
2 months ago
committed by
GitHub
23 changed files with 450 additions and 5 deletions
@ -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 @@ |
|||||||
|
<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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
<?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 @@ |
|||||||
|
<?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 @@ |
|||||||
|
<?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 @@ |
|||||||
|
<?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 @@ |
|||||||
|
<?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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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 |
||||||
|
} |
@ -0,0 +1,3 @@ |
|||||||
|
version https://git-lfs.github.com/spec/v1 |
||||||
|
oid sha256:af0cf33a8f40d66441e9f0e05120c181d2c0fe046cc12c5c1008c905e2a42a46 |
||||||
|
size 19774 |
Loading…
Reference in new issue