- mid commit

This commit is contained in:
2022-10-11 22:24:52 +01:00
parent 1a7f988a61
commit 1100ce2ab8
21 changed files with 821 additions and 3 deletions

View File

@@ -68,4 +68,5 @@ flutter {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.cardview:cardview:1.0.0'
}

View File

@@ -25,8 +25,33 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.appttude.h_mal.easycc.CurrencyAppWidgetConfigureActivity"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<!-- Home Widget -->
<receiver android:name="AppWidgetProvider" android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/currency_app_widget_info" />
</receiver>
<receiver android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver" android:exported="true">
<intent-filter>
<action android:name="es.antonborri.home_widget.action.BACKGROUND" />
</intent-filter>
</receiver>
<service android:name="es.antonborri.home_widget.HomeWidgetBackgroundService"
android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>
<!-- Home Widget -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />

View File

@@ -0,0 +1,45 @@
package com.appttude.h_mal.easycc
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.SharedPreferences
import android.net.Uri
import android.widget.RemoteViews
import es.antonborri.home_widget.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetProvider
class AppWidgetProvider : HomeWidgetProvider(){
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray,
widgetData: SharedPreferences
) {
appWidgetIds.forEach { widgetId ->
val views = RemoteViews(context.packageName, R.layout.currency_app_widget).apply {
// Data from background operation received
val from: String? = widgetData.getString("from", null)
val to: String? = widgetData.getString("to", null)
val rate: String? = widgetData.getString("rate", null)
val titleString = "${from}${to}"
setTextViewText(R.id.exchangeName, titleString)
setTextViewText(R.id.exchangeRate, rate.toString())
val uri = Uri.parse("myAppWidget://update")
uri.buildUpon().query(widgetId.toString()).build()
setImageViewResource(R.id.refresh_icon, R.drawable.ic_refresh_white_24dp)
val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(context, uri)
setOnClickPendingIntent(R.id.refresh_icon, backgroundIntent)
val pendingIntent = HomeWidgetLaunchIntent.getActivity(context,
MainActivity::class.java)
setOnClickPendingIntent(R.id.widget_view, pendingIntent)
}
appWidgetManager.updateAppWidget(widgetId, views)
}
}
}

View File

@@ -0,0 +1,110 @@
package com.appttude.h_mal.easycc
import android.app.Activity
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.activity.viewModels
import com.appttude.h_mal.easycc.databinding.CurrencyAppWidgetConfigureBinding
import com.appttude.h_mal.easycc.ui.BaseActivity
import com.appttude.h_mal.easycc.ui.main.CustomDialogClass
import com.appttude.h_mal.easycc.utils.transformIntToArray
import com.appttude.h_mal.easycc.widget.CurrencyAppWidgetKotlin
import dagger.hilt.android.AndroidEntryPoint
import es.antonborri.home_widget.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.HomeWidgetBackgroundReceiver
import es.antonborri.home_widget.HomeWidgetPlugin
/**
* The configuration screen for the [CurrencyAppWidgetKotlin] AppWidget.
*/
class CurrencyAppWidgetConfigureActivity : Activity(),
View.OnClickListener {
private var mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.currency_app_widget_configure)
// Set the result to CANCELED. This will cause the widget host to cancel
// out of the widget placement if the user presses the back button.
setResult(RESULT_CANCELED)
// Find the widget id from the intent.
val extras = intent.extras
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID
)
}
// If this activity was started with an intent without an app widget ID, finish with an error.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish()
return
}
setupClickListener()
}
private fun setupClickListener() {
findViewById<TextView>(R.id.submitWidget).setOnClickListener(this)
findViewById<TextView>(R.id.currencyOne).setOnClickListener(this)
findViewById<TextView>(R.id.currencyTwo).setOnClickListener(this)
}
override fun onClick(view: View?) {
when (view?.tag.toString()) {
"top", "bottom" -> showCustomDialog(view)
"submit" -> viewModel.submitSelectionOnClick()
else -> {
return
}
}
}
private fun displaySubmitDialog() {
val message = viewModel.getSubmitDialogMessage()
WidgetSubmitDialog(this, message, object : DialogSubmit {
override fun onSubmit() {
sendUpdateIntent()
finishCurrencyWidgetActivity()
}
}).show()
}
private fun showCustomDialog(view: View?) {
CustomDialogClass(this) {
(view as TextView).text = it
viewModel.setCurrencyName(view.tag, it)
}.show()
}
fun finishCurrencyWidgetActivity() {
// Make sure we pass back the original appWidgetId
val resultValue = intent
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId)
setResult(RESULT_OK, resultValue)
finish()
}
fun sendUpdateIntent(from: String, to: String) {
// It is the responsibility of the configuration activity to update the app widget
// Send update broadcast to widget app class
val uri = Uri.parse("myAppWidget://createWidget").buildUpon()
.appendQueryParameter("id", mAppWidgetId.toString())
.appendQueryParameter("from", from)
.appendQueryParameter("to", to)
.build()
val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(this, uri)
backgroundIntent.send()
}
}

