blackhole_vpn 1.0.0 copy "blackhole_vpn: ^1.0.0" to clipboard
blackhole_vpn: ^1.0.0 copied to clipboard

PlatformAndroid

Set up a blackhole vpn for prevent specific applications internet connection.

example/lib/main.dart

import 'dart:developer' show log;

import 'package:flutter/material.dart';
import 'package:blackhole_vpn/blackhole_vpn.dart';
import 'package:android_package_manager/android_package_manager.dart';

final blackholeVpn = BlackholeVpnPlatform.instance;
void main() async {
  WidgetsFlutterBinding
      .ensureInitialized(); //Add this for using flutter plugin before runApp()
  final isVpnActive = await blackholeVpn.isActive(); //Get if vpn active or not

  //In example app, we use a flutter plugin from here: https://pub.dev/packages/android_package_manager
  final installedApps =
      await AndroidPackageManager().getInstalledApplications();

  //Using [Set] instead [List] because same app names may repeat.
  final installedAppsNames = {
    for (final app in installedApps!)
      if (app.name != null) app.name!
  };

  runApp(MyApp(
    isVpnActive: isVpnActive,
    installedAppNames: installedAppsNames.toList(),
  ));
}

class MyApp extends StatefulWidget {
  const MyApp(
      {super.key, required this.isVpnActive, required this.installedAppNames});
  final bool isVpnActive;
  final List<String> installedAppNames;
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late var _isVpnOn = widget.isVpnActive;

  //The selected apps for pass to blackhole vpn
  final _selectedApps = <String>[];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Blackhole Vpn Example'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            VpnStateObserver(
                builder: (isActive) => switch (isActive) {
                      true => const Text("Blackhole vpn active"),
                      false => const Text(
                          "Select the apps which you want to prevent to connect internet"),
                      null => const Text("Loading")
                    }),
            Expanded(
              child: ListView.builder(
                itemCount: widget.installedAppNames.length,
                itemBuilder: (context, index) {
                  final appName = widget.installedAppNames[index];
                  return SwitchListTile(
                    title: Text(appName),
                    value: _selectedApps.contains(appName),
                    onChanged: (bool value) {
                      if (value) {
                        setState(() {
                          _selectedApps.add(appName);
                        });
                      } else {
                        setState(() {
                          _selectedApps.remove(appName);
                        });
                      }
                    },
                  );
                },
              ),
            ),
            ElevatedButton(
                onPressed: _isVpnOn
                    ? () async {
                        await blackholeVpn
                            .stopVpnService(); //Stop Blackhole Vpn
                        setState(() {
                          _isVpnOn = false;
                        });
                      }
                    : () async {
                        //Start vpn service
                        final isActivated =
                            await blackholeVpn.runVpnService(_selectedApps);
                        if (isActivated) {
                          //Vpn permission granted
                          setState(() {
                            _isVpnOn = true;
                          });
                        } else {
                          //Vpn permission not granted
                          log("Vpn permission not granted");
                        }
                      },
                child: Text(
                    _isVpnOn ? "Stop Blackhole Vpn" : "Start Blackhole Vpn"))
          ],
        ),
      ),
    );
  }
}
4
likes
160
points
40
downloads

Publisher

unverified uploader

Weekly Downloads

Set up a blackhole vpn for prevent specific applications internet connection.

Repository (GitHub)

Documentation

API reference

License

GPL-3.0 (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on blackhole_vpn