Commit 528df0d2 authored by Sai Srinivas's avatar Sai Srinivas
Browse files

14-05-2025 By Sai Srinivas

All UI Adjustments and Font Sizes
parent fd946558
...@@ -77,5 +77,7 @@ dependencies { ...@@ -77,5 +77,7 @@ dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.13.0")) implementation(platform("com.google.firebase:firebase-bom:33.13.0"))
implementation("com.google.firebase:firebase-analytics") implementation("com.google.firebase:firebase-analytics")
implementation("com.google.firebase:firebase-auth-ktx:23.2.0") implementation("com.google.firebase:firebase-auth-ktx:23.2.0")
implementation("com.google.firebase:firebase-messaging-ktx:23.4.0")
} }
\ No newline at end of file
-keep class com.almoullim.background_location.** { *; }
\ No newline at end of file
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application <application
android:label="Gen ERP" android:label="GEN ERP"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">
<activity <activity
...@@ -85,6 +85,8 @@ ...@@ -85,6 +85,8 @@
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" /> android:resource="@xml/provider_paths" />
</provider> </provider>
<service android:name="com.almoullim.background_location.service.LocationService" />
</application> </application>
<!-- Required to query activities that can process text, see: <!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and https://developer.android.com/training/package-visibility and
......
package `in`.webgrid.generp
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.PluginRegistry
class BackgroundLocationPlugin : FlutterPlugin, ActivityAware {
companion object {
/**
Legacy for v1 embedding
*/
@SuppressWarnings("deprecation")
fun registerWith(registrar: PluginRegistry.Registrar) {
val service = BackgroundLocationService.getInstance()
service.onAttachedToEngine(registrar.context(), registrar.messenger())
registrar.addRequestPermissionsResultListener(service)
}
const val TAG = "com.almoullim.Log.Tag"
const val PLUGIN_ID = "com.almoullim.background_location"
}
override fun onAttachedToEngine(binding: FlutterPluginBinding) {
BackgroundLocationService.getInstance().onAttachedToEngine(binding.applicationContext, binding.binaryMessenger)
}
override fun onDetachedFromEngine(binding: FlutterPluginBinding) {
BackgroundLocationService.getInstance().onDetachedFromEngine()
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
val service = BackgroundLocationService.getInstance()
service.setActivity(binding)
binding.addRequestPermissionsResultListener(service)
}
override fun onDetachedFromActivityForConfigChanges() {
this.onDetachedFromActivity()
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
this.onAttachedToActivity(binding)
}
override fun onDetachedFromActivity() {
BackgroundLocationService.getInstance().setActivity(null)
}
}
\ No newline at end of file
package `in`.webgrid.generp
import android.Manifest
import android.annotation.SuppressLint
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.BinaryMessenger
import android.app.Activity
import android.app.ActivityManager
import android.content.*
import android.content.pm.PackageManager
import android.location.Location
import android.os.IBinder
import android.util.Log
import android.widget.Toast
import androidx.annotation.NonNull
import androidx.core.app.ActivityCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.PluginRegistry
class BackgroundLocationService: MethodChannel.MethodCallHandler, PluginRegistry.RequestPermissionsResultListener {
companion object {
const val METHOD_CHANNEL_NAME = "${BackgroundLocationPlugin.PLUGIN_ID}/methods"
private const val REQUEST_PERMISSIONS_REQUEST_CODE = 34
@SuppressLint("StaticFieldLeak")
private var instance: BackgroundLocationService? = null
/**
* Requests the singleton instance of [BackgroundLocationService] or creates it,
* if it does not yet exist.
*/
fun getInstance(): BackgroundLocationService {
if (instance == null) {
instance = BackgroundLocationService()
}
return instance!!
}
}
/**
* Context that is set once attached to a FlutterEngine.
* Context should no longer be referenced when detached.
*/
private var context: Context? = null
private lateinit var channel: MethodChannel
private var activity: Activity? = null
private var isAttached = false
private var receiver: MyReceiver? = null
private var service: LocationUpdatesService? = null
/**
* Signals whether the LocationUpdatesService is bound
*/
private var bound: Boolean = false
private val serviceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
bound = true
val binder = service as LocationUpdatesService.LocalBinder
this@BackgroundLocationService.service = binder.service
requestLocation()
}
override fun onServiceDisconnected(name: ComponentName) {
service = null
}
}
fun onAttachedToEngine(@NonNull context: Context, @NonNull messenger: BinaryMessenger) {
this.context = context
isAttached = true
channel = MethodChannel(messenger, METHOD_CHANNEL_NAME)
channel.setMethodCallHandler(this)
receiver = MyReceiver()
LocalBroadcastManager.getInstance(context).registerReceiver(receiver!!,
IntentFilter(LocationUpdatesService.ACTION_BROADCAST))
}
fun onDetachedFromEngine() {
channel.setMethodCallHandler(null)
context = null
isAttached = false
}
fun setActivity(binding: ActivityPluginBinding?) {
this.activity = binding?.activity
if(this.activity != null){
if (Utils.requestingLocationUpdates(context!!)) {
if (!checkPermissions()) {
requestPermissions()
}
}
} else {
stopLocationService()
}
}
private fun startLocationService(distanceFilter: Double?, forceLocationManager : Boolean?): Int{
LocalBroadcastManager.getInstance(context!!).registerReceiver(receiver!!,
IntentFilter(LocationUpdatesService.ACTION_BROADCAST))
if (!bound) {
val intent = Intent(context, LocationUpdatesService::class.java)
intent.putExtra("distance_filter", distanceFilter)
intent.putExtra("force_location_manager", forceLocationManager)
context!!.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
}
return 0
}
private fun isLocationServiceRunning(): Boolean {
val manager: ActivityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
if (LocationUpdatesService::class.java.getName() == service.service.getClassName()) {
if (service.foreground)
return true
else
return false
}
}
return false
}
private fun stopLocationService(): Int {
service?.removeLocationUpdates()
LocalBroadcastManager.getInstance(context!!).unregisterReceiver(receiver!!)
if (bound) {
context!!.unbindService(serviceConnection)
bound = false
}
return 0
}
private fun setAndroidNotification(title: String?, message: String?, icon: String?):Int{
if (title != null) LocationUpdatesService.NOTIFICATION_TITLE = title
if (message != null) LocationUpdatesService.NOTIFICATION_MESSAGE = message
if (icon != null) LocationUpdatesService.NOTIFICATION_ICON = icon
if (service != null) {
service?.updateNotification()
}
return 0
}
private fun setConfiguration(timeInterval: Long?):Int {
if (timeInterval != null) {
LocationUpdatesService.UPDATE_INTERVAL_IN_MILLISECONDS = timeInterval
LocationUpdatesService.FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = timeInterval/2
}
return 0
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: MethodChannel.Result) {
when (call.method) {
"stop_location_service" -> result.success(stopLocationService())
"start_location_service" -> result.success(startLocationService(call.argument("distance_filter"), call.argument("force_location_manager")))
"is_service_running" -> result.success(isLocationServiceRunning())
"set_android_notification" -> result.success(setAndroidNotification(call.argument("title"),call.argument("message"),call.argument("icon")))
"set_configuration" -> result.success(setConfiguration(call.argument<String>("interval")?.toLongOrNull()))
else -> result.notImplemented()
}
}
/**
* Requests a location updated.
* If permission is denied, it requests the needed permission
*/
private fun requestLocation() {
if (!checkPermissions()) {
requestPermissions()
} else {
service?.requestLocationUpdates()
}
}
/**
* Checks the current permission for `ACCESS_FINE_LOCATION`
*/
private fun checkPermissions(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(context!!, Manifest.permission.ACCESS_FINE_LOCATION)
}
/**
* Requests permission for location.
* Depending on the current activity, displays a rationale for the request.
*/
private fun requestPermissions() {
if(activity == null) {
return
}
val shouldProvideRationale = ActivityCompat.shouldShowRequestPermissionRationale(activity!!, Manifest.permission.ACCESS_FINE_LOCATION)
if (shouldProvideRationale) {
Log.i(BackgroundLocationPlugin.TAG, "Displaying permission rationale to provide additional context.")
Toast.makeText(context, R.string.permission_rationale, Toast.LENGTH_LONG).show()
} else {
Log.i(BackgroundLocationPlugin.TAG, "Requesting permission")
ActivityCompat.requestPermissions(activity!!,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_PERMISSIONS_REQUEST_CODE)
}
}
private inner class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val location = intent.getParcelableExtra<Location>(LocationUpdatesService.EXTRA_LOCATION)
if (location != null) {
val locationMap = HashMap<String, Any>()
locationMap["latitude"] = location.latitude
locationMap["longitude"] = location.longitude
locationMap["altitude"] = location.altitude
locationMap["accuracy"] = location.accuracy.toDouble()
locationMap["bearing"] = location.bearing.toDouble()
locationMap["speed"] = location.speed.toDouble()
locationMap["time"] = location.time.toDouble()
locationMap["is_mock"] = location.isFromMockProvider
channel.invokeMethod("location", locationMap, null)
}
}
}
/**
* Handle the response from a permission request
* @return true if the result has been handled.
*/
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray): Boolean{
Log.i(BackgroundLocationPlugin.TAG, "onRequestPermissionResult")
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
when {
grantResults!!.isEmpty() -> Log.i(BackgroundLocationPlugin.TAG, "User interaction was cancelled.")
grantResults[0] == PackageManager.PERMISSION_GRANTED -> service?.requestLocationUpdates()
else -> Toast.makeText(context, R.string.permission_denied_explanation, Toast.LENGTH_LONG).show()
}
}
return true
}
}
\ No newline at end of file
package `in`.webgrid.generp
import android.annotation.SuppressLint
import android.app.*
import android.location.*
import android.location.LocationListener
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.*
import androidx.core.app.NotificationCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.google.android.gms.location.*
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.common.*
@SuppressLint("Registered")
class LocationUpdatesService : Service() {
private var forceLocationManager: Boolean = false
override fun onBind(intent: Intent?): IBinder {
val distanceFilter = intent?.getDoubleExtra("distance_filter", 0.0)
if (intent != null) {
forceLocationManager = intent.getBooleanExtra("force_location_manager", false)
}
if (distanceFilter != null) {
createLocationRequest(distanceFilter)
} else {
createLocationRequest(0.0)
}
return mBinder
}
private val mBinder = LocalBinder()
private var mNotificationManager: NotificationManager? = null
private var mLocationRequest: LocationRequest? = null
private var mFusedLocationClient: FusedLocationProviderClient? = null
private var mLocationManager: LocationManager? = null
private var mFusedLocationCallback: LocationCallback? = null
private var mLocationManagerCallback: LocationListener? = null
private var mLocation: Location? = null
private var isGoogleApiAvailable: Boolean = false
private var isStarted: Boolean = false
companion object {
var NOTIFICATION_TITLE = "Background service is running"
var NOTIFICATION_MESSAGE = "Background service is running"
var NOTIFICATION_ICON = "@mipmap/ic_launcher"
private const val PACKAGE_NAME = "com.google.android.gms.location.sample.locationupdatesforegroundservice"
private val TAG = LocationUpdatesService::class.java.simpleName
private const val CHANNEL_ID = "channel_01"
internal const val ACTION_BROADCAST = "$PACKAGE_NAME.broadcast"
internal const val EXTRA_LOCATION = "$PACKAGE_NAME.location"
private const val EXTRA_STARTED_FROM_NOTIFICATION = "$PACKAGE_NAME.started_from_notification"
var UPDATE_INTERVAL_IN_MILLISECONDS: Long = 1000
var FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS / 2
private const val NOTIFICATION_ID = 12345678
private lateinit var broadcastReceiver: BroadcastReceiver
private const val STOP_SERVICE = "stop_service"
}
private val notification: NotificationCompat.Builder
@SuppressLint("UnspecifiedImmutableFlag", "DiscouragedApi")
get() {
val intent = Intent(this, getMainActivityClass(this))
intent.putExtra(EXTRA_STARTED_FROM_NOTIFICATION, true)
intent.action = "Localisation"
//intent.setClass(this, getMainActivityClass(this))
val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
} else {
PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
val builder = NotificationCompat.Builder(this, "BackgroundLocation")
.setContentTitle(NOTIFICATION_TITLE)
.setOngoing(true)
.setSound(null)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setSmallIcon(resources.getIdentifier(NOTIFICATION_ICON, "mipmap", packageName))
.setWhen(System.currentTimeMillis())
.setStyle(NotificationCompat.BigTextStyle().bigText(NOTIFICATION_MESSAGE))
.setContentIntent(pendingIntent)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(CHANNEL_ID)
}
return builder
}
private var mServiceHandler: Handler? = null
override fun onCreate() {
val googleAPIAvailability = GoogleApiAvailability.getInstance()
.isGooglePlayServicesAvailable(applicationContext)
isGoogleApiAvailable = googleAPIAvailability == ConnectionResult.SUCCESS
if (isGoogleApiAvailable && !this.forceLocationManager) {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
mFusedLocationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
// Smart cast to 'Location' is impossible, because 'locationResult.lastLocation'
// is a property that has open or custom getter
val newLastLocation = locationResult.lastLocation
if (newLastLocation is Location) {
super.onLocationResult(locationResult)
onNewLocation(newLastLocation)
}
}
}
} else {
mLocationManager = getSystemService(LOCATION_SERVICE) as LocationManager?
mLocationManagerCallback = LocationListener { location ->
println(location.toString())
onNewLocation(location)
}
}
getLastLocation()
val handlerThread = HandlerThread(TAG)
handlerThread.start()
mServiceHandler = Handler(handlerThread.looper)
mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "Application Name"
val mChannel = NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_DEFAULT)
mChannel.setSound(null, null)
mNotificationManager!!.createNotificationChannel(mChannel)
}
broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == "stop_service") {
removeLocationUpdates()
}
}
}
val filter = IntentFilter()
filter.addAction(STOP_SERVICE)
registerReceiver(broadcastReceiver, filter)
updateNotification() // to start the foreground service
}
fun requestLocationUpdates() {
Utils.setRequestingLocationUpdates(this, true)
try {
if (isGoogleApiAvailable && !this.forceLocationManager) {
mFusedLocationClient!!.requestLocationUpdates(mLocationRequest!!,
mFusedLocationCallback!!, Looper.myLooper())
} else {
mLocationManager?.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0L, 0f, mLocationManagerCallback!!)
}
} catch (unlikely: SecurityException) {
Utils.setRequestingLocationUpdates(this, false)
}
}
fun updateNotification() {
if (!isStarted) {
isStarted = true
startForeground(NOTIFICATION_ID, notification.build())
} else {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(NOTIFICATION_ID, notification.build())
}
}
fun removeLocationUpdates() {
stopForeground(true)
stopSelf()
}
private fun getLastLocation() {
try {
if(isGoogleApiAvailable && !this.forceLocationManager) {
mFusedLocationClient!!.lastLocation
.addOnCompleteListener { task ->
if (task.isSuccessful && task.result != null) {
mLocation = task.result
}
}
} else {
mLocation = mLocationManager!!.getLastKnownLocation(LocationManager.GPS_PROVIDER)
}
} catch (unlikely: SecurityException) {
}
}
internal fun onNewLocation(location: Location) {
mLocation = location
val intent = Intent(ACTION_BROADCAST)
intent.putExtra(EXTRA_LOCATION, location)
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
}
private fun createLocationRequest(distanceFilter: Double) {
mLocationRequest = LocationRequest()
mLocationRequest!!.interval = UPDATE_INTERVAL_IN_MILLISECONDS
mLocationRequest!!.fastestInterval = FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS
mLocationRequest!!.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
mLocationRequest!!.smallestDisplacement = distanceFilter.toFloat()
}
inner class LocalBinder : Binder() {
internal val service: LocationUpdatesService
get() = this@LocationUpdatesService
}
override fun onDestroy() {
super.onDestroy()
isStarted = false
unregisterReceiver(broadcastReceiver)
try {
if (isGoogleApiAvailable && !this.forceLocationManager) {
mFusedLocationClient!!.removeLocationUpdates(mFusedLocationCallback!!)
} else {
mLocationManager!!.removeUpdates(mLocationManagerCallback!!)
}
Utils.setRequestingLocationUpdates(this, false)
mNotificationManager!!.cancel(NOTIFICATION_ID)
} catch (unlikely: SecurityException) {
Utils.setRequestingLocationUpdates(this, true)
}
}
private fun getMainActivityClass(context: Context): Class<*>? {
val packageName = context.packageName
val launchIntent = context.packageManager.getLaunchIntentForPackage(packageName)
val className = launchIntent?.component?.className ?: return null
return try {
Class.forName(className)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
null
}
}
}
\ No newline at end of file
package `in`.webgrid.generp
import `in`.webgrid.generp.BackgroundLocationPlugin
/**
* Copyright 2017 Google Inc. All Rights Reserved.
*
* 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
*
* http://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.
*/
import android.content.Context
internal object Utils {
private const val KEY_REQUESTING_LOCATION_UPDATES = "requesting_location_updates"
private const val SHARED_PREFERENCES_FILE = "${BackgroundLocationPlugin.PLUGIN_ID}_preferences"
fun requestingLocationUpdates(context: Context): Boolean {
return context.getSharedPreferences(SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE).getBoolean(KEY_REQUESTING_LOCATION_UPDATES, false)
}
fun setRequestingLocationUpdates(context: Context, requestingLocationUpdates: Boolean) {
context.getSharedPreferences(SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE)
.edit()
.putBoolean(KEY_REQUESTING_LOCATION_UPDATES, requestingLocationUpdates)
.apply()
}
}
\ No newline at end of file
buildscript {
dependencies {
classpath("com.google.gms:google-services:4.3.15")
}
repositories {
google()
mavenCentral()
}
}
allprojects { allprojects {
repositories { repositories {
google() google()
......
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" id="circle">
<path d="M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0zm0 30C8.28 30 2 23.72 2 16S8.28 2 16 2s14 6.28 14 14-6.28 14-14 14z"></path>
<path d="M17 8h-2v7H8v2h7v7h2v-7h7v-2h-7z"></path>
</svg>
<svg width="24" height="23" viewBox="0 0 24 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="11.5" r="9.38963" fill="#2D2D2D"/>
<path d="M12 0.958313C9.82441 0.958313 7.69767 1.57657 5.88873 2.7349C4.07979 3.89324 2.66989 5.53962 1.83733 7.46586C1.00477 9.3921 0.786929 11.5117 1.21137 13.5566C1.6358 15.6014 2.68345 17.4798 4.22183 18.9541C5.76021 20.4283 7.72022 21.4323 9.85401 21.8391C11.9878 22.2458 14.1995 22.0371 16.2095 21.2392C18.2195 20.4413 19.9375 19.0902 21.1462 17.3566C22.3549 15.623 23 13.5849 23 11.5C23 8.70416 21.8411 6.02284 19.7782 4.0459C17.7153 2.06895 14.9174 0.958313 12 0.958313ZM14.71 15.6112C14.8037 15.7003 14.8781 15.8063 14.9289 15.9231C14.9797 16.0399 15.0058 16.1651 15.0058 16.2916C15.0058 16.4182 14.9797 16.5434 14.9289 16.6602C14.8781 16.777 14.8037 16.883 14.71 16.9721C14.617 17.0619 14.5064 17.1332 14.3846 17.1818C14.2627 17.2305 14.132 17.2555 14 17.2555C13.868 17.2555 13.7373 17.2305 13.6154 17.1818C13.4936 17.1332 13.383 17.0619 13.29 16.9721L8.29 12.1804C8.19628 12.0913 8.12188 11.9853 8.07111 11.8685C8.02034 11.7517 7.99421 11.6265 7.99421 11.5C7.99421 11.3735 8.02034 11.2482 8.07111 11.1314C8.12188 11.0146 8.19628 10.9087 8.29 10.8196L13.29 6.0279C13.3832 5.93854 13.4939 5.86766 13.6158 5.81931C13.7376 5.77095 13.8681 5.74606 14 5.74606C14.1319 5.74606 14.2624 5.77095 14.3843 5.81931C14.5061 5.86766 14.6168 5.93854 14.71 6.0279C14.8032 6.11725 14.8772 6.22333 14.9277 6.34007C14.9781 6.45682 15.0041 6.58195 15.0041 6.70831C15.0041 6.83468 14.9781 6.95981 14.9277 7.07655C14.8772 7.1933 14.8032 7.29938 14.71 7.38873L10.41 11.5L14.71 15.6112Z" fill="white"/>
</svg>
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 21.2916C13.1756 21.2916 15.3023 20.6734 17.1113 19.515C18.9202 18.3567 20.3301 16.7103 21.1627 14.7841C21.9952 12.8578 22.2131 10.7383 21.7886 8.69338C21.3642 6.6485 20.3165 4.77015 18.7782 3.29588C17.2398 1.8216 15.2798 0.817602 13.146 0.41085C11.0122 0.00409696 8.80047 0.212857 6.79048 1.01073C4.78049 1.8086 3.06253 3.15975 1.85383 4.89332C0.645134 6.62689 -4.61819e-06 8.66501 -4.80046e-06 10.75C-5.04488e-06 13.5458 1.15892 16.2271 3.22182 18.204C5.28472 20.181 8.08261 21.2916 11 21.2916ZM8.29 6.63871C8.19627 6.54962 8.12187 6.44363 8.07111 6.32685C8.02034 6.21006 7.9942 6.0848 7.9942 5.95829C7.9942 5.83178 8.02034 5.70652 8.07111 5.58974C8.12187 5.47296 8.19627 5.36697 8.29 5.27788C8.38296 5.18805 8.49356 5.11676 8.61542 5.0681C8.73728 5.01945 8.86798 4.9944 9 4.9944C9.13201 4.9944 9.26271 5.01945 9.38457 5.0681C9.50643 5.11676 9.61703 5.18805 9.71 5.27788L14.71 10.0695C14.8037 10.1586 14.8781 10.2646 14.9289 10.3814C14.9797 10.4982 15.0058 10.6234 15.0058 10.75C15.0058 10.8765 14.9797 11.0017 14.9289 11.1185C14.8781 11.2353 14.8037 11.3413 14.71 11.4304L9.71 16.222C9.61676 16.3114 9.50607 16.3823 9.38425 16.4306C9.26242 16.479 9.13185 16.5039 9 16.5039C8.86814 16.5039 8.73757 16.479 8.61575 16.4306C8.49392 16.3823 8.38323 16.3114 8.29 16.222C8.19676 16.1327 8.1228 16.0266 8.07234 15.9099C8.02188 15.7931 7.9959 15.668 7.9959 15.5416C7.9959 15.4153 8.02188 15.2901 8.07234 15.1734C8.1228 15.0566 8.19676 14.9506 8.29 14.8612L12.59 10.75L8.29 6.63871Z" fill="white"/>
</svg>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment