How Settings of SUSI Android App Are Saved on Server
The SUSI Android allows users to specify whether they want to use the action button of soft keyboard as carriage return or else send action. The user can use SUSI.AI on different client like Android , iOS, Web. To give user uniform experience, we need to save user settings on the server so that if the user makes any change in setting in any chat client then that it changes in other chat clients too. So every chat client must store user specific data on the server to make sure that all chat clients access this data and maintain the same state for that particular user and must accordingly push and pull user data from and to the server to update the state of the app.
We used special key to store setting information on server. For eg.
Setting | Key | Value | Use |
Enter As Send | enter_send | true/false | true means pressing enter key send message and false means pressing enter key adds new line. |
Mic Input | mic_input | true/false | true means default input method is speech but supports keyboard input too. false means the only input method is keyboard input. |
Speech Always | speech_always | true/false | true means we get speech output irrespective of input type. |
Speech Output | speech_output | true/false | true means we get speech output in case of speech input and false means we don’t get speech output. |
Theme | theme | dark/light | dark means theme is dark and light means theme is light |
How setting is stored to server
Whenever user settings are changed, the client updates the changed settings on the server so that the state is maintained across all chat clients. When user change setting, we send three parameters to the server ‘key’, ‘value’ and ‘token’. For eg. let ‘Enter As Send’ is set to false. When user changes it from false to true, we immediately update it on the server. Here key will be ‘enter_send’ and value will be ‘true’.
The endpoint used to add or update User Settings is :
BASE_URL+’/aaa/changeUserSettings.json?key=SETTING_NAME&value=SETTING_VALUE&access_token=ACCESS_TOKEN’ |
‘SETTING_NAME’ is the key of the corresponding setting, ‘SETTING_VALUE’ is it’s updated value and ‘ACCESS_TOKEN’ is used to find correct user account. We used the retrofit library for network call.
settingResponseCall = ClientBuilder().susiApi .changeSettingResponse(key, value, PrefManager.getToken()) |
If the user successfully updated the setting on the server then server reply with message ‘You successfully changed settings of your account!’
How setting is retrieved from server
We retrieve setting from the server when user login. The endpoint used to fetch User Settings is
BASE_URL+’/aaa/listUserSettings.json?access_token=ACCESS_TOKEN’ |
It requires “ACCESS_TOKEN” to retrieve setting data for a particular user. When user login, we use getUserSetting method to retrieve setting data from the server. PrefManager.getToken() is used to get “ACCESS_TOKEN”.
userSettingResponseCall = ClientBuilder().susiApi .getUserSetting(PrefManager.getToken()) |
We use userSettingResponseCall to get a response of ‘UserSetting’ type using which we can retrieve different setting from the server. ‘UserSetting’ contain ‘Session’ and ‘Settings’ and ‘Settings’ contain the value of all settings. We save the value of all settings on the server in string format, so after retrieving settings we convert them into the required format. For eg. ‘Enter As Send’ value is of boolean format, so after retrieving we convert it to boolean format.
var settings: Settings ?= response.body().settings
utilModel.setEnterSend((settings?.enterSend.toString()).toBoolean()) |
Reference
- Github link of SUSI Server: https://github.com/fossasia/susi_server
- Retrofit library link: http://square.github.io/retrofit/
- Blog on retrofit for beginner: https://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/