- Homescreen widget for android added

This commit is contained in:
2022-10-30 14:10:16 +00:00
parent 1100ce2ab8
commit 75bdcde364
16 changed files with 166 additions and 134 deletions

View File

@@ -47,7 +47,7 @@ android {
applicationId "com.appttude.h_mal.easycc" applicationId "com.appttude.h_mal.easycc"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
minSdkVersion flutter.minSdkVersion minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName

View File

@@ -1,14 +1,19 @@
package com.appttude.h_mal.easycc package com.appttude.h_mal.easycc
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.Uri import android.net.Uri
import android.widget.RemoteViews import android.widget.RemoteViews
import android.widget.Toast
import es.antonborri.home_widget.HomeWidgetBackgroundIntent import es.antonborri.home_widget.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.HomeWidgetLaunchIntent import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetPlugin
import es.antonborri.home_widget.HomeWidgetProvider import es.antonborri.home_widget.HomeWidgetProvider
class AppWidgetProvider : HomeWidgetProvider(){ class AppWidgetProvider : HomeWidgetProvider(){
override fun onUpdate( override fun onUpdate(
context: Context, context: Context,
@@ -19,16 +24,22 @@ class AppWidgetProvider : HomeWidgetProvider(){
appWidgetIds.forEach { widgetId -> appWidgetIds.forEach { widgetId ->
val views = RemoteViews(context.packageName, R.layout.currency_app_widget).apply { val views = RemoteViews(context.packageName, R.layout.currency_app_widget).apply {
// Data from background operation received // Data from background operation received
val from: String? = widgetData.getString("from", null) val from: String? = widgetData.getString("${widgetId}_from", null)
val to: String? = widgetData.getString("to", null) val to: String? = widgetData.getString("${widgetId}_to", null)
val rate: String? = widgetData.getString("rate", null) val rate: String? = widgetData.getString("${widgetId}_rate", null)
if (from.isNullOrBlank() or to.isNullOrBlank() or rate.isNullOrBlank()) {
Toast.makeText(context, "Unable to review data for widget", Toast.LENGTH_SHORT).show()
return@apply
}
val titleString = "${from}${to}" val titleString = "${from}${to}"
setTextViewText(R.id.exchangeName, titleString) setTextViewText(R.id.exchangeName, titleString)
setTextViewText(R.id.exchangeRate, rate.toString()) setTextViewText(R.id.exchangeRate, rate.toString())
val uri = Uri.parse("myAppWidget://update") val uri = Uri.parse("myAppWidget://updatewidget").buildUpon()
uri.buildUpon().query(widgetId.toString()).build() .appendQueryParameter("id", widgetId.toString())
.build()
setImageViewResource(R.id.refresh_icon, R.drawable.ic_refresh_white_24dp) setImageViewResource(R.id.refresh_icon, R.drawable.ic_refresh_white_24dp)
val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(context, uri) val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(context, uri)
@@ -42,4 +53,36 @@ class AppWidgetProvider : HomeWidgetProvider(){
appWidgetManager.updateAppWidget(widgetId, views) appWidgetManager.updateAppWidget(widgetId, views)
} }
} }
override fun onReceive(context: Context?, intent: Intent?) {
super.onReceive(context, intent)
when (intent?.action) {
}
val appWidgetManager = AppWidgetManager.getInstance(context);
val appWidgetIds = appWidgetManager.getAppWidgetIds(
context?.let { ComponentName(it, this::class.java) })
val widgetDate = context?.let { HomeWidgetPlugin.getData(it) }
appWidgetIds.forEach { widgetId ->
}
}
override fun onDeleted(context: Context?, appWidgetIds: IntArray?) {
super.onDeleted(context, appWidgetIds)
appWidgetIds?.forEach { widgetId ->
val uri = Uri.parse("myAppWidget://deletewidget")
uri.buildUpon().appendQueryParameter("id", widgetId.toString()).build()
context?.let {
HomeWidgetBackgroundIntent
.getBroadcast(it, uri)
.send()
}
}
}
} }

View File

@@ -1,24 +1,13 @@
package com.appttude.h_mal.easycc package com.appttude.h_mal.easycc
import android.app.Activity import android.app.Activity
import android.app.PendingIntent
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.activity.viewModels import android.widget.Toast
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.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.HomeWidgetBackgroundReceiver
import es.antonborri.home_widget.HomeWidgetPlugin
/** /**
* The configuration screen for the [CurrencyAppWidgetKotlin] AppWidget. * The configuration screen for the [CurrencyAppWidgetKotlin] AppWidget.
@@ -28,6 +17,9 @@ class CurrencyAppWidgetConfigureActivity : Activity(),
private var mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID private var mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID
private var top: String? = null
private var bottom: String? = null
public override fun onCreate(savedInstanceState: Bundle?) { public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.currency_app_widget_configure) setContentView(R.layout.currency_app_widget_configure)
@@ -61,18 +53,23 @@ class CurrencyAppWidgetConfigureActivity : Activity(),
override fun onClick(view: View?) { override fun onClick(view: View?) {
when (view?.tag.toString()) { when (view?.tag.toString()) {
"top", "bottom" -> showCustomDialog(view) "top", "bottom" -> showCustomDialog(view)
"submit" -> viewModel.submitSelectionOnClick() "submit" -> displaySubmitDialog()
else -> {
return
}
} }
} }
private fun displaySubmitDialog() { private fun displaySubmitDialog() {
val message = viewModel.getSubmitDialogMessage() if (top == null || bottom == null) {
WidgetSubmitDialog(this, message, object : DialogSubmit { Toast.makeText(this, "Selections incomplete", Toast.LENGTH_SHORT).show()
return
}
if (top == bottom) {
Toast.makeText(this, "Selected rates cannot be the same", Toast.LENGTH_SHORT).show()
return
}
WidgetSubmitDialog(this, getSubmitDialogMessage(), object : DialogSubmit {
override fun onSubmit() { override fun onSubmit() {
sendUpdateIntent() sendUpdateIntent(top!!, bottom!!)
finishCurrencyWidgetActivity() finishCurrencyWidgetActivity()
} }
}).show() }).show()
@@ -82,7 +79,10 @@ class CurrencyAppWidgetConfigureActivity : Activity(),
private fun showCustomDialog(view: View?) { private fun showCustomDialog(view: View?) {
CustomDialogClass(this) { CustomDialogClass(this) {
(view as TextView).text = it (view as TextView).text = it
viewModel.setCurrencyName(view.tag, it) when (view.tag.toString()) {
"top" -> top = it
"bottom" -> bottom = it
}
}.show() }.show()
} }
@@ -97,7 +97,7 @@ class CurrencyAppWidgetConfigureActivity : Activity(),
fun sendUpdateIntent(from: String, to: String) { fun sendUpdateIntent(from: String, to: String) {
// It is the responsibility of the configuration activity to update the app widget // It is the responsibility of the configuration activity to update the app widget
// Send update broadcast to widget app class // Send update broadcast to widget app class
val uri = Uri.parse("myAppWidget://createWidget").buildUpon() val uri = Uri.parse("myAppWidget://createwidget").buildUpon()
.appendQueryParameter("id", mAppWidgetId.toString()) .appendQueryParameter("id", mAppWidgetId.toString())
.appendQueryParameter("from", from) .appendQueryParameter("from", from)
.appendQueryParameter("to", to) .appendQueryParameter("to", to)
@@ -107,4 +107,13 @@ class CurrencyAppWidgetConfigureActivity : Activity(),
backgroundIntent.send() backgroundIntent.send()
} }
private fun getSubmitDialogMessage(): String {
val widgetName = getWidgetStringName()
return StringBuilder().append("Create widget for ")
.append(widgetName)
.append("?").toString()
}
private fun getWidgetStringName() = "${top!!.substring(0, 3)}${bottom!!.substring(0, 3)}"
} }

View File

@@ -1,57 +0,0 @@
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)}"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:configure="com.appttude.h_mal.easycc.CurrencyAppWidgetConfigureActivity"
android:initialKeyguardLayout="@layout/currency_app_widget"
android:initialLayout="@layout/currency_app_widget"
android:minWidth="110dp"
android:minHeight="40dp"
android:previewImage="@drawable/easyycc_widget_preview"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="3600000"
android:widgetCategory="home_screen|keyguard" />

View File

@@ -2,6 +2,9 @@ extension CurrencyExtension on String {
/// Convert currency string into currency code /// Convert currency string into currency code
/// eg. "AUD - Australian Dollar" to "AUD" /// eg. "AUD - Australian Dollar" to "AUD"
String getCurrencyCode(){ String getCurrencyCode(){
if (length == 3) {
return this;
}
return substring(0,3); return substring(0,3);
} }
} }

View File

@@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart'; import 'package:stacked/stacked.dart';
import 'package:toast/toast.dart'; import 'package:toast/toast.dart';
import 'base_viewmodel.dart';
import 'Utils/constants.dart'; import 'Utils/constants.dart';
import 'Utils/view_state.dart'; import 'Utils/view_state.dart';
import 'Utils/view_utils.dart'; import 'Utils/view_utils.dart';
import 'base_viewmodel.dart';
abstract class BaseStatelessWidget<T extends BaseViewmodel> abstract class BaseStatelessWidget<T extends BaseViewmodel>
extends StatelessWidget { extends StatelessWidget {

View File

@@ -5,8 +5,8 @@ class AppDio {
static Dio createDio() { static Dio createDio() {
Dio dio = Dio( Dio dio = Dio(
BaseOptions( BaseOptions(
receiveTimeout: 60000, receiveTimeout: 30000,
connectTimeout: 120000, connectTimeout: 30000,
) )
); );
dio.interceptors.add(LogInterceptor()); dio.interceptors.add(LogInterceptor());

View File

@@ -4,7 +4,6 @@ import 'package:easy_cc_flutter/Utils/currency_utils.dart';
import 'package:easy_cc_flutter/data/model/currency.dart'; import 'package:easy_cc_flutter/data/model/currency.dart';
import 'package:easy_cc_flutter/data/prefs/currency_pair.dart'; import 'package:easy_cc_flutter/data/prefs/currency_pair.dart';
import '../../locator.dart';
import '../../main.dart'; import '../../main.dart';
import '../network/backup_currency_api.dart'; import '../network/backup_currency_api.dart';
import '../network/currency_api.dart'; import '../network/currency_api.dart';
@@ -13,9 +12,11 @@ import '../prefs/preference_provider.dart';
import 'repository.dart'; import 'repository.dart';
class RepositoryImpl extends Repository with SafeApiCall { class RepositoryImpl extends Repository with SafeApiCall {
final PreferenceProvider _prefs = locator<PreferenceProvider>(); final PreferenceProvider _prefs;
final CurrencyApi _api = locator<CurrencyApi>(); final CurrencyApi _api;
final BackupCurrencyApi _backupApi = locator<BackupCurrencyApi>(); final BackupCurrencyApi _backupApi;
RepositoryImpl(this._prefs, this._api, this._backupApi);
@override @override
CurrencyPair getConversionPair() { CurrencyPair getConversionPair() {

View File

@@ -1,19 +1,20 @@
import 'package:easy_cc_flutter/main_view_model.dart';
import 'package:easy_cc_flutter/Utils/selection_type.dart'; import 'package:easy_cc_flutter/Utils/selection_type.dart';
import 'package:easy_cc_flutter/views/drop_down_box.dart'; import 'package:easy_cc_flutter/locator.dart';
import 'package:easy_cc_flutter/main_view_model.dart';
import 'package:easy_cc_flutter/views/converter_edit_text.dart'; import 'package:easy_cc_flutter/views/converter_edit_text.dart';
import 'package:easy_cc_flutter/views/drop_down_box.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'base_widget.dart';
import 'Utils/constants.dart'; import 'Utils/constants.dart';
import 'base_widget.dart';
class HomePage extends BaseStatelessWidget<MainViewModel> { class HomePage extends BaseStatelessWidget<MainViewModel> {
const HomePage({super.key}); const HomePage({super.key});
@override @override
MainViewModel createViewModel() { MainViewModel createViewModel() {
return MainViewModel(); return locator<MainViewModel>();
} }
@override @override

View File

@@ -1,10 +1,10 @@
import 'package:easy_cc_flutter/main_view_model.dart';
import 'package:easy_cc_flutter/data/network/backup_currency_api.dart'; import 'package:easy_cc_flutter/data/network/backup_currency_api.dart';
import 'package:easy_cc_flutter/data/network/currency_api.dart'; import 'package:easy_cc_flutter/data/network/currency_api.dart';
import 'package:easy_cc_flutter/data/repository/repository_impl.dart'; import 'package:easy_cc_flutter/data/repository/repository_impl.dart';
import 'package:easy_cc_flutter/main_view_model.dart';
import 'package:get_it/get_it.dart'; import 'package:get_it/get_it.dart';
import 'data/prefs/preference_provider.dart'; import 'data/prefs/preference_provider.dart';
import 'data/repository/repository.dart';
GetIt locator = GetIt.instance; GetIt locator = GetIt.instance;
@@ -12,6 +12,6 @@ void setupLocator() {
locator.registerLazySingleton(() => PreferenceProvider()); locator.registerLazySingleton(() => PreferenceProvider());
locator.registerLazySingleton(() => CurrencyApi.create()); locator.registerLazySingleton(() => CurrencyApi.create());
locator.registerLazySingleton(() => BackupCurrencyApi.create()); locator.registerLazySingleton(() => BackupCurrencyApi.create());
locator.registerLazySingleton(() => RepositoryImpl()); locator.registerLazySingleton<Repository>(() => RepositoryImpl(locator<PreferenceProvider>(), locator<CurrencyApi>(),locator<BackupCurrencyApi>()));
locator.registerFactory(() => MainViewModel()); locator.registerFactory(() => MainViewModel(locator<Repository>()));
} }

View File

@@ -1,8 +1,14 @@
import 'package:easy_cc_flutter/Utils/currency_utils.dart';
import 'package:easy_cc_flutter/data/network/backup_currency_api.dart';
import 'package:easy_cc_flutter/data/network/currency_api.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:home_widget/home_widget.dart'; import 'package:home_widget/home_widget.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import 'data/model/currency.dart';
import 'data/prefs/preference_provider.dart'; import 'data/prefs/preference_provider.dart';
import 'data/repository/repository.dart';
import 'data/repository/repository_impl.dart';
import 'home.dart'; import 'home.dart';
import 'locator.dart'; import 'locator.dart';
@@ -10,34 +16,56 @@ var logger = Logger(
printer: PrettyPrinter(), printer: PrettyPrinter(),
); );
void main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
setupLocator(); setupLocator();
await locator<PreferenceProvider>().init(); await locator<PreferenceProvider>().init();
await HomeWidget.registerBackgroundCallback(backgroundCallback);
runApp(const MyApp()); runApp(const MyApp());
} }
Future<void> backgroundCallback(Uri? uri) async { Future<void> backgroundCallback(Uri? uri) async {
if (uri?.host == 'updatecounter') { PreferenceProvider prefs = PreferenceProvider();
await prefs.init();
CurrencyApi api = CurrencyApi.create();
BackupCurrencyApi backupApi = BackupCurrencyApi.create();
RepositoryImpl repository = RepositoryImpl(prefs, api, backupApi);
if (uri?.host == 'updatewidget') {
Map<String, String>? querys = uri?.queryParameters; Map<String, String>? querys = uri?.queryParameters;
String? widgetId = querys?["id"];
int _counter = 0; await updateWidget(widgetId, repository);
await HomeWidget.getWidgetData<int>('_counter', defaultValue: 0).then((int? value) { } else if (uri?.host == 'createwidget') {
_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; Map<String, String>? querys = uri?.queryParameters;
String? id = querys?["id"]; String? widgetId = querys?["id"];
String? from = querys?["from"]; String? from = querys?["from"]?.getCurrencyCode();
String? to = querys?["to"]; String? to = querys?["to"]?.getCurrencyCode();
await HomeWidget.saveWidgetData<String>("${widgetId}_from", from);
await HomeWidget.saveWidgetData<String>("${widgetId}_to", to);
await updateWidget(widgetId, repository);
} }
} }
Future<void> updateWidget(String? widgetId, Repository repository) async {
String? from = await HomeWidget.getWidgetData<String>("${widgetId}_from");
String? to = await HomeWidget.getWidgetData<String>("${widgetId}_to");
if (from == null || to == null) {
return;
}
Currency currency = await repository.getConversationRateFromApi(from, to);
await HomeWidget.saveWidgetData<String>("${widgetId}_from", from);
await HomeWidget.saveWidgetData<String>("${widgetId}_to", to);
await HomeWidget.saveWidgetData<String>("${widgetId}_rate", currency.rate.toString());
await HomeWidget.updateWidget(name: 'AppWidgetProvider', iOSName: 'AppWidgetProvider');
}
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
const MyApp({super.key}); const MyApp({super.key});
@@ -58,7 +86,7 @@ class MyApp extends StatelessWidget {
// is not restarted. // is not restarted.
primarySwatch: Colors.blue, primarySwatch: Colors.blue,
), ),
home: const HomePage(), home: HomePage(),
); );
} }
} }

View File

@@ -1,14 +1,14 @@
import 'package:easy_cc_flutter/base_viewmodel.dart';
import 'package:easy_cc_flutter/Utils/selection_type.dart'; import 'package:easy_cc_flutter/Utils/selection_type.dart';
import 'package:easy_cc_flutter/base_viewmodel.dart';
import 'Utils/constants.dart'; import 'Utils/constants.dart';
import 'data/prefs/currency_pair.dart'; import 'data/prefs/currency_pair.dart';
import 'data/repository/repository.dart'; import 'data/repository/repository.dart';
import 'data/repository/repository_impl.dart';
import 'locator.dart';
class MainViewModel extends BaseViewmodel { class MainViewModel extends BaseViewmodel {
final Repository _repository = locator<RepositoryImpl>(); final Repository _repository;
MainViewModel(this._repository);
double conversionRate = 1.0; double conversionRate = 1.0;

View File

@@ -8,7 +8,6 @@ import 'package:easy_cc_flutter/data/network/currency_api.dart';
import 'package:easy_cc_flutter/data/prefs/currency_pair.dart'; import 'package:easy_cc_flutter/data/prefs/currency_pair.dart';
import 'package:easy_cc_flutter/data/prefs/preference_provider.dart'; import 'package:easy_cc_flutter/data/prefs/preference_provider.dart';
import 'package:easy_cc_flutter/data/repository/repository_impl.dart'; import 'package:easy_cc_flutter/data/repository/repository_impl.dart';
import 'package:easy_cc_flutter/locator.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart'; import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
@@ -29,7 +28,8 @@ import 'repository_test.mocks.dart';
MockSpec<DioError>(onMissingStub: OnMissingStub.returnDefault) MockSpec<DioError>(onMissingStub: OnMissingStub.returnDefault)
]) ])
void main() { void main() {
late RepositoryImpl repository; late RepositoryImpl sut;
late PreferenceProvider preferenceProvider; late PreferenceProvider preferenceProvider;
late CurrencyApi currencyApi; late CurrencyApi currencyApi;
late BackupCurrencyApi backupCurrencyApi; late BackupCurrencyApi backupCurrencyApi;
@@ -44,11 +44,7 @@ void main() {
currencyApi = MockCurrencyApi(); currencyApi = MockCurrencyApi();
backupCurrencyApi = MockBackupCurrencyApi(); backupCurrencyApi = MockBackupCurrencyApi();
locator.registerLazySingleton(() => preferenceProvider); sut = RepositoryImpl(preferenceProvider, currencyApi, backupCurrencyApi);
locator.registerLazySingleton(() => currencyApi);
locator.registerLazySingleton(() => backupCurrencyApi);
repository = RepositoryImpl();
}); });
test('get currency pair from prefs', () { test('get currency pair from prefs', () {
@@ -59,7 +55,7 @@ void main() {
when(preferenceProvider.getConversionPair()).thenReturn(pair); when(preferenceProvider.getConversionPair()).thenReturn(pair);
// Then // Then
expect(repository.getConversionPair(), pair); expect(sut.getConversionPair(), pair);
}); });
test('get currency rate from API', () async { test('get currency rate from API', () async {
@@ -77,7 +73,7 @@ void main() {
// Then // Then
Currency retrieved = Currency retrieved =
await repository.getConversationRateFromApi(fromCurrency, toCurrency); await sut.getConversationRateFromApi(fromCurrency, toCurrency);
expect(retrieved.toString(), currencyObject.toString()); expect(retrieved.toString(), currencyObject.toString());
}); });
@@ -98,7 +94,7 @@ void main() {
// Then // Then
Currency retrieved = Currency retrieved =
await repository.getConversationRateFromApi(fromCurrency, toCurrency); await sut.getConversationRateFromApi(fromCurrency, toCurrency);
expect(retrieved.toString(), currencyObject.toString()); expect(retrieved.toString(), currencyObject.toString());
}); });
@@ -115,7 +111,7 @@ void main() {
.thenAnswer((_) async => Future.error(backUpError)); .thenAnswer((_) async => Future.error(backUpError));
// Then // Then
expect(() async => await repository.getConversationRateFromApi(fromCurrency, toCurrency), expect(() async => await sut.getConversationRateFromApi(fromCurrency, toCurrency),
throwsA(predicate((e) => throwsA(predicate((e) =>
e is HttpException && e is HttpException &&
e.message == 'Error message'))); e.message == 'Error message')));

View File

@@ -1,15 +1,14 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_cc_flutter/main_view_model.dart';
import 'package:easy_cc_flutter/Utils/selection_type.dart'; import 'package:easy_cc_flutter/Utils/selection_type.dart';
import 'package:easy_cc_flutter/Utils/view_state.dart';
import 'package:easy_cc_flutter/data/model/currency.dart'; import 'package:easy_cc_flutter/data/model/currency.dart';
import 'package:easy_cc_flutter/data/prefs/currency_pair.dart'; import 'package:easy_cc_flutter/data/prefs/currency_pair.dart';
import 'package:easy_cc_flutter/data/repository/repository_impl.dart'; import 'package:easy_cc_flutter/data/repository/repository_impl.dart';
import 'package:easy_cc_flutter/locator.dart'; import 'package:easy_cc_flutter/main_view_model.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart'; import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:easy_cc_flutter/Utils/view_state.dart';
import 'viewmodel_test.mocks.dart'; import 'viewmodel_test.mocks.dart';
@@ -29,9 +28,7 @@ void main() {
// Create mock object. // Create mock object.
repository = MockRepositoryImpl(); repository = MockRepositoryImpl();
locator.registerLazySingleton(() => repository); mainViewModel = MainViewModel(repository);
mainViewModel = MainViewModel();
}); });
test('get currency pair from prefs', () { test('get currency pair from prefs', () {