Skip to content

Commit e2d9845

Browse files
authored
Merge pull request #249 from amitamrutiya2210/power_management_2
Add new power management features under setting screen
2 parents fdba577 + ff942e2 commit e2d9845

File tree

129 files changed

+1583
-381
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+1583
-381
lines changed

lib/Api/auth_api.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import 'dart:convert';
22
import 'package:dio/dio.dart';
3-
import 'package:flood_mobile/Constants/api_endpoints.dart';
4-
import 'package:flood_mobile/Model/register_user_model.dart';
5-
import 'package:flood_mobile/Model/current_user_detail_model.dart';
6-
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
7-
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
83
import 'package:flutter/cupertino.dart';
94
import 'package:flutter_bloc/flutter_bloc.dart';
105
import 'package:shared_preferences/shared_preferences.dart';
6+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
7+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
8+
import 'package:flood_mobile/Constants/api_endpoints.dart';
9+
import 'package:flood_mobile/Model/current_user_detail_model.dart';
10+
import 'package:flood_mobile/Model/register_user_model.dart';
1111

1212
class AuthApi {
1313
static Future<bool> loginUser(

lib/Api/client_api.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import 'dart:convert';
22
import 'package:dio/dio.dart';
3-
import 'package:flood_mobile/Constants/api_endpoints.dart';
3+
import 'package:flutter/cupertino.dart';
4+
import 'package:flutter_bloc/flutter_bloc.dart';
5+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
46
import 'package:flood_mobile/Blocs/client_settings_bloc/client_settings_bloc.dart';
7+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
8+
import 'package:flood_mobile/Constants/api_endpoints.dart';
59
import 'package:flood_mobile/Model/client_settings_model.dart';
610
import 'package:flood_mobile/Services/transfer_speed_manager.dart';
7-
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
8-
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
9-
import 'package:flutter/cupertino.dart';
10-
import 'package:flutter_bloc/flutter_bloc.dart';
1111

1212
class ClientApi {
1313
static getClientSettings(BuildContext context) async {

lib/Api/delete_feeds_and_rules.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:convert';
22
import 'package:dio/dio.dart';
3-
import 'package:flood_mobile/Constants/api_endpoints.dart';
4-
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
5-
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
63
import 'package:flutter/material.dart';
74
import 'package:flutter_bloc/flutter_bloc.dart';
5+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
6+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
7+
import 'package:flood_mobile/Constants/api_endpoints.dart';
88

99
class DeleteFeedOrRulesApi {
1010
static Future<void> deleteFeedsOrRules(

lib/Api/event_handler_api.dart

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
import 'dart:collection';
22
import 'dart:convert';
3+
import 'dart:io';
34
import 'package:awesome_notifications/awesome_notifications.dart';
5+
import 'package:battery_plus/battery_plus.dart';
46
import 'package:duration/duration.dart';
5-
import 'package:flood_mobile/Model/download_rate_model.dart';
6-
import 'package:flood_mobile/Model/torrent_model.dart';
7-
import 'package:flood_mobile/Services/file_size_helper.dart';
8-
import 'package:flood_mobile/Blocs/filter_torrent_bloc/filter_torrent_bloc.dart';
9-
import 'package:flood_mobile/Blocs/home_screen_bloc/home_screen_bloc.dart';
107
import 'package:flutter/cupertino.dart';
8+
import 'package:flutter/services.dart';
119
import 'package:flutter_bloc/flutter_bloc.dart';
1210
import 'package:flutter_client_sse/flutter_client_sse.dart';
1311
import 'package:json_patch/json_patch.dart';
12+
import 'package:wifi_iot/wifi_iot.dart';
13+
import 'package:flood_mobile/Api/torrent_api.dart';
14+
import 'package:flood_mobile/Blocs/filter_torrent_bloc/filter_torrent_bloc.dart';
15+
import 'package:flood_mobile/Blocs/home_screen_bloc/home_screen_bloc.dart';
16+
import 'package:flood_mobile/Blocs/power_management_bloc/power_management_bloc.dart';
1417
import 'package:flood_mobile/Constants/notification_keys.dart';
18+
import 'package:flood_mobile/Model/download_rate_model.dart';
19+
import 'package:flood_mobile/Model/torrent_model.dart';
20+
import 'package:flood_mobile/Services/file_size_helper.dart';
1521

1622
String torrentLength = '0';
1723

@@ -71,10 +77,10 @@ class EventHandlerApi {
7177
}
7278

7379
//Updating the full list of torrent
74-
static void updateFullTorrentList({
80+
static Future<void> updateFullTorrentList({
7581
required SSEModel model,
7682
required BuildContext context,
77-
}) {
83+
}) async {
7884
Map<String, dynamic> oldTorrentList =
7985
BlocProvider.of<HomeScreenBloc>(context, listen: false)
8086
.state
@@ -122,6 +128,38 @@ class EventHandlerApi {
122128
//Setting the full list of torrent
123129
BlocProvider.of<HomeScreenBloc>(context, listen: false)
124130
.add(SetTorrentListEvent(newTorrentList: torrentList));
131+
132+
final PowerManagementBloc powerManagementBloc =
133+
BlocProvider.of<PowerManagementBloc>(context, listen: false);
134+
//Exit screen on all download finished
135+
if (powerManagementBloc.state.shutDownWhenFinishDownload &&
136+
isAllDownloadFinished(context)) {
137+
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
138+
exit(0);
139+
}
140+
141+
//Turn off wifi on all download finished
142+
if (powerManagementBloc.state.shutDownWifi &&
143+
isAllDownloadFinished(context)) {
144+
turnOffWiFi(powerManagementBloc.state.shutDownWifi);
145+
}
146+
147+
// Stop all download on low battery
148+
Battery _battery = Battery();
149+
int currentBatteryLevel = await _battery.batteryLevel;
150+
bool isBatteryLimitSet =
151+
powerManagementBloc.state.batteryLimitLevel > 0 ? true : false;
152+
if (isBatteryLimitSet &&
153+
currentBatteryLevel <= powerManagementBloc.state.batteryLimitLevel) {
154+
BlocProvider.of<HomeScreenBloc>(context, listen: false)
155+
.state
156+
.torrentList
157+
.forEach((element) {
158+
if (element.status.contains('downloading')) {
159+
TorrentApi.stopTorrent(hashes: [element.hash], context: context);
160+
}
161+
});
162+
}
125163
}
126164

127165
static Future<void> showNotification(int id, BuildContext context) async {
@@ -321,3 +359,18 @@ class EventHandlerApi {
321359
}
322360
}
323361
}
362+
363+
bool isAllDownloadFinished(BuildContext context) {
364+
return BlocProvider.of<HomeScreenBloc>(context, listen: false)
365+
.state
366+
.torrentList
367+
.every(
368+
(element) {
369+
return element.status.contains('complete');
370+
},
371+
);
372+
}
373+
374+
void turnOffWiFi(bool wifiStatus) async {
375+
WiFiForIoTPlugin.setEnabled(!wifiStatus);
376+
}

lib/Api/feed_api.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import 'dart:convert';
22
import 'package:dio/dio.dart';
3-
import 'package:flood_mobile/Constants/api_endpoints.dart';
4-
import 'package:flood_mobile/Model/rss_feeds_model.dart';
3+
import 'package:flutter/material.dart';
4+
import 'package:flutter_bloc/flutter_bloc.dart';
55
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
66
import 'package:flood_mobile/Blocs/home_screen_bloc/home_screen_bloc.dart';
77
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
8-
import 'package:flutter/material.dart';
9-
import 'package:flutter_bloc/flutter_bloc.dart';
8+
import 'package:flood_mobile/Constants/api_endpoints.dart';
9+
import 'package:flood_mobile/Model/rss_feeds_model.dart';
1010
import 'package:flood_mobile/Model/single_feed_and_response_model.dart';
1111
import 'package:flood_mobile/Model/single_rule_model.dart';
1212

lib/Api/feeds_contents_api.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'package:dio/dio.dart';
2-
import 'package:flood_mobile/Constants/api_endpoints.dart';
3-
import 'package:flood_mobile/Model/feeds_content_model.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_bloc/flutter_bloc.dart';
44
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
55
import 'package:flood_mobile/Blocs/home_screen_bloc/home_screen_bloc.dart';
66
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
7-
import 'package:flutter/material.dart';
8-
import 'package:flutter_bloc/flutter_bloc.dart';
7+
import 'package:flood_mobile/Constants/api_endpoints.dart';
8+
import 'package:flood_mobile/Model/feeds_content_model.dart';
99

1010
class FeedsContentsApi {
1111
static Future<void> listAllFeedsContents(

lib/Api/notifications_api.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import 'package:dio/dio.dart';
2-
import 'package:flood_mobile/Constants/api_endpoints.dart';
3-
import 'package:flood_mobile/Model/notification_model.dart';
2+
import 'package:flutter/cupertino.dart';
3+
import 'package:flutter_bloc/flutter_bloc.dart';
44
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
55
import 'package:flood_mobile/Blocs/home_screen_bloc/home_screen_bloc.dart';
66
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
7-
import 'package:flutter/cupertino.dart';
8-
import 'package:flutter_bloc/flutter_bloc.dart';
7+
import 'package:flood_mobile/Constants/api_endpoints.dart';
8+
import 'package:flood_mobile/Model/notification_model.dart';
99

1010
class NotificationApi {
1111
static Future<void> getNotifications({required BuildContext context}) async {
@@ -61,7 +61,7 @@ class NotificationApi {
6161
print(response);
6262
await getNotifications(context: context);
6363
} else {
64-
print('---ERROR---');
64+
print('---ERROR IN CLEAR NOTIFICATION---');
6565
}
6666
} catch (error) {
6767
print('--ERROR IN CLEAR NOTIFICATION--');

lib/Api/rules_api.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import 'dart:convert';
2-
32
import 'package:dio/dio.dart';
4-
import 'package:flood_mobile/Constants/api_endpoints.dart';
5-
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
6-
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
73
import 'package:flutter/cupertino.dart';
84
import 'package:flutter_bloc/flutter_bloc.dart';
5+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
6+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
7+
import 'package:flood_mobile/Constants/api_endpoints.dart';
98

109
class RulesApi {
1110
static Future<void> addRules({

lib/Api/torrent_api.dart

Lines changed: 67 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
import 'dart:convert';
22
import 'package:awesome_notifications/awesome_notifications.dart';
3+
import 'package:battery_plus/battery_plus.dart';
4+
import 'package:connectivity_plus/connectivity_plus.dart';
35
import 'package:dio/dio.dart';
6+
import 'package:flutter/material.dart';
7+
import 'package:flutter_bloc/flutter_bloc.dart';
8+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
9+
import 'package:flood_mobile/Blocs/power_management_bloc/power_management_bloc.dart';
10+
import 'package:flood_mobile/Blocs/torrent_content_screen_bloc/torrent_content_screen_bloc.dart';
11+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
412
import 'package:flood_mobile/Constants/api_endpoints.dart';
513
import 'package:flood_mobile/Model/torrent_content_model.dart';
614
import 'package:flood_mobile/Model/torrent_model.dart';
15+
import 'package:flood_mobile/Pages/widgets/flood_snackbar.dart';
716
import 'package:flood_mobile/Services/file_folder_nester.dart';
8-
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
9-
import 'package:flood_mobile/Blocs/torrent_content_screen_bloc/torrent_content_screen_bloc.dart';
10-
import 'package:flutter/cupertino.dart';
11-
import 'package:flutter_bloc/flutter_bloc.dart';
12-
13-
import '../Blocs/user_detail_bloc/user_detail_bloc.dart';
17+
import 'package:flood_mobile/l10n/l10n.dart';
1418

1519
class TorrentApi {
1620
// Gets list of torrents
@@ -50,35 +54,64 @@ class TorrentApi {
5054
}
5155
}
5256

53-
static Future<void> startTorrent(
54-
{required List<String> hashes, required BuildContext context}) async {
55-
try {
56-
String url =
57-
BlocProvider.of<ApiBloc>(context, listen: false).state.baseUrl +
58-
ApiEndpoints.startTorrentUrl;
59-
print('---START TORRENT---');
60-
print(url);
61-
Response response;
62-
Dio dio = new Dio();
63-
//Headers
64-
dio.options.headers['Accept'] = "application/json";
65-
dio.options.headers['Content-Type'] = "application/json";
66-
dio.options.headers['Connection'] = "keep-alive";
67-
dio.options.headers['Cookie'] =
68-
BlocProvider.of<UserDetailBloc>(context, listen: false).token;
69-
Map<String, dynamic> mp = Map();
70-
mp['hashes'] = hashes;
71-
String rawBody = json.encode(mp);
72-
response = await dio.post(
73-
url,
74-
data: rawBody,
75-
);
76-
if (response.statusCode == 200) {
77-
print('--TORRENT STARTED--');
57+
static Future<void> startTorrent({
58+
required List<String> hashes,
59+
required BuildContext context,
60+
}) async {
61+
final powerState = BlocProvider.of<PowerManagementBloc>(context).state;
62+
final connectivityResult = await Connectivity().checkConnectivity();
63+
64+
if (!powerState.wifiOnlyDownload ||
65+
connectivityResult == ConnectivityResult.wifi) {
66+
final chargingConnected = powerState.downloadChargingConnected;
67+
final batteryState = powerState.currentBatteryState;
68+
69+
if (chargingConnected && batteryState == BatteryState.charging ||
70+
!chargingConnected) {
71+
try {
72+
String url =
73+
BlocProvider.of<ApiBloc>(context, listen: false).state.baseUrl +
74+
ApiEndpoints.startTorrentUrl;
75+
print('---START TORRENT---');
76+
print(url);
77+
Response response;
78+
Dio dio = new Dio();
79+
//Headers
80+
dio.options.headers['Accept'] = "application/json";
81+
dio.options.headers['Content-Type'] = "application/json";
82+
dio.options.headers['Connection'] = "keep-alive";
83+
dio.options.headers['Cookie'] =
84+
BlocProvider.of<UserDetailBloc>(context, listen: false).token;
85+
Map<String, dynamic> mp = {'hashes': hashes};
86+
String rawBody = json.encode(mp);
87+
response = await dio.post(
88+
url,
89+
data: rawBody,
90+
);
91+
if (response.statusCode == 200) {
92+
print('--TORRENT STARTED--');
93+
}
94+
} catch (error) {
95+
print('--ERROR IN TORRENT START--');
96+
print(error.toString());
97+
}
98+
} else {
99+
final warningSnackbar = addFloodSnackBar(
100+
SnackbarType.caution,
101+
context.l10n.download_chanrging_only_snackbar,
102+
context.l10n.button_dismiss);
103+
ScaffoldMessenger.of(context).clearSnackBars();
104+
ScaffoldMessenger.of(context).showSnackBar(
105+
warningSnackbar,
106+
);
78107
}
79-
} catch (error) {
80-
print('--ERROR IN TORRENT START--');
81-
print(error.toString());
108+
} else {
109+
final warningSnackbar = addFloodSnackBar(SnackbarType.caution,
110+
context.l10n.wifi_only_snackbar, context.l10n.button_dismiss);
111+
ScaffoldMessenger.of(context).clearSnackBars();
112+
ScaffoldMessenger.of(context).showSnackBar(
113+
warningSnackbar,
114+
);
82115
}
83116
}
84117

lib/Api/update_feed_api.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:convert';
22
import 'package:dio/dio.dart';
3-
import 'package:flood_mobile/Constants/api_endpoints.dart';
4-
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
5-
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
63
import 'package:flutter/material.dart';
74
import 'package:flutter_bloc/flutter_bloc.dart';
5+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
6+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
7+
import 'package:flood_mobile/Constants/api_endpoints.dart';
88

99
class UpdateFeedApi {
1010
static Future<void> updateFeed({

0 commit comments

Comments
 (0)