From d8e92a7cacd0a1718d4aea4719bd5dd301965415 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 6 Dec 2021 14:37:13 +0430 Subject: [PATCH] Pull detection in dialog bottom sheet finished --- .idea/libraries/Flutter_Plugins.xml | 4 +- .idea/workspace.xml | 37 +- assets/images/bookmark_add.png | Bin 14251 -> 0 bytes assets/images/bookmark_remove.png | Bin 13927 -> 0 bytes assets/images/remove.png | Bin 0 -> 3096 bytes lib/MyManagement/HistoryStorage.dart | 2 +- lib/in_app_browser.dart | 660 +++++++++++++++------------ pubspec.yaml | 2 +- 8 files changed, 385 insertions(+), 320 deletions(-) delete mode 100644 assets/images/bookmark_add.png delete mode 100644 assets/images/bookmark_remove.png create mode 100644 assets/images/remove.png diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml index c744bff..1a88ab7 100644 --- a/.idea/libraries/Flutter_Plugins.xml +++ b/.idea/libraries/Flutter_Plugins.xml @@ -1,12 +1,12 @@ - - + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2941aef..d1e277e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,15 +2,13 @@ - - + - - - + + + - - - - + + + + @@ -65,36 +64,36 @@ - + - - + + - - + + - - + + - + - + - + diff --git a/assets/images/bookmark_add.png b/assets/images/bookmark_add.png deleted file mode 100644 index 3778b9b14dea2a8fe6270876e14bd32474318473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14251 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 diff --git a/assets/images/bookmark_remove.png b/assets/images/bookmark_remove.png deleted file mode 100644 index b599b2f32e257f166ce1ea9f067889eea78352ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13927 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 gc&wGf|AGxNPrpciU0SA37{PWxli5i(5_wV!Z literal 0 HcmV?d00001 diff --git a/lib/MyManagement/HistoryStorage.dart b/lib/MyManagement/HistoryStorage.dart index 36dadae..4529cdd 100644 --- a/lib/MyManagement/HistoryStorage.dart +++ b/lib/MyManagement/HistoryStorage.dart @@ -10,7 +10,7 @@ final String _tableName = 'main_value'; final String columnId = '_id'; final String columnTitle = 'title'; -final String columnUrl = "url"; +final String columnUrl = "webUrl"; final String columnTime = "time"; class HistoryItem { diff --git a/lib/in_app_browser.dart b/lib/in_app_browser.dart index 41d936e..1856fbd 100644 --- a/lib/in_app_browser.dart +++ b/lib/in_app_browser.dart @@ -53,7 +53,7 @@ class InAppBrowser extends StatefulWidget { final String historyTitle; final double appbarTxtSize; final FontWeight appbarFontWeight; - final double historyDialogSize; + double historyDialogSize; InAppBrowser( this.mUrl, { @@ -84,7 +84,7 @@ class InAppBrowser extends StatefulWidget { this.historyCloseIconColor = Colors.white, this.appbarTxtSize = 15, this.appbarFontWeight = FontWeight.bold, - this.historyDialogSize = 100, + this.historyDialogSize = 200, }) : super(key: key); @override @@ -100,6 +100,8 @@ class _InAppBrowserState extends State List> _myList = []; bool isLoading = true; bool showDialog = false; + bool isDialogFull = false; + double tempHistoryDialogSize = 0; static Widget iconInkWell({Function func, IconData mIcon, Color iconColor}) { return InkWell( @@ -113,6 +115,8 @@ class _InAppBrowserState extends State // TODO: implement initState super.initState(); + tempHistoryDialogSize = widget.historyDialogSize; + flutterWebViewPlugin.onUrlChanged.forEach((element) { widget.mUrl = element; setState(() {}); @@ -136,327 +140,389 @@ class _InAppBrowserState extends State }); } + void mDispose() { + if (showDialog) { + showDialog = false; + isDialogFull = false; + widget.historyDialogSize = tempHistoryDialogSize; + setState(() {}); + } else { + flutterWebViewPlugin.dispose(); + flutterWebViewPlugin.hide(); + + Future.delayed(Duration(microseconds: 10), () { + Navigator.pop(context); + }); + } + } + @override Widget build(BuildContext context) { return isLoading ? SizedBox.shrink() - : Directionality( - textDirection: widget.mDirection, - child: WebviewScaffold( - appBar: AppBar( - backgroundColor: widget.appBarColor, - title: Text( - widget.showAppName ? widget.appName : widget.mUrl, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontWeight: widget.appbarFontWeight, - fontSize: widget.appbarTxtSize, - ), - ), - leading: widget.closeIcon == null - ? SizedBox.shrink() - : InkWell( - child: Icon( - widget.closeIcon, - color: widget.closeIconColor, + : WillPopScope( + onWillPop: () { + mDispose(); + }, + child: Directionality( + textDirection: widget.mDirection, + child: WebviewScaffold( + appBar: isDialogFull + ? null + : AppBar( + backgroundColor: widget.appBarColor, + title: Text( + widget.showAppName ? widget.appName : widget.mUrl, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: widget.appbarFontWeight, + fontSize: widget.appbarTxtSize, + ), ), - onTap: () { - Navigator.pop(context); - }, - ), - actions: [ - (widget.addBookmarkIcon == null || - widget.removeBookmarkIcon == null) - ? SizedBox.shrink() - : InkWell( - child: _myList - .where((element) => - element['url'] == widget.mUrl) - .isNotEmpty - ? Icon( - widget.removeBookmarkIcon, - color: widget.removeBookmarkIconColor, - ) - : Icon( - widget.addBookmarkIcon, - color: widget.addBookmarkIconColor, + leading: widget.closeIcon == null + ? SizedBox.shrink() + : InkWell( + child: Icon( + widget.closeIcon, + color: widget.closeIconColor, ), - onTap: () async { - await _storeProvider - .checkValue(widget.mUrl) - .then((value) async { - if (value == null) { - String html = - await flutterWebViewPlugin.evalJavascript( - "window.document.getElementsByTagName('html')[0].outerHTML;"); - - String title = ""; - if (html.contains("u003Ctitle>") && - html.contains("u003Ctitle>")) - title = html.substring( - html.indexOf("u003Ctitle>") + 11, - html.indexOf("u003C/title>")); - else - title = "Your Url"; - - HistoryItem historyItem = HistoryItem(); - - historyItem.title = title; - historyItem.url = widget.mUrl; - historyItem.time = - DateTime.now().millisecondsSinceEpoch; - - _storeProvider.insert(historyItem); - - _myList.add({ - "_id": historyItem.time, - "title": title, - "url": widget.mUrl, - "time": historyItem.time, - }); - } else { - _storeProvider.delete(value.id); - - _myList.removeWhere( - (element) => element["url"] == value.url, - ); - } - setState(() {}); - }); - }, - ), - SizedBox(width: 10), - ], - ), - url: widget.mUrl, - withJavascript: true, - bottomNavigationBar: showDialog - ? Container( - height: widget.historyDialogSize, - decoration: BoxDecoration( - color: widget.bottomNavColor, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(10), - topRight: Radius.circular(10), - ), + onTap: mDispose, + ), + actions: [ + (widget.addBookmarkIcon == null || + widget.removeBookmarkIcon == null) + ? SizedBox.shrink() + : InkWell( + child: _myList + .where((element) => + element['url'] == widget.mUrl) + .isNotEmpty + ? Icon( + widget.removeBookmarkIcon, + color: widget.removeBookmarkIconColor, + ) + : Icon( + widget.addBookmarkIcon, + color: widget.addBookmarkIconColor, + ), + onTap: () async { + await _storeProvider + .checkValue(widget.mUrl) + .then((value) async { + if (value == null) { + String html = await flutterWebViewPlugin + .evalJavascript( + "window.document.getElementsByTagName('html')[0].outerHTML;"); + + String title = ""; + if (html.contains("u003Ctitle>") && + html.contains("u003Ctitle>")) + title = html.substring( + html.indexOf("u003Ctitle>") + 11, + html.indexOf("u003C/title>")); + else + title = "Your Url"; + + HistoryItem historyItem = HistoryItem(); + + historyItem.title = title; + historyItem.url = widget.mUrl; + historyItem.time = DateTime.now() + .millisecondsSinceEpoch; + + _storeProvider.insert(historyItem); + + _myList.add({ + "_id": historyItem.time, + "title": title, + "url": widget.mUrl, + "time": historyItem.time, + }); + } else { + _storeProvider.delete(value.id); + + _myList.removeWhere( + (element) => + element["url"] == value.url, + ); + } + setState(() {}); + }); + }, + ), + SizedBox(width: 10), + ], ), - padding: EdgeInsets.symmetric(horizontal: 5), - child: Column( - children: [ - Icon( - Icons.remove, - color: Colors.grey, - size: 30, + url: widget.mUrl, + withLocalStorage: true, + withJavascript: true, + bottomNavigationBar: showDialog + ? Container( + height: widget.historyDialogSize, + decoration: BoxDecoration( + color: widget.bottomNavColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(isDialogFull ? 0 : 10), + topRight: Radius.circular(isDialogFull ? 0 : 10), ), - Padding( - padding: const EdgeInsets.only( - bottom: 8.0, - top: 10, + ), + padding: EdgeInsets.symmetric(horizontal: 5), + child: Column( + children: [ + // Icon( + // Icons.remove, + // color: Colors.grey, + // size: 40, + // ), + GestureDetector( + onPanUpdate: (details) { + print("Mahdi: y ${details.delta.dy}"); + print("Mahdi: x ${details.delta.dx}"); + + double appbarSize = + MediaQuery.of(context).size.height; + + if (details.delta.dy < -3 && + widget.historyDialogSize != appbarSize) { + widget.historyDialogSize = appbarSize; + isDialogFull = true; + setState(() {}); + } else if (details.delta.dy > 3 && showDialog) { + showDialog = false; + isDialogFull = false; + widget.historyDialogSize = + tempHistoryDialogSize; + + setState(() {}); + } + }, + child: Text( + "━━", + style: + TextStyle(fontSize: 20, color: Colors.grey), + ), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.only( - left: MediaQuery.of(context).size.width * - 0.02, - ), - child: InkWell( - child: Text( - "پاک کردن", - style: TextStyle( - fontSize: 15, - color: Colors.white, + Padding( + padding: const EdgeInsets.only( + bottom: 8.0, + top: 8.0, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.only( + left: MediaQuery.of(context).size.width * + 0.02, + ), + child: InkWell( + child: Text( + "پاک کردن", + style: TextStyle( + fontSize: 15, + color: Colors.white, + ), ), + onTap: () { + _myList.clear(); + _storeProvider.deleteAll(); + setState(() {}); + }, ), - onTap: () { - _myList.clear(); - _storeProvider.deleteAll(); - setState(() {}); - }, ), - ), - Text( - widget.historyTitle, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 17, - color: Colors.white, + Text( + widget.historyTitle, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 17, + color: Colors.white, + ), ), - ), - widget.historyCloseIconColor == null - ? SizedBox.shrink() - : Padding( - padding: EdgeInsets.only( - right: MediaQuery.of(context) - .size - .width * - 0.02, - ), - child: InkWell( - child: Icon( - widget.historyCloseIcon, - color: widget.historyCloseIconColor, + widget.historyCloseIconColor == null + ? SizedBox.shrink() + : Padding( + padding: EdgeInsets.only( + right: MediaQuery.of(context) + .size + .width * + 0.02, + ), + child: InkWell( + child: Icon( + widget.historyCloseIcon, + color: + widget.historyCloseIconColor, + ), + onTap: () { + showDialog = false; + isDialogFull = false; + widget.historyDialogSize = + tempHistoryDialogSize; + + setState(() {}); + }, ), - onTap: () { - showDialog = false; - setState(() {}); - }, ), - ), - ], + ], + ), ), - ), - Divider(color: Colors.white), - Expanded( - child: ListView.builder( - itemCount: _myList.length, - itemBuilder: (ctx, index) { - int dayDB = DateTime.fromMillisecondsSinceEpoch( - _myList[index]["time"]) - .day; - int monthDB = - DateTime.fromMillisecondsSinceEpoch( - _myList[index]["time"]) - .month; - return Row( - children: [ - SizedBox( - height: - MediaQuery.of(context).size.width * - 0.15, - width: MediaQuery.of(context).size.width * - 0.15, - child: Icon( - Icons.link_outlined, - color: Colors.white, + Divider(color: Colors.white), + Expanded( + child: ListView.builder( + itemCount: _myList.length, + itemBuilder: (ctx, index) { + int dayDB = + DateTime.fromMillisecondsSinceEpoch( + _myList[index]["time"]) + .day; + int monthDB = + DateTime.fromMillisecondsSinceEpoch( + _myList[index]["time"]) + .month; + return Row( + children: [ + SizedBox( + height: + MediaQuery.of(context).size.width * + 0.15, + width: + MediaQuery.of(context).size.width * + 0.15, + child: Icon( + Icons.link_outlined, + color: Colors.white, + ), ), - ), - SizedBox( - width: MediaQuery.of(context).size.width * - 0.01, - ), - Column( - children: [ - SizedBox( - width: MediaQuery.of(context) - .size - .width * - 0.8, - child: Text( - "${_myList[index]["title"]}", - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + SizedBox( + width: + MediaQuery.of(context).size.width * + 0.01, + ), + Column( + children: [ + SizedBox( + width: MediaQuery.of(context) + .size + .width * + 0.8, + child: Text( + "${_myList[index]["title"]}", + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), ), ), - ), - SizedBox( - height: MediaQuery.of(context) - .size - .height * - 0.01, - ), - SizedBox( - width: MediaQuery.of(context) - .size - .width * - 0.8, - child: Text( - "${_myList[index]["url"]}", - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Colors.grey, + SizedBox( + height: MediaQuery.of(context) + .size + .height * + 0.01, + ), + SizedBox( + width: MediaQuery.of(context) + .size + .width * + 0.8, + child: Text( + "${_myList[index]["url"]}", + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.grey, + ), ), ), - ), - SizedBox( - height: MediaQuery.of(context) - .size - .height * - 0.01, - ), - SizedBox( - width: MediaQuery.of(context) - .size - .width * - 0.8, - child: Text( - "${months[monthDB - 1]} $dayDB", - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Colors.grey, + SizedBox( + height: MediaQuery.of(context) + .size + .height * + 0.01, + ), + SizedBox( + width: MediaQuery.of(context) + .size + .width * + 0.8, + child: Text( + "${months[monthDB - 1]} $dayDB", + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.grey, + ), ), ), - ), - ], - ), - ], - ); - }, - ), - ) - ], - ), - ) - : SizedBox( - height: 56, - child: Card( - color: widget.bottomNavColor, - margin: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(0), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - iconInkWell( - func: () { - flutterWebViewPlugin.canGoBack().then((value) { - if (value) flutterWebViewPlugin.goBack(); - }); - }, - mIcon: widget.backIcon, - iconColor: widget.backIconColor, - ), - iconInkWell( - func: () { - flutterWebViewPlugin - .canGoForward() - .then((value) { - if (value) flutterWebViewPlugin.goForward(); - }); - }, - mIcon: widget.nextIcon, - iconColor: widget.nextIconColor, - ), - iconInkWell( - func: () { - Share.share(widget.mUrl); - }, - mIcon: widget.shareIcon, - iconColor: widget.shareIconColor, - ), - iconInkWell( - mIcon: widget.historyIcon, - iconColor: widget.historyIconColor, - func: () { - showDialog = true; - setState(() {}); - }, - ), - iconInkWell( - mIcon: widget.refreshIcon, - iconColor: widget.refreshIconColor, - func: () { - flutterWebViewPlugin.reload(); - }, - ), + ], + ), + ], + ); + }, + ), + ) ], ), + ) + : SizedBox( + height: 56, + child: Card( + color: widget.bottomNavColor, + margin: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(0), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + iconInkWell( + func: () { + flutterWebViewPlugin + .canGoBack() + .then((value) { + if (value) flutterWebViewPlugin.goBack(); + }); + }, + mIcon: widget.backIcon, + iconColor: widget.backIconColor, + ), + iconInkWell( + func: () { + flutterWebViewPlugin + .canGoForward() + .then((value) { + if (value) flutterWebViewPlugin.goForward(); + }); + }, + mIcon: widget.nextIcon, + iconColor: widget.nextIconColor, + ), + iconInkWell( + func: () { + Share.share(widget.mUrl); + }, + mIcon: widget.shareIcon, + iconColor: widget.shareIconColor, + ), + iconInkWell( + mIcon: widget.historyIcon, + iconColor: widget.historyIconColor, + func: () { + showDialog = true; + setState(() {}); + }, + ), + iconInkWell( + mIcon: widget.refreshIcon, + iconColor: widget.refreshIconColor, + func: () { + flutterWebViewPlugin.reload(); + }, + ), + ], + ), + ), ), - ), + ), ), ); } diff --git a/pubspec.yaml b/pubspec.yaml index a7b2211..2fc0446 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,7 +39,7 @@ flutter: # To add assets to your plugin package, add an assets section, like this: assets: - - assets/images/ + - assets/images/remove.png # - images/a_dot_ham.jpeg # # For details regarding assets in packages, see