Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
env:
JAVA_VERSION: "17"
FLUTTER_VERSION: "3.32.5"
FLUTTER_VERSION: "3.38.5"

steps:
- uses: actions/checkout@v4
Expand Down
64 changes: 0 additions & 64 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,67 +8,3 @@ Billion Sport Live brings you the thrill of live sports right to your fingertips
- **Catch Up with Free Highlights** – Missed the match? No worries! Billion Sport Live offers free highlight videos, so you can relive every key moment.

Stay connected to the sports you love, anytime, anywhere, with Billion Sport Live. Download now and never miss a game again!

### Remote Config

```json
{
"live_match_list_page": "{ \"native\": true, \"banner\": true, \"interstitial\": true, \"rewarded\": true }",
"live_match_detail_page": "{ \"native\": true, \"banner\": true, \"interstitial\": true, \"rewarded\": true }",
"highlight_list_page": "{ \"native\": true, \"banner\": true, \"interstitial\": true, \"rewarded\": true }",
"latest_build": "10",
"latest_version": "1.0.9",
"force_update": "true",
"banner_ad": "ca-app-pub-7567997114394639/8648546201",
"interstitial_ad": "ca-app-pub-7567997114394639/1475405831",
"native_ad": "ca-app-pub-7567997114394639/9425876604",
"rewarded_ad": "ca-app-pub-7567997114394639/8288226195",
"show_ads": "true",
"app_open_ad": "ca-app-pub-7567997114394639/7748304172",
"show_app_open_ad": "true",
"show_banner_ad": "true",
"show_native_ad": "true",
"show_interstitial_ad": "true",
"show_rewarded_ad": "true",
"show_ads_in_match_list": "true",
"show_ads_in_match_detail": "true",
"show_ads_in_highlight_list": "true"
}
```


### Test Deep Links

Test `bsl://open.bsl.app:`

Use ADB to simulate the custom schema:

```bash
adb shell am start -a android.intent.action.VIEW -d "bsl://open.bsl.app" com.billion.sport_live
```

Test `bsl://kyawzayartun.com:`

Use ADB for the HTTPS link:

```bash
adb shell am start -a android.intent.action.VIEW -d "bsl://kyawzayartun.com" com.billion.sport_live
```

```bash
adb shell am start -a android.intent.action.VIEW -d "https://play.google.com/store/apps/details?id=com.billion.sport_live" com.billion.sport_live
```

### Test App Links

**Test with ADB:**

Run the following command to test:

```bash
adb shell am start -a android.intent.action.VIEW -d "https://www.kyawzayartun.com/bsl" com.billion.sport_live
```

```bash
adb shell am start -a android.intent.action.VIEW -d "https://kyawzayartun.com/bsl" com.billion.sport_live
```
5 changes: 4 additions & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ analyzer:
errors:
invalid_annotation_target: ignore
plugins:
- custom_lint
- riverpod_lint

linter:
rules:

plugins:
riverpod_lint: ^3.1.0
9 changes: 4 additions & 5 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,15 @@ if (keystorePropertiesFile.exists()) {
android {
namespace = "com.billion.sport_live"
compileSdk = flutter.compileSdkVersion
ndkVersion = "27.0.12077973"
// ndkVersion = flutter.ndkVersion
ndkVersion = flutter.ndkVersion

compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

kotlinOptions {
jvmTarget = JavaVersion.VERSION_11
jvmTarget = JavaVersion.VERSION_17
}

defaultConfig {
Expand Down
73 changes: 0 additions & 73 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
<!-- permissions -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- Ads Permission for Android 12 or higher -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />

<application
android:label="${appLabel}"
android:name="${applicationName}"
Expand Down Expand Up @@ -34,82 +31,12 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<meta-data
android:name="flutter_deeplinking_enabled"
android:value="false" />

<!-- Deep Link -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:scheme="bsl"
android:host="open.bsl.app" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:scheme="bsl"
android:host="kyawzayartun.com" />
</intent-filter>

<!-- <intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:scheme="https"
android:host="play.google.com"
android:pathPrefix="/store/apps/details" />
</intent-filter> -->
<!-- Deep Link -->

<!-- App Link -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="kyawzayartun.com" />
<data android:pathPrefix="/bsl" />
</intent-filter>

<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="www.kyawzayartun.com" />
<data android:pathPrefix="/bsl" />
</intent-filter>
<!-- App Link -->
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />

<!-- <meta-data
android:name="com.onesignal.NotificationServiceExtension"
android:value="com.billion.sport_live.NotificationServiceExtension" /> -->

<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-7567997114394639~4616995952" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
Expand Down
2 changes: 1 addition & 1 deletion android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip
4 changes: 2 additions & 2 deletions android/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ pluginManagement {

plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.7.1" apply false
id "com.android.application" version "8.11.1" apply false
// START: FlutterFire Configuration
id "com.google.gms.google-services" version "4.4.2" apply false
id "com.google.firebase.crashlytics" version "2.8.1" apply false
// id "com.google.gms.google-services" version "4.3.15" apply false
// END: FlutterFire Configuration
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
id "org.jetbrains.kotlin.android" version "2.2.20" apply false
}

include ":app"
2 changes: 0 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:vs_live/firebase_options.dart';
import 'package:vs_live/src/errors/async_error_logger.dart';
import 'package:vs_live/src/errors/error_logger.dart';
import 'package:vs_live/src/utils/ads/ad_helper.dart';
import 'package:vs_live/src/utils/localization/string_hardcoded.dart';

import 'src/app.dart';
Expand All @@ -29,7 +28,6 @@ Future<void> main() async {
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

unawaited(AppRemoteConfig.initConfig());
unawaited(AdHelper.initAds());

// turn off the # in the URLs on the web
usePathUrlStrategy();
Expand Down
3 changes: 1 addition & 2 deletions lib/src/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import 'package:vs_live/src/routing/app_router.dart';
import 'package:vs_live/src/routing/app_startup.dart';
import 'package:vs_live/src/update/presentation/force_update_widget.dart';
import 'package:vs_live/src/update/utils/force_update_client.dart';
import 'package:vs_live/src/utils/ads/app_open_ad_widget.dart';
import 'package:vs_live/src/utils/remote_config/remote_config.dart';
import 'package:vs_live/src/widgets/dialog/show_alert_dialog.dart';
import 'package:wiredash/wiredash.dart';
Expand Down Expand Up @@ -83,7 +82,7 @@ class MyApp extends ConsumerWidget {
onException: (e, st) {
log(e.toString());
},
child: AppOpenAdWidget(child: child!),
child: child!,
),
),
);
Expand Down
7 changes: 3 additions & 4 deletions lib/src/errors/async_error_logger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'error_logger.dart';
import 'exceptions.dart';

class AsyncErrorLogger extends ProviderObserver {
final class AsyncErrorLogger extends ProviderObserver {
@override
void didUpdateProvider(
ProviderBase<Object?> provider,
ProviderObserverContext context,
Object? previousValue,
Object? newValue,
ProviderContainer container,
) {
final errorLogger = container.read(errorLoggerProvider);
final errorLogger = AppErrorLogger();
final error = _findError(newValue);
if (error != null) {
if (error.error is AppException) {
Expand Down
1 change: 0 additions & 1 deletion lib/src/errors/error_logger.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'dart:developer' as developer;

import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

import 'exceptions.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'dart:developer' as developer;

import 'package:dio/dio.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:vs_live/src/errors/exceptions.dart';
import 'package:vs_live/src/features/football_highlight/domain/football_highlight.dart';
Expand All @@ -10,9 +9,8 @@ import 'package:vs_live/src/utils/dio_client/highlight_client/highlight_dio_clie
part 'football_highlight_repository.g.dart';

class FootballHighlightRepository {
FootballHighlightRepository({
Dio? dioClient,
}) : _client = dioClient ??= HighlightDioClient().instance;
FootballHighlightRepository({Dio? dioClient})
: _client = dioClient ??= HighlightDioClient().instance;

final Dio _client;

Expand All @@ -21,9 +19,10 @@ class FootballHighlightRepository {
final response = await _client.get('/', cancelToken: cancelToken);

final data = response.data as List<dynamic>;
final result = data
.map((e) => FootballHighlight.fromJson(e as Map<String, dynamic>))
.toList();
final result =
data
.map((e) => FootballHighlight.fromJson(e as Map<String, dynamic>))
.toList();

return result;
} on DioException catch (error) {
Expand All @@ -41,9 +40,6 @@ class FootballHighlightRepository {
}

@riverpod
FootballHighlightRepository footballHighlightRepository(
Ref ref,
Dio? client,
) {
FootballHighlightRepository footballHighlightRepository(Ref ref, Dio? client) {
return FootballHighlightRepository(dioClient: client);
}
Loading