0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-03-31 22:51:25 -05:00

refactor(console): update android integration guide (#5263)

This commit is contained in:
Xiao Yijun 2024-01-22 10:48:34 +08:00 committed by GitHub
parent 2f1fb659ef
commit beef9c0657
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 293 additions and 308 deletions

View file

@ -6,8 +6,7 @@ import apiExpress from './api-express/index';
import apiPython from './api-python/index';
import apiSpringBoot from './api-spring-boot/index';
import m2mGeneral from './m2m-general/index';
import nativeAndroidJava from './native-android-java/index';
import nativeAndroidKt from './native-android-kt/index';
import nativeAndroid from './native-android/index';
import nativeCapacitor from './native-capacitor/index';
import nativeFlutter from './native-flutter/index';
import nativeIosSwift from './native-ios-swift/index';
@ -102,10 +101,10 @@ const guides: Readonly<Guide[]> = Object.freeze([
},
{
order: 2,
id: 'native-android-kt',
Logo: lazy(async () => import('./native-android-kt/logo.svg')),
Component: lazy(async () => import('./native-android-kt/README.mdx')),
metadata: nativeAndroidKt,
id: 'native-android',
Logo: lazy(async () => import('./native-android/logo.svg')),
Component: lazy(async () => import('./native-android/README.mdx')),
metadata: nativeAndroid,
},
{
order: 2,
@ -121,13 +120,6 @@ const guides: Readonly<Guide[]> = Object.freeze([
Component: lazy(async () => import('./web-php/README.mdx')),
metadata: webPhp,
},
{
order: 3,
id: 'native-android-java',
Logo: lazy(async () => import('./native-android-java/logo.svg')),
Component: lazy(async () => import('./native-android-java/README.mdx')),
metadata: nativeAndroidJava,
},
{
order: 3,
id: 'web-python',

View file

@ -1,117 +0,0 @@
import UriInputField from '@/mdx-components/UriInputField';
import InlineNotification from '@/ds-components/InlineNotification';
import Steps from '@/mdx-components/Steps';
import Step from '@/mdx-components/Step';
<Steps>
<Step
title="Integrate Logto Android SDK"
subtitle="Add Logto SDK as a dependency"
>
<InlineNotification>The minimum supported Android API is level 24</InlineNotification>
Before you add Logto Android SDK, ensure `mavenCentral()` is added to your repository configuration in the Gradle project build file:
```kotlin
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
```
Add Logto Android SDK to your dependencies:
```groovy
dependencies {
implementation 'io.logto.sdk:android:1.1.3'
}
```
Since the SDK needs internet access, you need to add the following permission to your `AndroidManifest.xml` file:
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<!-- other configurations... -->
</manifest>
```
</Step>
<Step
title="Init LogtoClient"
subtitle="1 step"
>
<pre>
<code className="language-java">
{`import io.logto.sdk.android.LogtoClient;
import io.logto.sdk.android.type.LogtoConfig;
import io.logto.sdk.core.constant.PromptValue;
// ...other codes
LogtoConfig logtoConfig = new LogtoConfig(
"${props.endpoint}",
"${props.app.id}",
null,
null,
true,
PromptValue.CONSENT
);
LogtoClient logtoClient = new LogtoClient(logtoConfig, getApplication());`}
</code>
</pre>
</Step>
<Step
title="Sign in"
subtitle="2 steps"
>
### Configure Redirect URI
First, lets configure your redirect URI. E.g. `io.logto.android://io.logto.sample/callback`
<UriInputField name="redirectUris" />
Go back to your IDE/editor, use the following code to implement sign-in:
<pre>
<code className="language-java">
{`logtoClient.signIn(this, "${
props.redirectUris[0] ?? '<your-redirect-uri>'
}", logtoException -> {
// User signed in successfully if \`logtoException\` is null.
});`}
</code>
</pre>
After signing in successfully, `logtoClient.isAuthenticated` will be `true`.
</Step>
<Step
title="Sign out"
subtitle="1 step"
>
Calling `.signOut(completion)` will always clear local credentials even if errors occurred.
```java
logtoClient.signOut(logtoException -> {
// Local credentials are cleared regardless of whether `logtoException` is null.
});
```
</Step>
</Steps>

View file

@ -1,15 +0,0 @@
import { ApplicationType } from '@logto/schemas';
import { type GuideMetadata } from '../types';
const metadata: Readonly<GuideMetadata> = Object.freeze({
name: 'Android (Java)',
description: 'Android integration for Java.',
target: ApplicationType.Native,
sample: {
repo: 'kotlin',
path: 'android-sample-java',
},
});
export default metadata;

View file

@ -1,11 +0,0 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_129_35349)">
<path d="M19.3484 33.2862C19.3484 33.2862 18.0415 34.081 20.2568 34.3084C22.9237 34.6484 24.3443 34.5921 27.2959 34.0247C27.8891 34.388 28.5165 34.6922 29.1691 34.9331C22.5285 37.7721 14.1252 34.7631 19.3484 33.2862ZM18.4984 29.5962C18.4984 29.5962 17.0789 30.6746 19.2932 30.9031C22.1885 31.1867 24.459 31.2431 28.3775 30.4494C28.7586 30.8359 29.2252 31.1274 29.7397 31.3004C21.7348 33.6847 12.7652 31.5267 18.4984 29.5962ZM34.1671 36.0668C34.1671 36.0668 35.1319 36.8616 33.0887 37.4863C29.2849 38.6232 17.1363 38.9632 13.7299 37.4863C12.5378 36.9763 14.8083 36.2379 15.5362 36.1242C16.2746 35.9542 16.673 35.9542 16.673 35.9542C15.3662 35.0457 7.9871 37.8274 12.9267 38.6211C26.4948 40.8353 37.6787 37.6563 34.1586 36.0668H34.1671ZM19.9625 25.7351C19.9625 25.7351 13.7745 27.2119 17.7483 27.7219C19.4515 27.9493 22.8005 27.8919 25.9232 27.6656C28.4774 27.4382 31.0338 26.9856 31.0338 26.9856C31.0338 26.9856 30.1253 27.383 29.5006 27.7804C23.2 29.4272 11.1066 28.6888 14.5703 26.9856C17.522 25.5661 19.9636 25.7372 19.9636 25.7372L19.9625 25.7351ZM31.0338 31.9231C37.3918 28.6293 34.4402 25.4524 32.3959 25.8487C31.8859 25.9624 31.6575 26.0761 31.6575 26.0761C31.6575 26.0761 31.8275 25.7361 32.2248 25.6224C36.256 24.2029 39.435 29.8799 30.918 32.0931C30.918 32.0931 30.9743 32.0367 31.0317 31.9231H31.0338ZM20.5894 40.8927C26.72 41.2901 36.0881 40.6653 36.3144 37.7689C36.3144 37.7689 35.8607 38.9058 31.2622 39.7558C26.039 40.7206 19.5673 40.6058 15.7635 39.9832C15.7635 39.9832 16.5583 40.6642 20.5894 40.8927Z" fill="#4E7896"/>
<path d="M27.1834 7.00104C27.1834 7.00104 30.7034 10.5774 23.8344 15.9707C18.3274 20.3418 22.5859 22.8397 23.8344 25.6787C20.598 22.7834 18.2711 20.2281 19.8606 17.8449C22.1875 14.3238 28.6029 12.6312 27.1834 7.00104ZM25.3771 23.2945C27.024 25.1677 24.9234 26.8708 24.9234 26.8708C24.9234 26.8708 29.1245 24.714 27.194 22.045C25.4345 19.4907 24.0702 18.2412 31.4514 13.9838C31.4514 13.9838 19.8139 16.8791 25.3771 23.2945Z" fill="#F58219"/>
</g>
<defs>
<clipPath id="clip0_129_35349">
<rect width="34" height="34" fill="white" transform="translate(7 7)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -1,114 +0,0 @@
import UriInputField from '@/mdx-components/UriInputField';
import InlineNotification from '@/ds-components/InlineNotification';
import Steps from '@/mdx-components/Steps';
import Step from '@/mdx-components/Step';
<Steps>
<Step
title="Integrate Logto Android SDK"
subtitle="Add Logto SDK as a dependency"
>
<InlineNotification>The minimum supported Android API is level 24</InlineNotification>
Before you add Logto Android SDK, ensure `mavenCentral()` is added to your repository configuration in the Gradle project build file:
```kotlin
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
```
Add Logto Android SDK to your dependencies:
```kotlin
dependencies {
implementation("io.logto.sdk:android:1.1.3")
}
```
Since the SDK needs internet access, you need to add the following permission to your `AndroidManifest.xml` file:
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<!-- other configurations... -->
</manifest>
```
</Step>
<Step
title="Init LogtoClient"
subtitle="1 step"
>
<pre>
<code className="language-kotlin">
{`import io.logto.sdk.android.LogtoClient
import io.logto.sdk.android.type.LogtoConfig
val logtoConfig = LogtoConfig(
endpoint = "${props.endpoint}",
appId = "${props.app.id}",
scopes = null,
resources = null,
usingPersistStorage = true,
)
val logtoClient = LogtoClient(logtoConfig, application)`}
</code>
</pre>
</Step>
<Step
title="Sign in"
subtitle="2 steps"
>
### Configure Redirect URI
First, lets configure your redirect URI. E.g. `io.logto.android://io.logto.sample/callback`
<UriInputField name="redirectUris" />
Go back to your IDE/editor, use the following code to implement sign-in:
<pre>
<code className="language-kotlin">
{`logtoClient.signIn(this, "${
props.redirectUris[0] ?? '<your-redirect-uri>'
}") { logtoException: LogtoException? ->
// User signed in successfully if \`logtoException\` is null.
}`}
</code>
</pre>
After signing in successfully, `logtoClient.isAuthenticated` will be `true`.
</Step>
<Step
title="Sign out"
subtitle="1 step"
>
Calling `.signOut(completion)` will always clear local credentials even if errors occurred.
```kotlin
logtoClient.signOut { logtoException: LogtoException? ->
// Local credentials are cleared regardless of whether `logtoException` is null.
}
```
</Step>
</Steps>

View file

@ -1,33 +0,0 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_129_41966)">
<path d="M9 38.9996L24.05 23.9496L39 38.9996H9Z" fill="url(#paint0_linear_129_41966)"/>
<path d="M9 9H24.05L9 25.25V9Z" fill="url(#paint1_linear_129_41966)"/>
<path d="M24.05 9L9 24.85V39L24.05 23.95L39 9H24.05Z" fill="url(#paint2_linear_129_41966)"/>
</g>
<defs>
<linearGradient id="paint0_linear_129_41966" x1="16.9797" y1="46.0068" x2="31.1534" y2="31.833" gradientUnits="userSpaceOnUse">
<stop offset="0.09677" stop-color="#0095D5"/>
<stop offset="0.3007" stop-color="#238AD9"/>
<stop offset="0.6211" stop-color="#557BDE"/>
<stop offset="0.8643" stop-color="#7472E2"/>
<stop offset="1" stop-color="#806EE3"/>
</linearGradient>
<linearGradient id="paint1_linear_129_41966" x1="11.1046" y1="15.0295" x2="19.3367" y2="6.7975" gradientUnits="userSpaceOnUse">
<stop offset="0.1183" stop-color="#0095D5"/>
<stop offset="0.4178" stop-color="#3C83DC"/>
<stop offset="0.6962" stop-color="#6D74E1"/>
<stop offset="0.8333" stop-color="#806EE3"/>
</linearGradient>
<linearGradient id="paint2_linear_129_41966" x1="3.94915" y1="36.5819" x2="31.8658" y2="8.6653" gradientUnits="userSpaceOnUse">
<stop offset="0.1075" stop-color="#C757BC"/>
<stop offset="0.2138" stop-color="#D0609A"/>
<stop offset="0.4254" stop-color="#E1725C"/>
<stop offset="0.6048" stop-color="#EE7E2F"/>
<stop offset="0.743" stop-color="#F58613"/>
<stop offset="0.8232" stop-color="#F88909"/>
</linearGradient>
<clipPath id="clip0_129_41966">
<rect width="30" height="30" fill="white" transform="translate(9 9)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,282 @@
import UriInputField from '@/mdx-components/UriInputField';
import InlineNotification from '@/ds-components/InlineNotification';
import Steps from '@/mdx-components/Steps';
import Step from '@/mdx-components/Step';
<Steps>
<InlineNotification>We use Kotlin in this example, but the concepts are the same for Java.</InlineNotification>
<Step
title="Installation"
subtitle="Install Logto Logto SDK for your project"
>
<InlineNotification>The minimum supported Android API is level 24.</InlineNotification>
Before you install Logto Android SDK, ensure `mavenCentral()` is added to your repository configuration in the Gradle project build file:
```kotlin
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
```
Add Logto Android SDK to your dependencies:
```kotlin
dependencies {
implementation("io.logto.sdk:android:1.1.3")
}
```
Since the SDK needs internet access, you need to add the following permission to your `AndroidManifest.xml` file:
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- add internet permission -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- other configurations... -->
</manifest>
```
</Step>
<Step
title="Init LogtoClient"
subtitle="1 step"
>
Create a `LogtoViewModel.kt` and init `LogtoClient` in this view model:
<pre>
<code className="language-kotlin">
{`//...with other imports
import io.logto.sdk.android.LogtoClient
import io.logto.sdk.android.type.LogtoConfig
class LogtoViewModel(application: Application) : AndroidViewModel(application) {
private val logtoConfig = LogtoConfig(
endpoint = "${props.endpoint}",
appId = "${props.app.id}",
scopes = null,
resources = null,
usingPersistStorage = true,
)
private val logtoClient = LogtoClient(logtoConfig, application)
companion object {
val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(
modelClass: Class<T>,
extras: CreationExtras
): T {
// Get the Application object from extras
val application = checkNotNull(extras[APPLICATION_KEY])
return LogtoViewModel(application) as T
}
}
}
}`}
</code>
</pre>
then, create a `LogtoViewModel` for your `MainActivity.kt`:
```kotlin
//...with other imports
class MainActivity : AppCompatActivity() {
private val logtoViewModel: LogtoViewModel by viewModels { LogtoViewModel.Factory }
//...other codes
}
```
</Step>
<Step
title="Implement sign-in"
subtitle="2 steps"
>
Before starting, you need to add a redirect URI in the Admin Console for your application.
In Android, the redirect URI follows the pattern: `$(LOGTO_REDIRECT_SCHEME)://$(YOUR_APP_PACKAGE)/callback`:
- The `LOGTO_REDIRECT_SCHEME` should be a custom scheme in the reverse domain format.
- The `YOUR_APP_PACKAGE` is your app package name.
Assuming you treat `io.logto.android` as the custom `LOGTO_REDIRECT_SCHEME`, and `io.logto.sample` is your app package name, the Redirect URI should be `io.logto.android://io.logto.sample/callback`.
You can add the redirect URI in the following input field:
<UriInputField name="redirectUris" />
After the redirect URI is configured, we add a `signIn` method to your `LogtoViewModel.kt`, which will call `logtoClient.signIn` API to invoke the Logto sign-in page:
<pre>
<code className="language-kotlin">
{`//...with other imports
class LogtoViewModel(application: Application) : AndroidViewModel(application) {
// ...other codes
fun signIn(context: Activity) {
logtoClient.signIn(context, "${props.redirectUris[0] ?? '<your-redirect-uri>'}") { logtoException ->
logtoException?.let { println(it) }
}
}
}`}
</code>
</pre>
Now setup on-click listener for the sign-in button in your `MainActivity.kt` to call the `signIn` method:
```kotlin
//...with other imports
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
//...other codes
// Assume you have a button with id `sign_in_button` in your layout
val signInButton = findViewById<Button>(R.id.sign_in_button)
signInButton.setOnClickListener {
logtoViewModel.signIn(this)
}
}
}
```
</Step>
<Step
title="Implement sign-out"
subtitle="1 step"
>
Similar to sign-in, we add a `signOut` method to `LogtoViewModel.kt` to call `logtoClient.signOut` API:
```kotlin
//...with other imports
class LogtoViewModel(application: Application) : AndroidViewModel(application) {
// ...other codes
fun signOut() {
logtoClient.signOut { logtoException ->
logtoException?.let { println(it) }
}
}
}
```
After you signed out, the Logto SDK will clear all local credentials even though Logto exceptions occurred when calling `logtoClient.signOut` API.
Then, we can add a button to call the `signOut` method in `MainActivity.kt`:
```kotlin
//...with other imports
class MainActivity : AppCompatActivity() {
//...other codes
override fun onCreate(savedInstanceState: Bundle?) {
//...other codes
//...sign-in button codes
// Assume you have a button with id `sign_out_button` in your layout
val signOutButton = findViewById<Button>(R.id.sign_out_button)
signOutButton.setOnClickListener {
logtoViewModel.signOut()
}
}
}
```
</Step>
<Step
title="Handle authentication status"
subtitle="1 step"
>
In Logto SDK, we can use `logtoClient.isAuthenticated` to check the authentication status, if the user is signed in, the value will be `true`, otherwise, the value will be `false`.
Now, let's add a live data to `LogtoViewModel.kt` to observe the authentication status, and update the status when the user signed in or signed out:
<pre>
<code className="language-kotlin">
{`//...with other imports
class LogtoViewModel(application: Application) : AndroidViewModel(application) {
// ...other codes
// Add a live data to observe the authentication status
private val _authenticated = MutableLiveData(logtoClient.isAuthenticated)
val authenticated: LiveData<Boolean>
get() = _authenticated
fun signIn(context: Activity) {
logtoClient.signIn(context, "${props.redirectUris[0] ?? '<your-redirect-uri>'}") { logtoException ->
logtoException?.let { println(it) }
// Update the live data
_authenticated.postValue(logtoClient.isAuthenticated)
}
}
fun signOut() {
logtoClient.signOut { logtoException ->
logtoException?.let { println(it) }
// Update the live data
_authenticated.postValue(logtoClient.isAuthenticated)
}
}
}`}
</code>
</pre>
Then, we observe the `authenticated` live data in `MainActivity.kt`, when the user is signed in, we hide the sign-in button and show the sign-out button and vice versa:
```kotlin
//...with other imports
class MainActivity : AppCompatActivity() {
//...other codes
override fun onCreate(savedInstanceState: Bundle?) {
//...other codes
val signInButton = findViewById<Button>(R.id.sign_in_button)
val signOutButton = findViewById<Button>(R.id.sign_out_button)
// ...handle button click codes
// Observe the authentication status
logtoViewModel.authenticated.observe(this) { authenticated ->
if (authenticated) {
// The user is authenticated
signInButton.visibility = View.GONE
signOutButton.visibility = View.VISIBLE
} else {
// The user is not authenticated
signInButton.visibility = View.VISIBLE
signOutButton.visibility = View.GONE
}
}
}
}
```
</Step>
<Step
title="Checkpoint: Test your application"
subtitle="1 step"
>
Now, you can test your application:
1. Run your application, you will see the sign-in button.
2. Click the sign-in button, the Logto SDK will navigate to the Logto sign-in page.
3. After you signed in, you will be redirect back to your application and see the sign-out button.
4. Click the sign-out button, you will see the sign-in button again.
</Step>
</Steps>

View file

@ -3,8 +3,8 @@ import { ApplicationType } from '@logto/schemas';
import { type GuideMetadata } from '../types';
const metadata: Readonly<GuideMetadata> = Object.freeze({
name: 'Android (Kotlin)',
description: 'Android integration for Kotlin.',
name: 'Android',
description: 'Android integration guide.',
target: ApplicationType.Native,
sample: {
repo: 'kotlin',

View file

@ -0,0 +1,4 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M42.9312 34.3018C42.92 34.2218 42.9088 34.153 42.8962 34.0717C42.8162 33.6002 42.7236 33.1302 42.6085 32.6588C42.4157 31.8527 42.1663 31.0613 41.8621 30.2903C41.6081 29.6337 41.3219 29.0023 40.9992 28.3919C40.5853 27.6104 40.1251 26.8513 39.6087 26.1274C38.9759 25.242 38.2744 24.4254 37.5153 23.6551C37.194 23.3338 36.8601 23.0237 36.5149 22.7361C35.7685 22.0921 34.9743 21.5056 34.1353 20.9878C34.1465 20.9766 34.1465 20.9654 34.1577 20.9527C34.5379 20.2863 34.928 19.631 35.3082 18.9646C35.6871 18.3205 36.0547 17.6765 36.4349 17.0213C36.6987 16.5611 36.9751 16.0896 37.2389 15.6294C37.309 15.5143 37.354 15.4119 37.389 15.2842C37.4929 14.9629 37.5041 14.6178 37.4115 14.2965C37.389 14.2151 37.3666 14.1351 37.3315 14.0664C37.2964 13.985 37.2627 13.9162 37.2164 13.8475C37.0789 13.6061 36.8713 13.3985 36.6075 13.2498C36.3774 13.1122 36.1248 13.0309 35.8597 13.0084C35.7446 12.9972 35.6408 12.9972 35.5257 13.0084C35.4345 13.0196 35.3419 13.0309 35.2619 13.0547C34.9406 13.1347 34.653 13.3073 34.4229 13.5598C34.3415 13.6524 34.2615 13.7563 34.204 13.8587C33.9402 14.3189 33.6638 14.7903 33.4 15.2506L32.2733 17.1938C31.8931 17.8603 31.5016 18.5156 31.1228 19.182C31.0765 19.2522 31.0428 19.3322 30.9965 19.4009C30.939 19.3785 30.8815 19.3546 30.8239 19.3322C28.7081 18.5268 26.4196 18.0904 24.0175 18.0904H23.8211C21.746 18.1107 19.688 18.468 17.7275 19.1484C17.51 19.2283 17.2911 19.3097 17.0722 19.3897C17.0385 19.3209 16.9922 19.2522 16.9572 19.182C16.5783 18.5156 16.1869 17.8603 15.808 17.1938C15.4278 16.5498 15.0602 15.9058 14.6814 15.2506C14.4162 14.7903 14.1412 14.3189 13.876 13.8587C13.8072 13.7436 13.7385 13.6524 13.6571 13.5598C13.4321 13.314 13.1406 13.1385 12.818 13.0547C12.7268 13.0309 12.6342 13.0196 12.5543 13.0084C12.4392 12.9972 12.3354 12.9972 12.2203 13.0084C11.9565 13.0309 11.7026 13.1122 11.4739 13.2498C11.2249 13.3964 11.0154 13.6016 10.8635 13.8475C10.8172 13.9162 10.7836 13.985 10.7485 14.0664C10.7148 14.1463 10.691 14.2151 10.6685 14.2965C10.5871 14.6178 10.5871 14.9517 10.691 15.2842C10.726 15.3993 10.7836 15.5143 10.8411 15.6294C11.1049 16.0896 11.3813 16.5611 11.6451 17.0213C12.0253 17.6653 12.3929 18.3093 12.7717 18.9646C13.152 19.631 13.542 20.2863 13.9223 20.9527L13.9335 20.9654C13.1632 21.448 12.428 21.977 11.7264 22.5635C11.3125 22.9087 10.9098 23.2763 10.5296 23.6551C9.75929 24.4142 9.07038 25.242 8.43758 26.1274C7.91984 26.8513 7.45962 27.5992 7.04712 28.3919C6.7244 29.0023 6.43677 29.6337 6.18421 30.2889C5.88535 31.0592 5.6328 31.8534 5.43636 32.6588C5.32131 33.1176 5.23011 33.589 5.14873 34.0717C5.1375 34.153 5.12628 34.2218 5.11505 34.3018C5.06875 34.5782 5.03367 34.8546 5 35.1422H43C43 34.8546 42.9663 34.5782 42.9312 34.3018Z" fill="#34A853"/>
<path d="M33.9165 29.8757C34.6756 29.3706 34.7907 28.1976 34.1579 27.2659C33.5377 26.3231 32.411 25.9793 31.6519 26.4844C30.8929 26.9909 30.7778 28.1625 31.4106 29.0942C32.0322 30.0371 33.1589 30.3822 33.9165 29.8757ZM16.6935 29.1054C17.3137 28.1625 17.2113 27.0022 16.4522 26.4957C15.6931 25.9905 14.5665 26.3357 13.9449 27.2786C13.3247 28.2201 13.4285 29.3818 14.1862 29.8883C14.9453 30.3934 16.0607 30.0371 16.6935 29.1054Z" fill="#202124"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB