mirror of
https://github.com/revanced/revanced-manager
synced 2024-05-14 13:56:57 +02:00
feat: use native TextField
Signed-off-by: validcube <pun.butrach@gmail.com>
This commit is contained in:
parent
975180b075
commit
9ed43efe5d
@ -41,11 +41,11 @@ class ManagerAPI {
|
|||||||
String defaultKeystorePassword = 's3cur3p@ssw0rd';
|
String defaultKeystorePassword = 's3cur3p@ssw0rd';
|
||||||
String defaultApiUrl = 'https://api.revanced.app/';
|
String defaultApiUrl = 'https://api.revanced.app/';
|
||||||
String defaultRepoUrl = 'https://api.github.com';
|
String defaultRepoUrl = 'https://api.github.com';
|
||||||
String defaultPatcherRepo = 'revanced/revanced-patcher';
|
String defaultPatcherRepo = 'ReVanced/revanced-patcher';
|
||||||
String defaultPatchesRepo = 'revanced/revanced-patches';
|
String defaultPatchesRepo = 'ReVanced/revanced-patches';
|
||||||
String defaultIntegrationsRepo = 'revanced/revanced-integrations';
|
String defaultIntegrationsRepo = 'ReVanced/revanced-integrations';
|
||||||
String defaultCliRepo = 'revanced/revanced-cli';
|
String defaultCliRepo = 'ReVanced/revanced-cli';
|
||||||
String defaultManagerRepo = 'revanced/revanced-manager';
|
String defaultManagerRepo = 'ReVanced/revanced-manager';
|
||||||
String? patchesVersion = '';
|
String? patchesVersion = '';
|
||||||
String? integrationsVersion = '';
|
String? integrationsVersion = '';
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ import 'package:flutter_i18n/flutter_i18n.dart';
|
|||||||
import 'package:revanced_manager/app/app.locator.dart';
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
import 'package:revanced_manager/services/toast.dart';
|
import 'package:revanced_manager/services/toast.dart';
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart';
|
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart';
|
import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart';
|
||||||
import 'package:stacked/stacked.dart';
|
import 'package:stacked/stacked.dart';
|
||||||
|
|
||||||
@ -35,15 +34,19 @@ class SManageApiUrl extends BaseViewModel {
|
|||||||
content: SingleChildScrollView(
|
content: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
CustomTextField(
|
TextField(
|
||||||
leadingIcon: Icon(
|
controller: _apiUrlController,
|
||||||
Icons.api_outlined,
|
autocorrect: false,
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
|
||||||
),
|
|
||||||
inputController: _apiUrlController,
|
|
||||||
label: I18nText('settingsView.selectApiURL'),
|
|
||||||
hint: apiUrl,
|
|
||||||
onChanged: (value) => notifyListeners(),
|
onChanged: (value) => notifyListeners(),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
icon: Icon(
|
||||||
|
Icons.api_outlined,
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText('settingsView.selectApiURL').toString(),
|
||||||
|
hintText: apiUrl,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -4,7 +4,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_i18n/flutter_i18n.dart';
|
import 'package:flutter_i18n/flutter_i18n.dart';
|
||||||
import 'package:revanced_manager/app/app.locator.dart';
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart';
|
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart';
|
import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart';
|
||||||
import 'package:stacked/stacked.dart';
|
import 'package:stacked/stacked.dart';
|
||||||
|
|
||||||
@ -35,11 +34,17 @@ class SManageKeystorePassword extends BaseViewModel {
|
|||||||
content: SingleChildScrollView(
|
content: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
CustomTextField(
|
TextField(
|
||||||
inputController: _keystorePasswordController,
|
controller: _keystorePasswordController,
|
||||||
label: I18nText('settingsView.selectKeystorePassword'),
|
autocorrect: false,
|
||||||
hint: '',
|
obscureText: true,
|
||||||
onChanged: (value) => notifyListeners(),
|
onChanged: (value) => notifyListeners(),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText(
|
||||||
|
'settingsView.selectKeystorePassword',
|
||||||
|
).toString(),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -5,7 +5,6 @@ import 'package:flutter_i18n/flutter_i18n.dart';
|
|||||||
import 'package:revanced_manager/app/app.locator.dart';
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
import 'package:revanced_manager/services/toast.dart';
|
import 'package:revanced_manager/services/toast.dart';
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart';
|
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart';
|
import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart';
|
||||||
import 'package:stacked/stacked.dart';
|
import 'package:stacked/stacked.dart';
|
||||||
|
|
||||||
@ -45,59 +44,97 @@ class SManageSources extends BaseViewModel {
|
|||||||
content: SingleChildScrollView(
|
content: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
CustomTextField(
|
/*
|
||||||
leadingIcon: const Icon(
|
API for accessing the specified repositories
|
||||||
Icons.extension_outlined,
|
If default is used, will use the ReVanced API
|
||||||
color: Colors.transparent,
|
*/
|
||||||
),
|
TextField(
|
||||||
inputController: _hostSourceController,
|
controller: _hostSourceController,
|
||||||
label: I18nText('settingsView.hostRepositoryLabel'),
|
autocorrect: false,
|
||||||
hint: hostRepository,
|
|
||||||
onChanged: (value) => notifyListeners(),
|
onChanged: (value) => notifyListeners(),
|
||||||
),
|
decoration: InputDecoration(
|
||||||
const SizedBox(height: 20),
|
icon: Icon(
|
||||||
CustomTextField(
|
Icons.rocket_launch_outlined,
|
||||||
leadingIcon: Icon(
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
Icons.extension_outlined,
|
),
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText(
|
||||||
|
'settingsView.hostRepositoryLabel',
|
||||||
|
).toString(),
|
||||||
|
hintText: hostRepository,
|
||||||
),
|
),
|
||||||
inputController: _orgPatSourceController,
|
|
||||||
label: I18nText('settingsView.orgPatchesLabel'),
|
|
||||||
hint: patchesRepo.split('/')[0],
|
|
||||||
onChanged: (value) => notifyListeners(),
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
CustomTextField(
|
// Patches owner's name
|
||||||
leadingIcon: const Icon(
|
TextField(
|
||||||
Icons.extension_outlined,
|
controller: _orgPatSourceController,
|
||||||
color: Colors.transparent,
|
autocorrect: false,
|
||||||
),
|
|
||||||
inputController: _patSourceController,
|
|
||||||
label: I18nText('settingsView.sourcesPatchesLabel'),
|
|
||||||
hint: patchesRepo.split('/')[1],
|
|
||||||
onChanged: (value) => notifyListeners(),
|
onChanged: (value) => notifyListeners(),
|
||||||
),
|
decoration: InputDecoration(
|
||||||
const SizedBox(height: 20),
|
icon: Icon(
|
||||||
CustomTextField(
|
Icons.extension_outlined,
|
||||||
leadingIcon: Icon(
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
Icons.merge_outlined,
|
),
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText(
|
||||||
|
'settingsView.orgPatchesLabel',
|
||||||
|
).toString(),
|
||||||
|
hintText: patchesRepo.split('/')[0],
|
||||||
),
|
),
|
||||||
inputController: _orgIntSourceController,
|
|
||||||
label: I18nText('settingsView.orgIntegrationsLabel'),
|
|
||||||
hint: integrationsRepo.split('/')[0],
|
|
||||||
onChanged: (value) => notifyListeners(),
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
CustomTextField(
|
// Patches repository's name
|
||||||
leadingIcon: const Icon(
|
TextField(
|
||||||
Icons.merge_outlined,
|
controller: _patSourceController,
|
||||||
color: Colors.transparent,
|
autocorrect: false,
|
||||||
),
|
|
||||||
inputController: _intSourceController,
|
|
||||||
label: I18nText('settingsView.sourcesIntegrationsLabel'),
|
|
||||||
hint: integrationsRepo.split('/')[1],
|
|
||||||
onChanged: (value) => notifyListeners(),
|
onChanged: (value) => notifyListeners(),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.extension_outlined,
|
||||||
|
color: Colors.transparent,
|
||||||
|
),
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText(
|
||||||
|
'settingsView.sourcesPatchesLabel',
|
||||||
|
).toString(),
|
||||||
|
hintText: patchesRepo.split('/')[1],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
// Integrations owner's name
|
||||||
|
TextField(
|
||||||
|
controller: _orgIntSourceController,
|
||||||
|
autocorrect: false,
|
||||||
|
onChanged: (value) => notifyListeners(),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
icon: Icon(
|
||||||
|
Icons.merge_outlined,
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText(
|
||||||
|
'settingsView.orgIntegrationsLabel',
|
||||||
|
).toString(),
|
||||||
|
hintText: integrationsRepo.split('/')[0],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
// Integrations repository's name
|
||||||
|
TextField(
|
||||||
|
controller: _intSourceController,
|
||||||
|
autocorrect: false,
|
||||||
|
onChanged: (value) => notifyListeners(),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.merge_outlined,
|
||||||
|
color: Colors.transparent,
|
||||||
|
),
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
labelText: I18nText(
|
||||||
|
'settingsView.sourcesIntegrationsLabel',
|
||||||
|
).toString(),
|
||||||
|
hintText: integrationsRepo.split('/')[1],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
I18nText('settingsView.sourcesUpdateNote'),
|
I18nText('settingsView.sourcesUpdateNote'),
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class CustomSwitch extends StatelessWidget {
|
|
||||||
const CustomSwitch({
|
|
||||||
super.key,
|
|
||||||
required this.onChanged,
|
|
||||||
required this.value,
|
|
||||||
});
|
|
||||||
final ValueChanged<bool> onChanged;
|
|
||||||
final bool value;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return GestureDetector(
|
|
||||||
onTap: () => onChanged(!value),
|
|
||||||
child: SizedBox(
|
|
||||||
height: 25,
|
|
||||||
width: 50,
|
|
||||||
child: Stack(
|
|
||||||
children: <Widget>[
|
|
||||||
AnimatedContainer(
|
|
||||||
height: 25,
|
|
||||||
width: 50,
|
|
||||||
curve: Curves.ease,
|
|
||||||
duration: const Duration(milliseconds: 400),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: const BorderRadius.all(
|
|
||||||
Radius.circular(25.0),
|
|
||||||
),
|
|
||||||
color: value
|
|
||||||
? Theme.of(context).colorScheme.primary
|
|
||||||
: Theme.of(context).colorScheme.secondary,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
AnimatedAlign(
|
|
||||||
curve: Curves.ease,
|
|
||||||
duration: const Duration(milliseconds: 400),
|
|
||||||
alignment: !value ? Alignment.centerLeft : Alignment.centerRight,
|
|
||||||
child: Container(
|
|
||||||
height: 20,
|
|
||||||
width: 20,
|
|
||||||
margin: const EdgeInsets.symmetric(horizontal: 3),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
shape: BoxShape.circle,
|
|
||||||
color: value
|
|
||||||
? Theme.of(context).colorScheme.primaryContainer
|
|
||||||
: Theme.of(context).colorScheme.surface,
|
|
||||||
boxShadow: [
|
|
||||||
BoxShadow(
|
|
||||||
color: Colors.black12.withOpacity(0.1),
|
|
||||||
spreadRadius: 0.5,
|
|
||||||
blurRadius: 1,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:revanced_manager/ui/widgets/settingsView/custom_switch.dart';
|
|
||||||
|
|
||||||
class CustomSwitchTile extends StatelessWidget {
|
|
||||||
const CustomSwitchTile({
|
|
||||||
super.key,
|
|
||||||
required this.title,
|
|
||||||
required this.subtitle,
|
|
||||||
required this.value,
|
|
||||||
required this.onTap,
|
|
||||||
this.padding,
|
|
||||||
});
|
|
||||||
final Widget title;
|
|
||||||
final Widget subtitle;
|
|
||||||
final bool value;
|
|
||||||
final Function(bool) onTap;
|
|
||||||
final EdgeInsetsGeometry? padding;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListTile(
|
|
||||||
contentPadding: padding ?? EdgeInsets.zero,
|
|
||||||
title: title,
|
|
||||||
subtitle: subtitle,
|
|
||||||
onTap: () => onTap(!value),
|
|
||||||
trailing: CustomSwitch(
|
|
||||||
value: value,
|
|
||||||
onChanged: onTap,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class CustomTextField extends StatelessWidget {
|
|
||||||
const CustomTextField({
|
|
||||||
super.key,
|
|
||||||
required this.inputController,
|
|
||||||
required this.label,
|
|
||||||
required this.hint,
|
|
||||||
this.leadingIcon,
|
|
||||||
required this.onChanged,
|
|
||||||
});
|
|
||||||
final TextEditingController inputController;
|
|
||||||
final Widget label;
|
|
||||||
final String hint;
|
|
||||||
final Widget? leadingIcon;
|
|
||||||
final Function(String)? onChanged;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 4.0),
|
|
||||||
child: TextField(
|
|
||||||
controller: inputController,
|
|
||||||
onChanged: onChanged,
|
|
||||||
keyboardType: TextInputType.text,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
icon: leadingIcon,
|
|
||||||
label: label,
|
|
||||||
filled: true,
|
|
||||||
fillColor: Theme.of(context).colorScheme.secondaryContainer,
|
|
||||||
hintText: hint,
|
|
||||||
hintStyle: TextStyle(
|
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
|
||||||
),
|
|
||||||
floatingLabelStyle: MaterialStateTextStyle.resolveWith(
|
|
||||||
(states) => states.contains(MaterialState.focused)
|
|
||||||
? TextStyle(color: Theme.of(context).colorScheme.primary)
|
|
||||||
: TextStyle(color: Theme.of(context).colorScheme.secondary),
|
|
||||||
),
|
|
||||||
contentPadding: const EdgeInsets.symmetric(
|
|
||||||
vertical: 8.0,
|
|
||||||
horizontal: 16.0,
|
|
||||||
),
|
|
||||||
border: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
),
|
|
||||||
focusedBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
width: 2.0,
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
),
|
|
||||||
errorBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(
|
|
||||||
color: Theme.of(context).colorScheme.error,
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
),
|
|
||||||
enabledBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user