0% found this document useful (0 votes)
17 views7 pages

App Lock

The document outlines the structure and functionality of a Flutter application called 'secure_app_lock', which serves as a secure app locker. It includes dependencies, models for locked apps and applications, a provider for managing app locks, and screens for user interaction. The application allows users to manage locked apps, search installed applications, and toggle lock status through a user-friendly interface.

Uploaded by

m.ishaqbannu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views7 pages

App Lock

The document outlines the structure and functionality of a Flutter application called 'secure_app_lock', which serves as a secure app locker. It includes dependencies, models for locked apps and applications, a provider for managing app locks, and screens for user interaction. The application allows users to manage locked apps, search installed applications, and toggle lock status through a user-friendly interface.

Uploaded by

m.ishaqbannu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

// File: pubspec.

yaml
name: secure_app_lock
description: A secure app locker application
publish_to: 'none'
version: 1.0.0+1

environment:
sdk: ">=2.17.0 <4.0.0"

dependencies:
flutter:
sdk: flutter
provider: ^6.0.5
shared_preferences: ^2.2.0
device_apps: ^2.2.0
cupertino_icons: ^1.0.5

dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0

flutter:
uses-material-design: true

// File: lib/models/locked_app_model.dart
class LockedAppModel {
final String packageName;
final String appName;
bool isLocked;

LockedAppModel({
required this.packageName,
required this.appName,
this.isLocked = false,
});

Map<String, dynamic> toJson() => {


'packageName': packageName,
'appName': appName,
'isLocked': isLocked,
};

factory LockedAppModel.fromJson(Map<String, dynamic> json) => LockedAppModel(


packageName: json['packageName'],
appName: json['appName'],
isLocked: json['isLocked'] ?? false,
);
}

// File: lib/models/application_model.dart
import 'dart:typed_data';

class Application {
final String packageName;
final String appName;

Application({
required this.packageName,
required this.appName,
});
}

class ApplicationWithIcon extends Application {


final Uint8List icon;

ApplicationWithIcon({
required String packageName,
required String appName,
required this.icon,
}) : super(packageName: packageName, appName: appName);
}

// File: lib/providers/app_lock_provider.dart
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:device_apps/device_apps.dart';
import 'dart:convert';
import '../models/application_model.dart';
import '../models/locked_app_model.dart';

class AppLockProvider with ChangeNotifier {


List<Application> _installedApps = [];
List<LockedAppModel> _lockedApps = [];
final String _lockedAppsKey = 'locked_apps';

List<Application> get installedApps => _installedApps;

AppLockProvider() {
_loadLockedApps();
}

Future<void> loadInstalledApps() async {


final apps = await DeviceApps.getInstalledApplications(
includeAppIcons: true,
includeSystemApps: false,
onlyAppsWithLaunchIntent: true,
);

_installedApps = apps.map((app) {
if (app is ApplicationWithIcon) {
return ApplicationWithIcon(
packageName: app.packageName,
appName: app.appName,
icon: app.icon,
);
}
return Application(
packageName: app.packageName,
appName: app.appName,
);
}).toList();

notifyListeners();
}

List<Application> searchInstalledApps(String query) {


if (query.isEmpty) return _installedApps;
return _installedApps.where((app) {
return app.appName.toLowerCase().contains(query.toLowerCase()) ||
app.packageName.toLowerCase().contains(query.toLowerCase());
}).toList();
}

Future<void> _loadLockedApps() async {


final prefs = await SharedPreferences.getInstance();
final lockedAppsJson = prefs.getStringList(_lockedAppsKey) ?? [];

_lockedApps = lockedAppsJson
.map((json) => LockedAppModel.fromJson(jsonDecode(json)))
.toList();

notifyListeners();
}

Future<void> _saveLockedApps() async {


final prefs = await SharedPreferences.getInstance();
final lockedAppsJson = _lockedApps
.map((app) => jsonEncode(app.toJson()))
.toList();

await prefs.setStringList(_lockedAppsKey, lockedAppsJson);


notifyListeners();
}

Future<bool> isAppLocked(String packageName) async {


return _lockedApps.any((app) => app.packageName == packageName && app.isLocked);
}

Future<void> toggleAppLock(LockedAppModel app) async {


final existingIndex = _lockedApps
.indexWhere((lockedApp) => lockedApp.packageName == app.packageName);

if (existingIndex >= 0) {
_lockedApps[existingIndex].isLocked = app.isLocked;
} else {
_lockedApps.add(app);
}

await _saveLockedApps();
}

List<LockedAppModel> get lockedApps => _lockedApps;


}

