diff --git a/assets/images/drawer_notification.svg b/assets/images/drawer_notification.svg new file mode 100644 index 00000000..c8946652 --- /dev/null +++ b/assets/images/drawer_notification.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/help_center.svg b/assets/images/help_center.svg new file mode 100644 index 00000000..e552808b --- /dev/null +++ b/assets/images/help_center.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/logout.svg b/assets/images/logout.svg new file mode 100644 index 00000000..baad9f28 --- /dev/null +++ b/assets/images/logout.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/rate_us.svg b/assets/images/rate_us.svg new file mode 100644 index 00000000..652012d1 --- /dev/null +++ b/assets/images/rate_us.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/report.svg b/assets/images/report.svg new file mode 100644 index 00000000..cc4b6f9a --- /dev/null +++ b/assets/images/report.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/setting.svg b/assets/images/setting.svg new file mode 100644 index 00000000..ee423b86 --- /dev/null +++ b/assets/images/setting.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/whats_new.svg b/assets/images/whats_new.svg new file mode 100644 index 00000000..a0be613c --- /dev/null +++ b/assets/images/whats_new.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 73c9872f..d50e5066 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -21,8 +21,8 @@ class URLs { // static String getFileUrl(String file) => (file == null || file.isEmpty) ? null :1 (file.contains("/") ? file : "$_host/attachment/$file"); // API Routes - // static get login => "$_baseUrl/MobileAuth/Login"; // web login - static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // mobile login + static get login => "$_baseUrl/MobileAuth/Login"; // web login + // static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // mobile login static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post static get getSites => "$_baseUrl/Customer/GetCustomers"; // get diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 70dee981..ea36ea54 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import '../../models/enums/translation_keys.dart'; @@ -21,8 +23,16 @@ class AppBottomNavigationBar extends StatelessWidget { borderRadius: const BorderRadius.only(topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0)), child: Container( height: 100.toScreenHeight, - decoration: BoxDecoration( - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 14)], + decoration: const BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0C000000), + blurRadius: 14, + offset: Offset(0, 0), + spreadRadius: 0, + ) + ], ), child: BottomNavigationBar( items: [ @@ -32,8 +42,11 @@ class AppBottomNavigationBar extends StatelessWidget { navBarItem(context, index: 3, iconName: "message", label: context.translation.contactUs), ], currentIndex: selectedIndex, - selectedFontSize: 12, onTap: onPressed, + selectedLabelStyle: AppTextStyles.tinyFont.copyWith(fontSize: 11), + unselectedLabelStyle: AppTextStyles.tinyFont.copyWith(fontSize: 11), + selectedItemColor: AppColor.primary70, + unselectedItemColor: const Color(0xFF757575), ), ), ); diff --git a/lib/new_views/common_widgets/app_drawer.dart b/lib/new_views/common_widgets/app_drawer.dart index 9d15fd40..a4d1713d 100644 --- a/lib/new_views/common_widgets/app_drawer.dart +++ b/lib/new_views/common_widgets/app_drawer.dart @@ -1,6 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import '../../controllers/providers/api/user_provider.dart'; import '../../controllers/providers/settings/setting_provider.dart'; @@ -15,27 +20,59 @@ class AppDrawer extends StatelessWidget { final settingProvider = Provider.of(context, listen: false); final userProvider = Provider.of(context, listen: false); return Drawer( + width: MediaQuery.of(context).size.width * .8, child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppFilledButton( - label: context.translation.login, - onPressed: () async { - /// TODO [zaid] : show dialog before logout - // bool result = await showDialog( - // context: context, - // builder: (_) => const AAlertDialog( - // title: "_subtitle.signOut", - // content: "_subtitle.signOutAlert", - // ), - // ); - if (true) { - settingProvider.resetSettings(); - userProvider.reset(); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } - }), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 90, + height: 90, + decoration: const ShapeDecoration( + image: DecorationImage( + image: NetworkImage( + "https://www.shutterstock.com/shutterstock/photos/1714666150/display_1500/stock-photo-head-shot-portrait-close-up-smiling-confident-businessman-wearing-glasses-looking-at-camera-1714666150.jpg"), + fit: BoxFit.cover, + ), + shape: OvalBorder( + side: BorderSide(width: 1, color: Color(0xFFE4E5E6)), + ), + ), + ), + Icon(Icons.clear).onPress(() => Navigator.of(context).pop()) + ], + ), + 8.height, + Text( + "Eng Mahmoud", + style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600, letterSpacing: -0.12), + ), + Text( + "context.welcome@gmail.com", + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + ), + 18.height, + 1.divider, + ListView( + padding: EdgeInsets.only(top: 24), + children: [ + drawerItem("drawer_notification", "Notification"), + 18.height, + drawerItem("help_center", "Help Center"), + 18.height, + drawerItem("rate_us", "Rate Us"), + 18.height, + drawerItem("setting", "Settings"), + 18.height, + drawerItem("report", "Report a bug"), + 18.height, + drawerItem("whats_new", "What's New"), + ], + ).expanded, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -60,8 +97,45 @@ class AppDrawer extends StatelessWidget { ), ], ), + drawerItem("logout", "Logout").onPress(() { + /// TODO [zaid] : show dialog before logout + // bool result = await showDialog( + // context: context, + // builder: (_) => const AAlertDialog( + // title: "_subtitle.signOut", + // content: "_subtitle.signOutAlert", + // ), + // ); + if (true) { + settingProvider.resetSettings(); + userProvider.reset(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } + }), + 18.height, + 1.divider, + 24.height, ], - ), + ).paddingOnly(top: 66, start: 16, end: 24, bottom: 62), + ); + } + + Widget drawerItem(String icon, String title, {Color color}) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/$icon.svg", + color: color ?? const Color(0xFF757575), + width: 24, + height: 24, + ), + 16.width, + Text( + title, + style: AppTextStyles.heading6.copyWith(color: const Color(0xFF3B3D4A)), + ), + ], ); } } diff --git a/lib/new_views/pages/land_page/dashboard_page.dart b/lib/new_views/pages/land_page/dashboard_page.dart index 384946ba..37793396 100644 --- a/lib/new_views/pages/land_page/dashboard_page.dart +++ b/lib/new_views/pages/land_page/dashboard_page.dart @@ -1,13 +1,19 @@ import 'package:flutter/material.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_drawer.dart'; +import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart'; import 'dashboard_page_indicator.dart'; class DashboardPage extends StatefulWidget { - const DashboardPage({Key key}) : super(key: key); + final VoidCallback onDrawerPress; + + const DashboardPage({Key key, this.onDrawerPress}) : super(key: key); @override State createState() => _DashboardPageState(); @@ -35,50 +41,100 @@ class _DashboardPageState extends State { @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - context.translation.welcome, - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), - ), - Text( - "Eng Mahmoud", - style: Theme.of(context).textTheme.titleLarge?.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), - ), - 24.height, - Row( + return Scaffold( + floatingActionButton: const AppFloatingActionButton(), + appBar: AppBar( + automaticallyImplyLeading: false, + backgroundColor: const Color(0xffF8F9FB), + titleSpacing: 0, + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - DashboardPageIndicator(index: 0, currentPage: _currentPage, controller: _controller), - 3.width, - DashboardPageIndicator(index: 1, currentPage: _currentPage, controller: _controller), - 3.width, - DashboardPageIndicator(index: 2, currentPage: _currentPage, controller: _controller), - 10.width, - Text( - "0$_currentPage/03", - style: Theme.of(context).textTheme.labelMedium?.copyWith(fontWeight: FontWeight.w500), + Container( + width: 48, + height: 48, + decoration: const ShapeDecoration( + image: DecorationImage( + image: NetworkImage( + "https://www.shutterstock.com/shutterstock/photos/1714666150/display_1500/stock-photo-head-shot-portrait-close-up-smiling-confident-businessman-wearing-glasses-looking-at-camera-1714666150.jpg"), + fit: BoxFit.cover, + ), + shape: OvalBorder( + side: BorderSide(width: 1, color: Color(0xFFE4E5E6)), + ), + ), + ).onPress(widget.onDrawerPress), + Stack( + alignment: Alignment.topRight, + children: [ + const Icon( + Icons.notifications, + color: Color(0xff767676), + size: 30, + ).paddingOnly(top: 6, end: 0), + Positioned( + top: 0, + right: 0, + child: Container( + padding: const EdgeInsets.all(4), + decoration: const ShapeDecoration( + color: Color(0xFFD02127), + shape: CircleBorder(), + ), + child: Text("3", style: AppTextStyles.bodyText), + ), + ) + ], ), ], - ), - 8.height, - Expanded( - child: PageView( - controller: _controller, - children: const [ - Center( - child: Text('First Page'), - ), - Center( - child: Text('Second Page'), - ), - Center( - child: Text('Third Page'), + ).paddingOnly(start: 16, end: 16), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context.translation.welcome, + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + ), + Text( + "Eng Mahmoud", + style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), + ), + 24.height, + Row( + children: [ + DashboardPageIndicator(index: 0, currentPage: _currentPage, controller: _controller), + 3.width, + DashboardPageIndicator(index: 1, currentPage: _currentPage, controller: _controller), + 3.width, + DashboardPageIndicator(index: 2, currentPage: _currentPage, controller: _controller), + 10.width, + Text( + "0$_currentPage/03", + style: Theme.of(context).textTheme.labelMedium?.copyWith(fontWeight: FontWeight.w500), ), ], ), - ), - ], + 8.height, + Expanded( + child: PageView( + controller: _controller, + children: const [ + Center( + child: Text('First Page'), + ), + Center( + child: Text('Second Page'), + ), + Center( + child: Text('Third Page'), + ), + ], + ), + ), + ], + ).paddingAll(16), ); } } diff --git a/lib/new_views/pages/land_page/dashboard_page_indicator.dart b/lib/new_views/pages/land_page/dashboard_page_indicator.dart index ef430b7d..6ded44d1 100644 --- a/lib/new_views/pages/land_page/dashboard_page_indicator.dart +++ b/lib/new_views/pages/land_page/dashboard_page_indicator.dart @@ -6,6 +6,7 @@ import '../../app_style/app_color.dart'; class DashboardPageIndicator extends StatelessWidget { final PageController controller; final int index, currentPage; + const DashboardPageIndicator({ Key key, @required this.controller, @@ -21,7 +22,7 @@ class DashboardPageIndicator extends StatelessWidget { controller.animateToPage(index, duration: const Duration(milliseconds: 500), curve: Curves.ease); }, child: Container( - width: (isActive ? 30 : 16).toScreenWidth, + width: (isActive ? 30 : 12).toScreenWidth, height: 9.toScreenHeight, decoration: BoxDecoration(color: isActive ? AppColor.green50 : AppColor.neutral40, borderRadius: BorderRadius.circular(8)), ), diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index f7f5cdc1..242cc74f 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -6,6 +6,9 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/new_views/pages/land_page/home_app_bar.dart'; import 'package:test_sa/new_views/pages/land_page/my_assets_page.dart'; import 'package:test_sa/new_views/pages/land_page/my_request/my_requests_page.dart'; +import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart'; +import 'package:test_sa/views/pages/user/land_page.dart' as old_page; +import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import '../../common_widgets/app_bottom_nav_bar.dart'; import '../../common_widgets/app_drawer.dart'; @@ -15,6 +18,7 @@ import 'dashboard_page.dart'; class LandPage extends StatefulWidget { static const String routeName = "/land-page"; + const LandPage({Key key}) : super(key: key); @override @@ -24,12 +28,21 @@ class LandPage extends StatefulWidget { class _LandPageState extends State { final GlobalKey _scaffoldKey = GlobalKey(); int currentPageIndex = 0; - bool showAppbar =true; - final List _pages = const [ - DashboardPage(), - MyRequestsPage(), - MyAssetsPage(), - ]; + bool showAppbar = true; + List _pages; + + @override + void initState() { + _pages = [ + DashboardPage(onDrawerPress: (() { + _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer(); + })), + old_page.LandPage(), + SingleDevicePicker(), + MyRequestsPage(), + ]; + super.initState(); + } @override Widget build(BuildContext context) { @@ -54,10 +67,8 @@ class _LandPageState extends State { }, child: Scaffold( key: _scaffoldKey, - appBar: showAppbar?HomeAppBar(scaffoldKey: _scaffoldKey): null, + drawer: AppDrawer(), body: _pages[currentPageIndex], - drawer: const AppDrawer(), - floatingActionButton: const AppFloatingActionButton(), bottomNavigationBar: AppBottomNavigationBar( selectedIndex: currentPageIndex, onPressed: (index) { @@ -73,13 +84,13 @@ class _LandPageState extends State { currentPageIndex = index; }); - if(index == 1){ + if (index == 1) { setState(() { - showAppbar =false; + showAppbar = false; }); - }else{ + } else { setState(() { - showAppbar =true; + showAppbar = true; }); } } diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index f84ed95f..6e994108 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -6,6 +6,7 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import '../../controllers/providers/api/user_provider.dart'; import '../../controllers/providers/settings/setting_provider.dart'; @@ -102,7 +103,7 @@ class _LoginPageState extends State { /// The below line for the new design // Navigator.pushNamed(context, LandPage.routeName); - Navigator.pushNamed(context, old.LandPage.id); + Navigator.pushNamed(context, LandPage.routeName); } else { Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest); } diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index 192e4db1..b6ba6774 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -9,6 +9,7 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/app_notification.dart'; +import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart'; import '../../models/size_config.dart'; @@ -53,7 +54,7 @@ class _SplashPageState extends State { Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); if (_settingProvider.isLoaded && (_settingProvider.user?.isLiveToken ?? false)) { _userProvider.user = _settingProvider.user; - Navigator.of(context).pushNamedAndRemoveUntil(old.LandPage.id, (routes) => true); + Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); /// The below line for the new design // Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index d56630af..d4554222 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -9,8 +9,8 @@ import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; +import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/land_page.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; @@ -117,7 +117,7 @@ class _LoginState extends State { if (status >= 200 && status < 300) { if (_userProvider.user.isAuthenticated ?? false) { _settingProvider.setUser(_userProvider.user); - Navigator.of(context).pushNamed(LandPage.id); + Navigator.of(context).pushNamed(LandPage.routeName); } else { Fluttertoast.showToast(msg: _userProvider.user.message); } @@ -129,8 +129,9 @@ class _LoginState extends State { } else { if (status >= 400 && status < 500) return; - String errorMessage = - status == 400 || _userProvider.user?.userName == null ? context.translation.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation); + String errorMessage = status == 400 || _userProvider.user?.userName == null + ? context.translation.wrongEmailOrPassword + : HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), )); diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index e28c09de..903d613c 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -9,7 +9,8 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/user.dart'; -import 'package:test_sa/views/pages/user/land_page.dart'; +import 'package:test_sa/new_views/pages/land_page/land_page.dart'; + import 'login.dart'; @@ -29,7 +30,7 @@ class _SplashScreenState extends State { if (user.tokenlife != null && (DateTime.tryParse(user.tokenlife)?.isAfter(DateTime.now()) ?? false)) { _userProvider.user = user; // Navigator.of(context).pushNamed(Login.id); - Navigator.of(context).pushNamed(LandPage.id); + Navigator.of(context).pushNamed(LandPage.routeName); } } diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index fe73ab78..ccde1c9a 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -7,6 +7,7 @@ import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart'; import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; import 'package:test_sa/views/widgets/status/service_request/supplier_engineers_menu.dart'; diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 52508512..c40d87e0 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -22,7 +22,7 @@ import '../qr/scan_qr.dart'; class SingleDevicePicker extends StatefulWidget { static final String id = "/single-device-Picker"; - final bool sandraChoice = true; + const SingleDevicePicker({Key key}) : super(key: key); @override _SingleDevicePickerState createState() => _SingleDevicePickerState();