View File

@@ -0,0 +1,57 @@
package com.appttude.h_mal.easycc
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.WindowManager
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
import com.appttude.h_mal.easycc.R
/**
* Custom dialog when selecting currencies from list with filter
*/
@Suppress("DEPRECATION")
class CustomDialogClass(
context: Context,
private val onSelect: (String) -> Unit
) : Dialog(context) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.custom_dialog)
// Transparent background
window!!.setBackgroundDrawableResource(android.R.color.transparent)
// Keyboard not to overlap dialog
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
val arrayAdapter =
ArrayAdapter.createFromResource(
context, R.array.currency_arrays,
android.R.layout.simple_list_item_1
)
val list_view = findViewById<ListView>(R.id.list_view)
list_view.adapter = arrayAdapter
// Edit text to filter @arrayAdapter
findViewById<TextView>(R.id.search_text).addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
arrayAdapter.filter.filter(charSequence)
}
override fun afterTextChanged(editable: Editable) {}
})
// interface selection back to calling activity
list_view.setOnItemClickListener { adapterView, _, i, _ ->
onSelect.invoke(adapterView.getItemAtPosition(i).toString())
dismiss()
}
}
}

View File

@@ -0,0 +1,37 @@
package com.appttude.h_mal.easycc
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.widget.TextView
/**
* Dialog created when submitting the completed selections
* in [CurrencyAppWidgetConfigureActivity]
*/
class WidgetSubmitDialog(
context: Context,
private val messageString: String,
private val dialogInterface: DialogSubmit
) : Dialog(context) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.confirm_dialog)
// layer behind dialog to be transparent
window!!.setBackgroundDrawableResource(android.R.color.transparent)
// Dialog cannot be cancelled by clicking away
setCancelable(false)
findViewById<TextView>(R.id.confirmText).text = messageString
// handle dialog buttons
findViewById<TextView>(R.id.confirmYes).setOnClickListener { dialogInterface.onSubmit() }
findViewById<TextView>(R.id.confirmNo).setOnClickListener { dismiss() }
}
}
interface DialogSubmit {
fun onSubmit()
}

View File

@@ -0,0 +1,57 @@
package com.appttude.h_mal.easycc
import androidx.lifecycle.ViewModel
import com.appttude.h_mal.easycc.data.repository.Repository
import com.appttude.h_mal.easycc.ui.BaseViewModel
import com.appttude.h_mal.easycc.utils.trimToThree
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
class WidgetViewModel: ViewModel() {
var appWidgetId: Int? = null
var rateIdFrom: String? = null
var rateIdTo: String? = null
// Setup viewmodel app widget ID
// Set default values for text views
fun initiate(appId: Int) {
appWidgetId = appId
}
// Retrieve name for submit dialog (eg. AUDGBP)
fun getSubmitDialogMessage(): String {
val widgetName = getWidgetStringName()
return StringBuilder().append("Create widget for ")
.append(widgetName)
.append("?").toString()
}
fun submitSelectionOnClick() {
if (rateIdTo == null || rateIdFrom == null) {
onError("Selections incomplete")
return
}
if (rateIdFrom == rateIdTo) {
onError("Selected rates cannot be the same")
return
}
onSuccess(Unit)
}
fun setWidgetStored() {
}
// Start operation based on dialog selection
fun setCurrencyName(tag: Any?, currencyName: String) {
when (tag.toString()) {
"top" -> rateIdFrom = currencyName
"bottom" -> rateIdTo = currencyName
}
}
private fun getWidgetStringName() = "${rateIdFrom!!.substring(0, 3)}${rateIdTo!!.substring(0, 3)}"
}

View File

@@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="1080dp"
android:height="1920dp"
android:viewportWidth="1080"
android:viewportHeight="1920">
<path android:pathData="M0,0L1080,0L1080,1920L0,1920L0,0Z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="0"
android:startX="1080"
android:endY="1920"
android:endX="0"
android:type="linear">
<item
android:offset="0"
android:color="#FF315659" />
<item
android:offset="1"
android:color="#FF2978A0" />
</gradient>
</aapt:attr>
</path>
</vector>