// File: lib/screens/app_lock_screen.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/app_lock_provider.dart';
import '../models/locked_app_model.dart';
import '../models/application_model.dart';
import 'dart:typed_data';

class AppLockScreen extends StatefulWidget {


@override
_AppLockScreenState createState() => _AppLockScreenState();
}

class _AppLockScreenState extends State<AppLockScreen> {


final TextEditingController _searchController = TextEditingController();
List<Application> _filteredApps = [];

@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_loadInstalledApps();
});
}

void _loadInstalledApps() async {


final appLockProvider = Provider.of<AppLockProvider>(context, listen: false);
await appLockProvider.loadInstalledApps();
setState(() {
_filteredApps = appLockProvider.installedApps;
});
}

void _filterApps(String query) {


final appLockProvider = Provider.of<AppLockProvider>(context, listen: false);
setState(() {
_filteredApps = appLockProvider.searchInstalledApps(query);
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('App Lock'),
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: _searchController,
decoration: InputDecoration(
hintText: 'Search apps...',
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
),
onChanged: _filterApps,
),
),
Expanded(
child: Consumer<AppLockProvider>(
builder: (context, appLockProvider, child) {
return _filteredApps.isEmpty
? Center(child: Text('No apps found'))
: ListView.builder(
itemCount: _filteredApps.length,
itemBuilder: (context, index) {
final app = _filteredApps[index];
return _AppLockListTile(app: app);
},
);
},
),
),
],
),
);
}
}

class _AppLockListTile extends StatefulWidget {


final Application app;

const _AppLockListTile({Key? key, required this.app}) : super(key: key);

@override
__AppLockListTileState createState() => __AppLockListTileState();
}

class __AppLockListTileState extends State<_AppLockListTile> {


bool _isLocked = false;

@override
void initState() {
super.initState();
_checkLockStatus();
}

Future<void> _checkLockStatus() async {


final isLocked = await Provider.of<AppLockProvider>(
context,
listen: false
).isAppLocked(widget.app.packageName);

setState(() {
_isLocked = isLocked;
});
}

void _toggleAppLock() {
final appLockProvider = Provider.of<AppLockProvider>(
context,
listen: false
);

final lockedApp = LockedAppModel(


packageName: widget.app.packageName,
appName: widget.app.appName,
isLocked: !_isLocked,
);

appLockProvider.toggleAppLock(lockedApp);

setState(() {
_isLocked = !_isLocked;
});
}

@override
Widget build(BuildContext context) {
return ListTile(
leading: widget.app is ApplicationWithIcon
? Image.memory(
(widget.app as ApplicationWithIcon).icon,
width: 40,
height: 40,
)
: Icon(Icons.app_registration),
title: Text(widget.app.appName),
subtitle: Text(widget.app.packageName),
trailing: Switch(
value: _isLocked,
onChanged: (_) => _toggleAppLock(),
activeColor: Colors.green,
),
);
}
}

// File: lib/screens/home_screen.dart
import 'package:flutter/material.dart';
import 'app_lock_screen.dart';

class HomeScreen extends StatelessWidget {


@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Secure App Lock'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => AppLockScreen()),
);
},
child: Text('Manage App Lock'),
),
],
),
),
);
}
}

// File: lib/main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/app_lock_provider.dart';
import 'screens/home_screen.dart';
import 'screens/pin_setup_screen.dart';
import 'screens/lock_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() async {


WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
final hasPin = prefs.containsKey('app_pin');

runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AppLockProvider()),
],
child: MyApp(hasPin: hasPin),
),
);
}

class MyApp extends StatelessWidget {


final bool hasPin;

const MyApp({Key? key, required this.hasPin}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Secure App Lock',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: hasPin ? LockScreen() : PinSetupScreen(),
routes: {
'/home': (context) => HomeScreen(),
'/lock': (context) => LockScreen(),
},
);
}
}

You might also like