From 4be5a1b5a8934f3833ea47e314d0944308027ffa Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 24 Apr 2019 15:03:36 +0200 Subject: [PATCH] Show cached conversations list before getting list from the server --- lib/helpers/conversations_helper.dart | 7 +++ .../conversations_database_helper.dart | 9 +++ .../database/model_database_helper.dart | 10 ++- lib/models/conversation.dart | 7 ++- lib/ui/screens/conversations_screen.dart | 62 +++++++++++++++---- 5 files changed, 79 insertions(+), 16 deletions(-) diff --git a/lib/helpers/conversations_helper.dart b/lib/helpers/conversations_helper.dart index 3757997..a2c88e5 100644 --- a/lib/helpers/conversations_helper.dart +++ b/lib/helpers/conversations_helper.dart @@ -43,6 +43,13 @@ class ConversationsHelper { } } + /// Get the local list of conversations + Future getCachedList() async { + final list = await _conversationsDatabaseHelper.getAll(); + list.sort(); + return list; + } + /// Get the name of a [conversation]. This requires information about the /// users of this conversation static String getConversationName( diff --git a/lib/helpers/database/conversations_database_helper.dart b/lib/helpers/database/conversations_database_helper.dart index 84b51ea..29e146e 100644 --- a/lib/helpers/database/conversations_database_helper.dart +++ b/lib/helpers/database/conversations_database_helper.dart @@ -1,5 +1,6 @@ import 'package:comunic/helpers/database/database_contract.dart'; import 'package:comunic/helpers/database/model_database_helper.dart'; +import 'package:comunic/lists/conversations_list.dart'; import 'package:comunic/models/conversation.dart'; /// Conversations database helper @@ -17,4 +18,12 @@ class ConversationsDatabaseHelper extends ModelDatabaseHelper { return ConversationTableContract.TABLE_NAME; } + @override + Future getAll() async { + ConversationsList list = ConversationsList(); + list.addAll(await super.getAll()); + return list; + } + + } \ No newline at end of file diff --git a/lib/helpers/database/model_database_helper.dart b/lib/helpers/database/model_database_helper.dart index 1410bdd..d3ac1ef 100644 --- a/lib/helpers/database/model_database_helper.dart +++ b/lib/helpers/database/model_database_helper.dart @@ -36,8 +36,8 @@ abstract class ModelDatabaseHelper { /// Returns null if none found Future get(int id) async { List maps = await (await DatabaseHelper.get()).query( - UserTableContract.TABLE_NAME, - where: '${UserTableContract.C_ID} = ?', + tableName(), + where: '${BaseTableContract.C_ID} = ?', whereArgs: [id], ); @@ -46,6 +46,12 @@ abstract class ModelDatabaseHelper { return null; } + /// Get all the entries from the table + Future> getAll() async { + List maps = await(await DatabaseHelper.get()).query(tableName()); + return maps.map((f) => initializeFromMap(f)).toList(); + } + /// Empty the table Future clearTable() async { await (await DatabaseHelper.get()).execute("DELETE FROM ${tableName()}"); diff --git a/lib/models/conversation.dart b/lib/models/conversation.dart index a8caa2a..f9047ed 100644 --- a/lib/models/conversation.dart +++ b/lib/models/conversation.dart @@ -7,7 +7,7 @@ import 'package:meta/meta.dart'; /// /// @author Pierre HUBERT -class Conversation extends CacheModel { +class Conversation extends CacheModel implements Comparable { final int ownerID; final int lastActive; final String name; @@ -56,4 +56,9 @@ class Conversation extends CacheModel { ConversationTableContract.C_MEMBERS: members.join(","), }; } + + @override + int compareTo(other) { + return other.lastActive.compareTo(this.lastActive); + } } diff --git a/lib/ui/screens/conversations_screen.dart b/lib/ui/screens/conversations_screen.dart index dc031a7..1207e5d 100644 --- a/lib/ui/screens/conversations_screen.dart +++ b/lib/ui/screens/conversations_screen.dart @@ -33,23 +33,34 @@ class _ConversationScreenState extends State { void setLoading(bool loading) => setState(() => _loading = loading); + /// Get the list of conversations, once from the cache, once from the server + Future _loadConversations() async { + await _loadConversationsList(true); + await _loadConversationsList(false); + } + void _gotLoadingError() { setLoading(false); setError(_list == null ? LoadErrorLevel.MAJOR : LoadErrorLevel.MINOR); } /// Load the list of conversations - Future _loadConversations() async { + Future _loadConversationsList(bool cached) async { setError(LoadErrorLevel.NONE); setLoading(true); - //Process the list of conversations - final list = await _conversationsHelper.downloadList(); + //Get the list of conversations + var list; + if(cached) + list = await _conversationsHelper.getCachedList(); + else + list = await _conversationsHelper.downloadList(); + if (list == null) return _gotLoadingError(); //Get information about the members of the conversations list.users = await _usersHelper.getUsersInfo(list.allUsersID); - if(list.users == null) return _gotLoadingError(); + if (list.users == null) return _gotLoadingError(); //Save list setState(() { @@ -65,7 +76,7 @@ class _ConversationScreenState extends State { tr("Could not retrieve the list of conversations!"), actions: [ FlatButton( - onPressed: _loadConversations, + onPressed: () => _loadConversationsList(true), child: Text( tr("Retry").toUpperCase(), style: TextStyle( @@ -83,14 +94,39 @@ class _ConversationScreenState extends State { if (_list == null) return buildCenteredProgressBar(); // Show the list of conversations - return ListView.builder( - itemBuilder: (context, index) { - return ConversationTile( - conversation: _list.elementAt(index), - usersList: _list.users, - ); - }, - itemCount: _list.length, + return Stack( + children: [ + Column( + children: [ + Container( + child: _error == LoadErrorLevel.MINOR ? _buildErrorCard() : null, + ), + Expanded( + child: ListView.builder( + itemBuilder: (context, index) { + return ConversationTile( + conversation: _list.elementAt(index), + usersList: _list.users, + ); + }, + itemCount: _list.length, + ), + ), + ], + ), + Positioned( + top: 8.0, + left: 0.0, + right: 0.0, + child: Container( + child: !_loading + ? null + : Center( + child: CircularProgressIndicator(), + ), + ), + ) + ], ); } }