View File

@@ -0,0 +1,10 @@
<vector android:height="24dp"
android:tint="#FFFFFF"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:fillColor="#FF000000"
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z" />
</vector>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/transparent"
android:orientation="vertical">
<androidx.cardview.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardBackgroundColor="@color/colour_three"
card_view:cardCornerRadius="22dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:orientation="vertical">
<TextView
android:id="@+id/confirmText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="36dp"
android:layout_marginBottom="24dp"
android:text="Create widget for AUDGBP?"
android:textColor="@color/colour_five" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:orientation="horizontal">
<TextView
android:id="@+id/confirmYes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:textStyle="bold"
android:text="@android:string/yes"
android:textColor="@color/colour_five" />
<TextView
android:id="@+id/confirmNo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:textStyle="bold"
android:text="@android:string/no"
android:textColor="@color/colour_five" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>

View File

@@ -0,0 +1,65 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/widget_view"
android:layout_width="match_parent"
tools:layout_width="110dp"
android:layout_height="72dp"
android:orientation="vertical"
android:background="#4D000000">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/exchangeName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:autoSizeMaxTextSize="20sp"
android:autoSizeMinTextSize="6sp"
android:autoSizeStepGranularity="2sp"
android:autoSizeTextType="uniform"
android:textColor="#ffffff"
android:text="Rate not set"
tools:text="AUDGBP" />
<ImageView
android:id="@+id/refresh_icon"
android:layout_width="18dp"
android:layout_height="18dp"
tools:src="@drawable/ic_refresh_white_24dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignBottom="@id/exchangeName"
android:adjustViewBounds="true" />
</RelativeLayout>
<TextView
android:id="@+id/exchangeRate"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginLeft="6dp"
android:layout_marginRight="6dp"
android:autoSizeMaxTextSize="100sp"
android:autoSizeMinTextSize="6sp"
android:autoSizeStepGranularity="2sp"
android:autoSizeTextType="uniform"
android:maxLines="1"
android:gravity="center"
android:textColor="#ffffff"
android:textStyle="bold"
tools:text="0.52646215" />
<!-- <TextView-->
<!-- android:id="@+id/lastUpdated"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center"-->
<!-- android:textSize="8sp"-->
<!-- android:textColor="#ffffff"-->
<!-- android:text=" "-->
<!-- tools:text="Last updated: 03:18 Wed" />-->
</LinearLayout>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:background="@drawable/ic_background"
tools:context=".CurrencyAppWidgetConfigureActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="12dp">
<LinearLayout
android:id="@+id/whole_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.cardview.widget.CardView
style="@style/cardview_theme"
android:layout_margin="11dp">
<TextView
android:id="@+id/currencyOne"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:tag="top"
android:textColor="@color/colour_five"
android:textSize="18sp"
tools:text="Currency One" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
style="@style/cardview_theme"
android:layout_margin="11dp">
<TextView
android:id="@+id/currencyTwo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:tag="bottom"
android:textColor="@color/colour_five"
android:textSize="18sp"
tools:text="Currency Two" />
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView
android:id="@+id/submitWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/whole_view"
android:layout_alignParentEnd="true"
android:layout_marginEnd="22dp"
android:padding="12dp"
android:tag="submit"
android:text="Submit"
android:textColor="@color/colour_five" />
</RelativeLayout>
</RelativeLayout>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:backgroundTint="@android:color/transparent"
android:orientation="vertical">
<androidx.cardview.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="match_parent"
card_view:cardCornerRadius="22dp"
card_view:cardBackgroundColor="@color/colour_three"
android:layout_marginTop="45dp">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="45dp"
android:layout_marginTop="20dp"
card_view:cardBackgroundColor="@color/colour_three"
card_view:cardCornerRadius="22dp">
<EditText
android:id="@+id/search_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:hint="Search Currency" />
</androidx.cardview.widget.CardView>
</LinearLayout>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colour_one">#253031</color>
<color name="colour_two">#315659</color>
<color name="colour_three">#2978A0</color>
<color name="colour_four">#8549ff</color>
<color name="colour_five">#C6E0FF</color>
</resources>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colour_one">#253031</color>
<color name="colour_two">#315659</color>
<color name="colour_three">#2978A0</color>
<color name="colour_four">#8549ff</color>
<color name="colour_five">#C6E0FF</color>
</resources>

View File

