Skip to content
This repository was archived by the owner on Jan 5, 2021. It is now read-only.

Commit 1c573a2

Browse files
author
Luis Correa
committed
Request draw over other apps permission
1 parent d60f4fa commit 1c573a2

File tree

4 files changed

+104
-6
lines changed

4 files changed

+104
-6
lines changed

android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
<uses-permission android:name="android.permission.INTERNET"/>
1010
<uses-permission android:name="android.permission.CALL_PHONE" />
11+
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
1112

1213
<application
1314
android:name="io.flutter.app.FlutterApplication"
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,41 @@
11
package com.cubanopensource.todo
22

3+
import android.content.Intent
4+
import android.net.Uri
5+
import android.os.Build
6+
import android.provider.Settings
37
import io.flutter.embedding.android.FlutterActivity
8+
import io.flutter.embedding.engine.FlutterEngine
9+
import io.flutter.plugin.common.MethodChannel
410

511
class MainActivity: FlutterActivity() {
12+
private val CHANNEL = "todoappchannel_android"
13+
14+
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
15+
super.configureFlutterEngine(flutterEngine)
16+
17+
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
18+
call, result ->
19+
20+
when {
21+
call.method == "getDrawPermissionState" -> result.success(getDrawPermissionState())
22+
call.method == "reqDrawPermission" -> result.success(reqDrawPermission())
23+
else -> result.notImplemented()
24+
}
25+
}
26+
}
27+
28+
private fun getDrawPermissionState(): Boolean {
29+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
30+
return (Settings.canDrawOverlays(this))
31+
32+
return true
33+
}
34+
35+
private fun reqDrawPermission() {
36+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
37+
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:${packageName}"))
38+
startActivityForResult(intent, 1)
39+
}
40+
}
641
}

lib/pages/home_page.dart

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
import 'package:connectivity/connectivity.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter/rendering.dart';
4+
import 'package:provider/provider.dart';
5+
import 'package:quick_actions/quick_actions.dart';
36
import 'package:shared_preferences/shared_preferences.dart';
4-
import 'package:todo/pages/login_page.dart';
5-
import 'package:todo/components/ussd_widget.dart';
67
import 'package:todo/components/disclaim.dart';
7-
import 'package:connectivity/connectivity.dart';
8+
import 'package:todo/components/ussd_widget.dart';
9+
import 'package:todo/pages/account_page.dart';
10+
import 'package:todo/pages/login_page.dart';
811
import 'package:todo/pages/settings_page.dart';
9-
import 'package:provider/provider.dart';
1012
import 'package:todo/services/AppStateNotifier.dart';
11-
import 'package:todo/pages/account_page.dart';
12-
import 'package:quick_actions/quick_actions.dart';
13+
import 'package:todo/services/PlatformService.dart';
1314
import 'package:todo/services/phone.dart';
1415

1516
class HomePage extends StatefulWidget {
@@ -117,6 +118,8 @@ class _HomePageState extends State<HomePage> {
117118
);
118119
});
119120

121+
showReqDrawDialog(context);
122+
120123
return Scaffold(
121124
floatingActionButton: FloatingActionButton(
122125
backgroundColor: Theme.of(context).focusColor,
@@ -205,4 +208,37 @@ class _HomePageState extends State<HomePage> {
205208
),
206209
);
207210
}
211+
212+
showReqDrawDialog(BuildContext context) async {
213+
if (await getDrawPermissionState()) {
214+
return;
215+
}
216+
217+
Widget continueButton = FlatButton(
218+
child: Text("Continuar"),
219+
onPressed: () async {
220+
await reqDrawPermission();
221+
Navigator.pop(context);
222+
},
223+
);
224+
225+
// set up the AlertDialog
226+
AlertDialog alert = AlertDialog(
227+
title: Text("Solicitud de permiso"),
228+
content: Text(
229+
"Hola, perdona la molestia pero necesito permiso para poder mostrarte información sobre tu velocidad de conexión,"
230+
" por favor toca en el botón de continuar y habilita la superposición de pantalla"),
231+
actions: [
232+
continueButton,
233+
],
234+
);
235+
236+
// show the dialog
237+
await showDialog(
238+
context: context,
239+
builder: (BuildContext context) {
240+
return alert;
241+
},
242+
);
243+
}
208244
}

lib/services/PlatformService.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:flutter/services.dart';
2+
3+
const platform = const MethodChannel("todoappchannel_android");
4+
5+
Future<bool> getDrawPermissionState() async {
6+
bool drawPermission;
7+
8+
try {
9+
final result = await platform.invokeMethod("getDrawPermissionState");
10+
drawPermission = result;
11+
} catch (e) {
12+
drawPermission = false;
13+
}
14+
15+
return drawPermission;
16+
}
17+
18+
Future<void> reqDrawPermission() async {
19+
if(! await getDrawPermissionState()) {
20+
try {
21+
await platform.invokeMethod("reqDrawPermission");
22+
} catch (e) {
23+
print(e.message);
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)