@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="currency_arrays">
<item>ALL - Albanian Lek</item>
<item>AFN - Afghan Afghani</item>
<item>DZD - Algerian Dinar</item>
<item>AOA - Angolan Kwanza</item>
<item>ARS - Argentine Peso</item>
<item>AMD - Armenian Dram</item>
<item>AWG - Aruban Florin</item>
<item>AUD - Australian Dollar</item>
<item>AZN - Azerbaijani Manat</item>
<item>BSD - Bahamian Dollar</item>
<item>BHD - Bahraini Dinar</item>
<item>BDT - Bangladeshi Taka</item>
<item>BBD - Barbadian Dollar</item>
<item>BYR - Belarusian Ruble</item>
<item>BZD - Belize Dollar</item>
<item>BTN - Bhutanese Ngultrum</item>
<item>BTC - Bitcoin</item>
<item>BOB - Bolivian Boliviano</item>
<item>BAM - Bosnia And Herzegovina Konvertibilna Marka</item>
<item>BWP - Botswana Pula</item>
<item>BRL - Brazilian Real</item>
<item>GBP - British Pound</item>
<item>BND - Brunei Dollar</item>
<item>BGN - Bulgarian Lev</item>
<item>BIF - Burundi Franc</item>
<item>KHR - Cambodian Riel</item>
<item>CAD - Canadian Dollar</item>
<item>CVE - Cape Verdean Escudo</item>
<item>KYD - Cayman Islands Dollar</item>
<item>XAF - Central African CFA Franc</item>
<item>XPF - CFP Franc</item>
<item>CLP - Chilean Peso</item>
<item>CNY - Chinese Yuan</item>
<item>COP - Colombian Peso</item>
<item>KMF - Comorian Franc</item>
<item>CDF - Congolese Franc</item>
<item>CRC - Costa Rican Colon</item>
<item>HRK - Croatian Kuna</item>
<item>CUP - Cuban Peso</item>
<item>CZK - Czech Koruna</item>
<item>DKK - Danish Krone</item>
<item>DJF - Djiboutian Franc</item>
<item>DOP - Dominican Peso</item>
<item>XCD - East Caribbean Dollar</item>
<item>EGP - Egyptian Pound</item>
<item>ERN - Eritrean Nakfa</item>
<item>ETB - Ethiopian Birr</item>
<item>EUR - Euro</item>
<item>FKP - Falkland Islands Pound</item>
<item>FJD - Fijian Dollar</item>
<item>GMD - Gambian Dalasi</item>
<item>GEL - Georgian Lari</item>
<item>GHS - Ghanaian Cedi</item>
<item>GIP - Gibraltar Pound</item>
<item>GTQ - Guatemalan Quetzal</item>
<item>GNF - Guinean Franc</item>
<item>GYD - Guyanese Dollar</item>
<item>HTG - Haitian Gourde</item>
<item>HNL - Honduran Lempira</item>
<item>HKD - Hong Kong Dollar</item>
<item>HUF - Hungarian Forint</item>
<item>ISK - Icelandic Kr\u00f3na</item>
<item>INR - Indian Rupee</item>
<item>IDR - Indonesian Rupiah</item>
<item>IRR - Iranian Rial</item>
<item>IQD - Iraqi Dinar</item>
<item>ILS - Israeli New Sheqel</item>
<item>JMD - Jamaican Dollar</item>
<item>JPY - Japanese Yen</item>
<item>JOD - Jordanian Dinar</item>
<item>KZT - Kazakhstani Tenge</item>
<item>KES - Kenyan Shilling</item>
<item>KWD - Kuwaiti Dinar</item>
<item>KGS - Kyrgyzstani Som</item>
<item>LAK - Lao Kip</item>
<item>LVL - Latvian Lats</item>
<item>LBP - Lebanese Lira</item>
<item>LSL - Lesotho Loti</item>
<item>LRD - Liberian Dollar</item>
<item>LYD - Libyan Dinar</item>
<item>MOP - Macanese Pataca</item>
<item>MKD - Macedonian Denar</item>
<item>MGA - Malagasy Ariary</item>
<item>MWK - Malawian Kwacha</item>
<item>MYR - Malaysian Ringgit</item>
<item>MVR - Maldivian Rufiyaa</item>
<item>MRO - Mauritanian Ouguiya</item>
<item>MUR - Mauritian Rupee</item>
<item>MXN - Mexican Peso</item>
<item>MDL - Moldovan Leu</item>
<item>MNT - Mongolian Tugrik</item>
<item>MAD - Moroccan Dirham</item>
<item>MZN - Mozambican Metical</item>
<item>MMK - Myanma Kyat</item>
<item>NAD - Namibian Dollar</item>
<item>NPR - Nepalese Rupee</item>
<item>ANG - Netherlands Antillean Gulden</item>
<item>TWD - New Taiwan Dollar</item>
<item>NZD - New Zealand Dollar</item>
<item>NIO - Nicaraguan Cordoba</item>
<item>NGN - Nigerian Naira</item>
<item>KPW - North Korean Won</item>
<item>NOK - Norwegian Krone</item>
<item>OMR - Omani Rial</item>
<item>TOP - Paanga</item>
<item>PKR - Pakistani Rupee</item>
<item>PAB - Panamanian Balboa</item>
<item>PGK - Papua New Guinean Kina</item>
<item>PYG - Paraguayan Guarani</item>
<item>PEN - Peruvian Nuevo Sol</item>
<item>PHP - Philippine Peso</item>
<item>PLN - Polish Zloty</item>
<item>QAR - Qatari Riyal</item>
<item>RON - Romanian Leu</item>
<item>RUB - Russian Ruble</item>
<item>RWF - Rwandan Franc</item>
<item>SHP - Saint Helena Pound</item>
<item>WST - Samoan Tala</item>
<item>STD - Sao Tome And Principe Dobra</item>
<item>SAR - Saudi Riyal</item>
<item>RSD - Serbian Dinar</item>
<item>SCR - Seychellois Rupee</item>
<item>SLL - Sierra Leonean Leone</item>
<item>SGD - Singapore Dollar</item>
<item>SBD - Solomon Islands Dollar</item>
<item>SOS - Somali Shilling</item>
<item>ZAR - South African Rand</item>
<item>KRW - South Korean Won</item>
<item>XDR - Special Drawing Rights</item>
<item>LKR - Sri Lankan Rupee</item>
<item>SDG - Sudanese Pound</item>
<item>SRD - Surinamese Dollar</item>
<item>SZL - Swazi Lilangeni</item>
<item>SEK - Swedish Krona</item>
<item>CHF - Swiss Franc</item>
<item>SYP - Syrian Pound</item>
<item>TJS - Tajikistani Somoni</item>
<item>TZS - Tanzanian Shilling</item>
<item>THB - Thai Baht</item>
<item>TTD - Trinidad and Tobago Dollar</item>
<item>TND - Tunisian Dinar</item>
<item>TRY - Turkish New Lira</item>
<item>TMT - Turkmenistan Manat</item>
<item>AED - UAE Dirham</item>
<item>UGX - Ugandan Shilling</item>
<item>UAH - Ukrainian Hryvnia</item>
<item>USD - United States Dollar</item>
<item>UYU - Uruguayan Peso</item>
<item>UZS - Uzbekistani Som</item>
<item>VUV - Vanuatu Vatu</item>
<item>VEF - Venezuelan Bolivar</item>
<item>VND - Vietnamese Dong</item>
<item>XOF - West African CFA Franc</item>
<item>YER - Yemeni Rial</item>
<item>ZMW - Zambian Kwacha</item>
</string-array>
</resources>

View File

@@ -15,4 +15,12 @@
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
<style name="cardview_theme" parent="CardView">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="cardBackgroundColor">@color/colour_three</item>
<item name="cardCornerRadius">22dp</item>
<!--<item name="cardElevation">0dp</item>-->
</style>
</resources>

View File

@@ -6,7 +6,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:home_widget/home_widget.dart';
import 'package:logger/logger.dart';
import 'data/prefs/preference_provider.dart';
@@ -16,6 +17,27 @@ void main() async {
runApp(const MyApp());
}
Future<void> backgroundCallback(Uri? uri) async {
if (uri?.host == 'updatecounter') {
Map<String, String>? querys = uri?.queryParameters;
int _counter = 0;
await HomeWidget.getWidgetData<int>('_counter', defaultValue: 0).then((int? value) {
_counter = value ?? 0;
_counter++;
});
await HomeWidget.saveWidgetData<int>('_counter', _counter);
await HomeWidget.updateWidget(name: 'AppWidgetProvider', iOSName: 'AppWidgetProvider');
} else if (uri?.host == 'createWidget') {
Map<String, String>? querys = uri?.queryParameters;
String? id = querys?["id"];
String? from = querys?["from"];
String? to = querys?["to"];
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});

View File

@@ -282,6 +282,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
home_widget:
dependency: "direct main"
description:
name: home_widget
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.6"
http_multi_server:
dependency: transitive
description:

View File

@@ -49,6 +49,7 @@ dependencies:
mockito: ^5.3.2
json_annotation: ^4.7.0
flutter_launcher_icons: ^0.10.0
home_widget: ^0.1.6
dev_dependencies:
flutter_test: