From ad6203c27b3a6ba7f5a33d04ce176bdf441ec0ab Mon Sep 17 00:00:00 2001 From: liqing Date: Thu, 16 May 2013 16:19:53 +0800 Subject: [PATCH 1/6] add sync single record for unverified account --- RapidFTR-Android/res/menu/child_menu.xml | 5 +- .../rapidftr/activity/RapidFtrActivity.java | 58 +++++++++++-------- .../rapidftr/activity/ViewChildActivity.java | 46 +++++++++++++-- .../com/rapidftr/service/ChildService.java | 13 ++--- .../task/SyncUnverifiedDataAsyncTask.java | 1 - .../activity/ViewChildActivityTest.java | 14 +++++ 6 files changed, 96 insertions(+), 41 deletions(-) diff --git a/RapidFTR-Android/res/menu/child_menu.xml b/RapidFTR-Android/res/menu/child_menu.xml index fefa2309..9001e2aa 100644 --- a/RapidFTR-Android/res/menu/child_menu.xml +++ b/RapidFTR-Android/res/menu/child_menu.xml @@ -1,11 +1,10 @@ - + android:title="@string/synchronize_child"/> + android:title="@string/log_out"/> diff --git a/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java b/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java index 0ef75e6b..7a42ca28 100644 --- a/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java +++ b/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java @@ -22,6 +22,7 @@ import com.rapidftr.RapidFtrApplication; import com.rapidftr.model.User; import com.rapidftr.service.LogOutService; +import com.rapidftr.task.SyncUnverifiedDataAsyncTask; import com.rapidftr.task.SynchronisationAsyncTask; import lombok.Getter; import lombok.Setter; @@ -33,17 +34,20 @@ public abstract class RapidFtrActivity extends FragmentActivity { - public static final String LOGOUT_INTENT_FILTER = "com.rapidftr.LOGOUT_INTENT"; + public static final String LOGOUT_INTENT_FILTER = "com.rapidftr.LOGOUT_INTENT"; - protected @Getter @Setter Menu menu; + protected + @Getter + @Setter + Menu menu; private BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if(!((NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO)).isConnected() && getContext().cleanSyncTask()){ - makeToast(R.string.network_down); - } + @Override + public void onReceive(Context context, Intent intent) { + if (!((NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO)).isConnected() && getContext().cleanSyncTask()) { + makeToast(R.string.network_down); } + } }; private BroadcastReceiver logoutReceiver = new BroadcastReceiver() { @@ -186,11 +190,15 @@ public boolean onOptionsItemSelected(MenuItem item) { } protected void synchronise() { - if(!this.getContext().isOnline()){ + if (!this.getContext().isOnline()) { makeToast(R.string.connection_off); - } - else{ - SynchronisationAsyncTask task = inject(SynchronisationAsyncTask.class); + } else { + SynchronisationAsyncTask task; + if (getCurrentUser().isVerified()) { + task = inject(SynchronisationAsyncTask.class); + } else { + task = inject(SyncUnverifiedDataAsyncTask.class); + } this.getContext().setSyncTask(task); task.setContext(this); task.execute(); @@ -206,17 +214,17 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); initializeExceptionHandler(); - initializeLogoutHandler(); + initializeLogoutHandler(); } - protected void initializeLogoutHandler() { - if (shouldEnsureLoggedIn()) { - IntentFilter intentFilter = new IntentFilter(LOGOUT_INTENT_FILTER); - registerReceiver(logoutReceiver, intentFilter); - } - } + protected void initializeLogoutHandler() { + if (shouldEnsureLoggedIn()) { + IntentFilter intentFilter = new IntentFilter(LOGOUT_INTENT_FILTER); + registerReceiver(logoutReceiver, intentFilter); + } + } - protected boolean shouldEnsureLoggedIn() { + protected boolean shouldEnsureLoggedIn() { return true; } @@ -229,12 +237,12 @@ protected void onResume() { } @Override - protected void onStop(){ + protected void onStop() { super.onStop(); - try{ + try { unregisterReceiver(networkChangeReceiver); unregisterReceiver(logoutReceiver); - }catch(IllegalArgumentException e){ + } catch (IllegalArgumentException e) { logError(e.getMessage()); } } @@ -344,7 +352,7 @@ public void onClick(DialogInterface dialog, int selectedItem) { public void getServerAndSync() { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Enter sync location"); - alert.setMessage("Please enter the the location you wish to synchronise with"); + alert.setMessage("Please enter the location you wish to synchronise with"); final EditText input = new EditText(this); alert.setView(input); @@ -362,8 +370,8 @@ public void onClick(DialogInterface dialog, int whichButton) { }); alert.create().show(); } - - protected BroadcastReceiver getBroadcastReceiver(){ + + protected BroadcastReceiver getBroadcastReceiver() { return networkChangeReceiver; } } diff --git a/RapidFTR-Android/src/main/java/com/rapidftr/activity/ViewChildActivity.java b/RapidFTR-Android/src/main/java/com/rapidftr/activity/ViewChildActivity.java index a58533a0..96f866d3 100644 --- a/RapidFTR-Android/src/main/java/com/rapidftr/activity/ViewChildActivity.java +++ b/RapidFTR-Android/src/main/java/com/rapidftr/activity/ViewChildActivity.java @@ -1,10 +1,13 @@ package com.rapidftr.activity; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.EditText; import android.widget.Toast; import com.rapidftr.R; import com.rapidftr.RapidFtrApplication; @@ -13,6 +16,9 @@ import com.rapidftr.task.SyncChildTask; import org.json.JSONException; +import static com.google.common.base.Strings.isNullOrEmpty; +import static com.rapidftr.RapidFtrApplication.SERVER_URL_PREF; + public class ViewChildActivity extends BaseChildActivity { @@ -50,9 +56,13 @@ protected void initializeData(Bundle savedInstanceState) throws JSONException { } protected void sync() { - SyncChildTask task = inject(SyncChildTask.class); - task.setActivity(this); - RapidFtrApplication.getApplicationInstance().setAsyncTaskWithDialog((AsyncTaskWithDialog) AsyncTaskWithDialog.wrap(this, task, R.string.sync_progress, R.string.sync_success, R.string.sync_failure).execute(child)); + if (!this.getContext().isOnline()) { + makeToast(R.string.connection_off); + } else { + SyncChildTask task = inject(SyncChildTask.class); + task.setActivity(this); + RapidFtrApplication.getApplicationInstance().setAsyncTaskWithDialog((AsyncTaskWithDialog) AsyncTaskWithDialog.wrap(this, task, R.string.sync_progress, R.string.sync_success, R.string.sync_error).execute(child)); + } } @Override @@ -63,7 +73,6 @@ public boolean onCreateOptionsMenu(Menu menu) { menu.findItem(R.id.synchronize_log).setVisible(true); } if (!getCurrentUser().isVerified()) { - menu.findItem(R.id.synchronize_child).setVisible(false); menu.getItem(4).setVisible(false); } } catch (JSONException e) { @@ -79,7 +88,11 @@ public boolean onOptionsItemSelected(MenuItem item) { startActivity(new Intent(this, ChangePasswordActivity.class)); return true; case R.id.synchronize_child: - sync(); + if (isNullOrEmpty(getCurrentUser().getServerUrl())) { + getServerAndSync(); + } else { + sync(); + } return true; case R.id.synchronize_log: showSyncLog(); @@ -94,6 +107,29 @@ public boolean onOptionsItemSelected(MenuItem item) { return false; } + public void getServerAndSync() { + AlertDialog.Builder alert = new AlertDialog.Builder(this); + alert.setTitle("Enter sync location"); + alert.setMessage("Please enter the location you wish to synchronise with"); + final EditText input = new EditText(this); + alert.setView(input); + + alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + getContext().getSharedPreferences().edit().putString(SERVER_URL_PREF, input.getText().toString()).commit(); + getCurrentUser().setServerUrl(input.getText().toString()); + sync(); + } + }); + alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + finish(); + startActivity(new Intent(getContext(), ViewAllChildrenActivity.class)); + } + }); + alert.create().show(); + } + protected void showSyncLog() { Toast.makeText(this, getText(R.string.temp_sync_error), Toast.LENGTH_LONG).show(); } diff --git a/RapidFTR-Android/src/main/java/com/rapidftr/service/ChildService.java b/RapidFTR-Android/src/main/java/com/rapidftr/service/ChildService.java index c1c58be9..8b4672fc 100644 --- a/RapidFTR-Android/src/main/java/com/rapidftr/service/ChildService.java +++ b/RapidFTR-Android/src/main/java/com/rapidftr/service/ChildService.java @@ -100,9 +100,9 @@ private void setChildAttributes(Child child) throws JSONException { private void addMultiMediaFilesToTheRequest(Child child) throws JSONException { JSONArray photoKeys = child.optJSONArray(PHOTO_KEYS); JSONArray photoKeysToAdd = new JSONArray(); - if(photoKeys != null){ - for(int i = 0; i< photoKeys.length(); i++){ - if(!photoKeys.optString(i).startsWith("photo-")){ + if (photoKeys != null) { + for (int i = 0; i < photoKeys.length(); i++) { + if (!photoKeys.optString(i).startsWith("photo-")) { photoKeysToAdd.put(photoKeys.optString(i)); } } @@ -141,21 +141,20 @@ public void setPhoto(Child child) throws IOException, JSONException { PhotoCaptureHelper photoCaptureHelper = new PhotoCaptureHelper(context); JSONArray photoKeys = child.optJSONArray("photo_keys"); - if(photoKeys != null){ + if (photoKeys != null) { getPhotoFromServerIfNeeded(child, photoCaptureHelper, photoKeys); } } private void getPhotoFromServerIfNeeded(Child child, PhotoCaptureHelper photoCaptureHelper, JSONArray photoKeys) throws JSONException, IOException { - for(int i = 0; i < photoKeys.length(); i++){ + for (int i = 0; i < photoKeys.length(); i++) { String photoKey = photoKeys.get(i).toString(); try { if (!photoKey.equals("")) { photoCaptureHelper.getFile(photoKey, ".jpg"); } - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { getPhotoFromServer(child, photoCaptureHelper, photoKey); } } diff --git a/RapidFTR-Android/src/main/java/com/rapidftr/task/SyncUnverifiedDataAsyncTask.java b/RapidFTR-Android/src/main/java/com/rapidftr/task/SyncUnverifiedDataAsyncTask.java index 3f4a77d4..63b40dfc 100644 --- a/RapidFTR-Android/src/main/java/com/rapidftr/task/SyncUnverifiedDataAsyncTask.java +++ b/RapidFTR-Android/src/main/java/com/rapidftr/task/SyncUnverifiedDataAsyncTask.java @@ -56,7 +56,6 @@ protected void sync() throws JSONException, IOException, HttpException { RapidFtrApplication application = RapidFtrApplication.getApplicationInstance(); if(response != null && response.optBoolean("verified") && !application.getCurrentUser().isVerified()){ startMigrationTask(response, application); - } getFormSections(); sendChildrenToServer(childRepository.currentUsersUnsyncedRecords()); diff --git a/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java b/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java index 0772bc83..cc173e77 100644 --- a/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java +++ b/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java @@ -4,6 +4,7 @@ import android.view.MenuItem; import com.rapidftr.CustomTestRunner; import com.rapidftr.R; +import com.rapidftr.RapidFtrApplication; import com.rapidftr.model.Child; import com.rapidftr.model.User; import com.rapidftr.repository.ChildRepository; @@ -16,10 +17,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.stubbing.OngoingStubbing; import java.io.IOException; import java.io.SyncFailedException; +import static com.google.common.base.Strings.isNullOrEmpty; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.mockito.BDDMockito.given; @@ -77,6 +80,17 @@ public void shouldCallSyncWhenMenuSelected() { verify(activity).sync(); } + @Test + public void shouldCallGetServerURLWhenMenuSelected() throws Exception { + doNothing().when(activity).getServerAndSync(); + User currUser = ((RapidFtrApplication) Robolectric.application).getCurrentUser(); + currUser.setServerUrl(null); + MenuItem item = mock(MenuItem.class); + given(item.getItemId()).willReturn(R.id.synchronize_child); + activity.onOptionsItemSelected(item); + verify(activity).getServerAndSync(); + } + @Test public void shouldShowSyncLogMenuItemAfterSyncFailure(){ Child child = mock(Child.class); From c7b1444c161b004f379c85248b2dcefd9c8dfbcb Mon Sep 17 00:00:00 2001 From: LiQing Date: Fri, 17 May 2013 09:53:28 +0800 Subject: [PATCH 2/6] add chinese translations --- RapidFTR-Android/res/values-zh/strings.xml | 136 ++++++++++----------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/RapidFTR-Android/res/values-zh/strings.xml b/RapidFTR-Android/res/values-zh/strings.xml index fc814962..64de96eb 100644 --- a/RapidFTR-Android/res/values-zh/strings.xml +++ b/RapidFTR-Android/res/values-zh/strings.xml @@ -3,90 +3,90 @@ RapidFTR 登录 - Log Out - Records are still being sychronised. Logging out now will cancel this process, are you sure you want to log out? - You have been logged out successfully. - Change URL - Register Child - View All Children - Search for a Child - Synchronize - New to RapidFTR? - Full name required - Full Name + 退出 + 正在同步,退出将会终止同步,确定要同步吗? + 你已成功退出! + 更改 URL + 注册一个孩子 + 查看所有孩子 + 查找一個孩子 + 同步 + RapidFTR的新用戶? + 全称是必需的 + 全称 - Username - Password + 用户名 + 密码 URL https://test.rapidftr.com rapidftr - Username is required - Password is required - Organisation is required - Re-type password - Server URL is required - Password mismatch + 用户名是必需的 + 密码是必需的 + 组织是必需的 + 确认密码 + 服务器地址是必需的 + 密码不匹配 - Loading… - Incorrect username or password - Login Successful - Please enter a valid url - Unable to connect to the server, please contact your system administrator + 加载… + 用户名或密码不正确 + 登录成功 + 请输入一个正确的url + 不能连接到服务器,请联系系统管理员 RapidFTR - New Registration - Saving record - Please fill up at least one field - Saved record successfully - Failed to save record! + 新注册 + 保存记录 + 请至少填写一项 + 保存记录成功 + 保存记录失败! - Capture Photo - An error occurred while capturing the photo - View Photo - An error occurred while loading the photo - No photo captured for the record - Unable to delete photo from Gallery. Please go to Gallery and delete it manually - Set as primary photo + 拍照 + 拍照出现错误 + 预览 + 加载照片出错 + 该记录无照片 + 无法删除照片,请到相册删除 + 设为主要照片 - Synchronize All - Cancel Synchronize All - Synchronize This Record - Sync in progress… - Sync successful - Sync failed - Network connection is not available, Please try again later + 同步所有 + 取消同步所有 + 同步此条记录 + 正在同步… + 同步成功 + 同步失败 + 网络连接不可用,请稍后再试 - An error occurred while performing this operation - An error occurred while fetching record(s), please try again - Submit - Edit - Save - Choose an action - Discard - Cancel - Clear + 操作出错 + 获取记录失败,请稍后重试 + 提交 + 编辑 + 保存 + 选择一个操作 + 丢弃 + 取消 + 清除 - Register - View All - Search - Sync error - Step 1 of 3 - Syncing Form Sections… - Step 2 of 3 - Sending records to server… - Step 3 of 3 - Getting records from server… - Sign Up! - Confirm Password - Organisation + 注册 + 查看所有 + 搜索 + 同步出错 + 步骤1-同步表单部分… + 步骤2-上传记录… + 步骤3-下载记录… + 注册! + 确认密码 + 组织 URL(Optional) - Sync complete. - Error in syncing. Try again after some time. - Search record by name/id - Go - No Record Found + 同步完成. + 同步出错,请稍后再试。 + 通过姓名或编号搜索 + 搜索 + 无此记录 - This is an audio upload box + 这是一个音频上传框 From 0cc4f13f49df81351fd7aed1ac6f2a9820a00688 Mon Sep 17 00:00:00 2001 From: LiQing Date: Fri, 17 May 2013 13:47:46 +0800 Subject: [PATCH 3/6] update the chinese translations --- RapidFTR-Android/res/values-zh/strings.xml | 83 +++++++++++++++------- RapidFTR-Android/res/values/strings.xml | 2 +- 2 files changed, 58 insertions(+), 27 deletions(-) diff --git a/RapidFTR-Android/res/values-zh/strings.xml b/RapidFTR-Android/res/values-zh/strings.xml index 64de96eb..6cdd10d8 100644 --- a/RapidFTR-Android/res/values-zh/strings.xml +++ b/RapidFTR-Android/res/values-zh/strings.xml @@ -4,66 +4,71 @@ 登录 退出 - 正在同步,退出将会终止同步,确定要同步吗? - 你已成功退出! - 更改 URL - 注册一个孩子 + 正在同步,退出将终止同步,确实要退出? + 会话失效,请退出重新登录 + + 退出成功 + 更改网址 + 注册孩子 查看所有孩子 - 查找一個孩子 + 搜索孩子 同步 - RapidFTR的新用戶? + RapidFTR新用户? 全称是必需的 + 用户名已使用,请重新选择 全称 用户名 密码 - URL + 网址 - https://test.rapidftr.com - rapidftr + + 用户名是必需的 密码是必需的 组织是必需的 - 确认密码 - 服务器地址是必需的 + 重新填写网址 + 服务器网址是必需的 密码不匹配 加载… 用户名或密码不正确 登录成功 - 请输入一个正确的url - 不能连接到服务器,请联系系统管理员 + 请输入一个合法的网址 + 无法连接到服务器,请联系系统管理员 RapidFTR 新注册 保存记录 - 请至少填写一项 + 请至少填写一个表单 保存记录成功 保存记录失败! 拍照 - 拍照出现错误 + 拍照失败 预览 加载照片出错 该记录无照片 - 无法删除照片,请到相册删除 + 无法删除照片,请去相册删除 设为主要照片 + 同步所有 取消同步所有 同步此条记录 正在同步… 同步成功 同步失败 - 网络连接不可用,请稍后再试 + 网络连接失败,请稍后重试 操作出错 - 获取记录失败,请稍后重试 + 获取记录出错,请重试 + 获取会话出错 提交 编辑 保存 - 选择一个操作 + 选择一个动作 丢弃 取消 清除 @@ -72,21 +77,47 @@ 查看所有 搜索 同步出错 - 步骤1-同步表单部分… + 步骤1-同步表单… 步骤2-上传记录… 步骤3-下载记录… - 注册! + 注册! 确认密码 组织 - URL(Optional) + 网址 - 同步完成. - 同步出错,请稍后再试。 - 通过姓名或编号搜索 + 同步完成 + 同步出错,请稍后再试! + 通过名字或编号搜索 搜索 无此记录 - 这是一个音频上传框 + 这是一个语音上传框 + 关于 + + RapidFTR支持如下语言: + 全名: + 用户名: + 密码: + 确认密码: + 组织: + 所有表单必填 + 你已注册,请登录使用 + + 确定 + 开始 + 停止 + 播放 + 请重设密码 + 无法连接到服务器,同步取消 + 无法连接到服务器,请稍后重试 + 无网络,请打开wifi或数据重试 + 同步数据出错,请稍后重试 + 当前密码 + 新密码 + 更改密码 + 密码更改成功 + 无法更改密码,请重试 + 正在同步,更改密码将终止同步,是否继续? diff --git a/RapidFTR-Android/res/values/strings.xml b/RapidFTR-Android/res/values/strings.xml index c7aa0828..0f0c7335 100644 --- a/RapidFTR-Android/res/values/strings.xml +++ b/RapidFTR-Android/res/values/strings.xml @@ -2,7 +2,7 @@ RapidFTR - Log In + 登录Log In Log Out Records are still being sychronised. Logging out now will cancel this process, are you sure you want to log out? Your session is not active on the server, Please logout and login again From 7ed33d64b31f37b8bd2b364b821aaf8119af16dd Mon Sep 17 00:00:00 2001 From: LiQing Date: Fri, 17 May 2013 17:30:37 +0800 Subject: [PATCH 4/6] finished #1672 and translate the message to chinese --- RapidFTR-Android/res/layout/signup.xml | 2 +- RapidFTR-Android/res/values-ar/strings.xml | 2 + RapidFTR-Android/res/values-es/strings.xml | 2 + RapidFTR-Android/res/values-fr/strings.xml | 2 + RapidFTR-Android/res/values-ru/strings.xml | 2 + RapidFTR-Android/res/values-zh/strings.xml | 2 + RapidFTR-Android/res/values/strings.xml | 2 + .../rapidftr/activity/RapidFtrActivity.java | 11 +++ .../com/rapidftr/activity/SignupActivity.java | 34 ++++---- .../rapidftr/activity/SignupActivityTest.java | 78 +++++++++++-------- .../activity/ViewChildActivityTest.java | 5 +- 11 files changed, 89 insertions(+), 53 deletions(-) diff --git a/RapidFTR-Android/res/layout/signup.xml b/RapidFTR-Android/res/layout/signup.xml index 267108e1..bcc0e1ef 100644 --- a/RapidFTR-Android/res/layout/signup.xml +++ b/RapidFTR-Android/res/layout/signup.xml @@ -43,7 +43,7 @@ إسم المستخدم ضروري كلمة السر ضرورية + Use at least 6 characters or more for your password + Password should be 6 characters or more المنظمة ضرورية أعد إدخال كلمة السر رابط المخدم ضروري diff --git a/RapidFTR-Android/res/values-es/strings.xml b/RapidFTR-Android/res/values-es/strings.xml index ac560646..a177fdc4 100644 --- a/RapidFTR-Android/res/values-es/strings.xml +++ b/RapidFTR-Android/res/values-es/strings.xml @@ -17,6 +17,8 @@ Username Password + Use at least 6 characters or more for your password + Password should be 6 characters or more URL https://test.rapidftr.com diff --git a/RapidFTR-Android/res/values-fr/strings.xml b/RapidFTR-Android/res/values-fr/strings.xml index cd6e30c5..e84d0fbc 100644 --- a/RapidFTR-Android/res/values-fr/strings.xml +++ b/RapidFTR-Android/res/values-fr/strings.xml @@ -15,6 +15,8 @@ Username Password + Use at least 6 characters or more for your password + Password should be 6 characters or more URL Full name required Full Name diff --git a/RapidFTR-Android/res/values-ru/strings.xml b/RapidFTR-Android/res/values-ru/strings.xml index ac9c38bb..aa8d947f 100644 --- a/RapidFTR-Android/res/values-ru/strings.xml +++ b/RapidFTR-Android/res/values-ru/strings.xml @@ -17,6 +17,8 @@ Username Password + Use at least 6 characters or more for your password + Password should be 6 characters or more URL https://test.rapidftr.com diff --git a/RapidFTR-Android/res/values-zh/strings.xml b/RapidFTR-Android/res/values-zh/strings.xml index 6cdd10d8..c7d34422 100644 --- a/RapidFTR-Android/res/values-zh/strings.xml +++ b/RapidFTR-Android/res/values-zh/strings.xml @@ -27,6 +27,8 @@ 用户名是必需的 密码是必需的 + 密码长度应至少6位 + 密码长度必须不小于6个字符 组织是必需的 重新填写网址 服务器网址是必需的 diff --git a/RapidFTR-Android/res/values/strings.xml b/RapidFTR-Android/res/values/strings.xml index 0f0c7335..93464dc6 100644 --- a/RapidFTR-Android/res/values/strings.xml +++ b/RapidFTR-Android/res/values/strings.xml @@ -27,6 +27,8 @@ Username is required Password is required + Use at least 6 characters or more for your password + Password should be 6 characters or more Organisation is required Re-type password Server URL is required diff --git a/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java b/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java index 7a42ca28..15bc02a4 100644 --- a/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java +++ b/RapidFTR-Android/src/main/java/com/rapidftr/activity/RapidFtrActivity.java @@ -290,6 +290,17 @@ protected boolean validateTextFieldNotEmpty(int id, int messageId) { } } + protected boolean validateTextFieldLength(int id, int length, int messageId) { + EditText editText = (EditText) findViewById(id); + String value = getEditText(id); + if (value.length() < length) { + editText.setError(getString(messageId)); + return false; + } else { + return true; + } + } + protected String getEditText(int resId) { CharSequence value = ((EditText) findViewById(resId)).getText(); return value == null ? null : value.toString().trim(); diff --git a/RapidFTR-Android/src/main/java/com/rapidftr/activity/SignupActivity.java b/RapidFTR-Android/src/main/java/com/rapidftr/activity/SignupActivity.java index cd6ba4c5..f78ff213 100644 --- a/RapidFTR-Android/src/main/java/com/rapidftr/activity/SignupActivity.java +++ b/RapidFTR-Android/src/main/java/com/rapidftr/activity/SignupActivity.java @@ -23,33 +23,33 @@ protected boolean shouldEnsureLoggedIn() { } public boolean isValid() { - return validatesPresenceOfMandatoryFields() && isPasswordSameAsConfirmPassword(); + return validatesPresenceOfMandatoryFields() && validateTextFieldLength(R.id.password, 6, R.string.password_length_error ) && isPasswordSameAsConfirmPassword(); } public void createUser(View view) throws IOException, GeneralSecurityException { if (isValid()) { - User user = buildUser(); + User user = buildUser(); if (user.exists()) { - EditText editText = (EditText) findViewById(R.id.username); - editText.setError(getString(R.string.username_taken)); - makeToast(getString(R.string.username_taken)); + EditText editText = (EditText) findViewById(R.id.username); + editText.setError(getString(R.string.username_taken)); + makeToast(getString(R.string.username_taken)); } else { - user.save(); - makeToast(getString(R.string.registered) + " "+ getEditText(R.id.username)); - finish(); + user.save(); + makeToast(getString(R.string.registered) + " " + getEditText(R.id.username)); + finish(); } } } - protected User buildUser() { - User user = new User(getEditText(R.id.username)); - user.setVerified(false); - user.setFullName(getEditText(R.id.full_name)); - user.setPassword(getEditText(R.id.password)); - user.setUnauthenticatedPassword(getEditText(R.id.password)); - user.setOrganisation(getEditText(R.id.organisation)); - return user; - } + protected User buildUser() { + User user = new User(getEditText(R.id.username)); + user.setVerified(false); + user.setFullName(getEditText(R.id.full_name)); + user.setPassword(getEditText(R.id.password)); + user.setUnauthenticatedPassword(getEditText(R.id.password)); + user.setOrganisation(getEditText(R.id.organisation)); + return user; + } protected boolean validatesPresenceOfMandatoryFields() { return validateTextFieldNotEmpty(R.id.full_name, R.string.full_name_required) & diff --git a/RapidFTR-Android/src/test/java/com/rapidftr/activity/SignupActivityTest.java b/RapidFTR-Android/src/test/java/com/rapidftr/activity/SignupActivityTest.java index 57a2d9a4..6ee16c0d 100644 --- a/RapidFTR-Android/src/test/java/com/rapidftr/activity/SignupActivityTest.java +++ b/RapidFTR-Android/src/test/java/com/rapidftr/activity/SignupActivityTest.java @@ -24,21 +24,20 @@ public class SignupActivityTest { private SignupActivity signupActivity; @Before - public void setup(){ + public void setup() { signupActivity = new SignupActivity(); signupActivity.onCreate(null); signupActivity = spy(signupActivity); - userName = (EditText)signupActivity.findViewById(R.id.username); - password = (EditText)signupActivity.findViewById(R.id.password); - confirmPassword = (EditText)signupActivity.findViewById(R.id.confirm_password); - organisation = (EditText)signupActivity.findViewById(R.id.organisation); + userName = (EditText) signupActivity.findViewById(R.id.username); + password = (EditText) signupActivity.findViewById(R.id.password); + confirmPassword = (EditText) signupActivity.findViewById(R.id.confirm_password); + organisation = (EditText) signupActivity.findViewById(R.id.organisation); } @Test - public void shouldCheckIfMandatoryFieldsAreFilled() - { - userName = mock(EditText.class); - password = mock(EditText.class); + public void shouldCheckIfMandatoryFieldsAreFilled() { + userName = mock(EditText.class); + password = mock(EditText.class); organisation = mock(EditText.class); confirmPassword = mock(EditText.class); @@ -55,13 +54,26 @@ public void shouldCheckIfMandatoryFieldsAreFilled() } @Test - public void shouldSetErrorMessageIfConfirmPasswordIsNotSameAsPassword(){ - userName = mock(EditText.class); - password = mock(EditText.class); + public void shouldCheckIfPasswordLengthInvalid() throws Exception { + password = mock(EditText.class); + + doReturn(password).when(signupActivity).findViewById(R.id.password); + + doReturn("fake").when(signupActivity).getEditText(R.id.password); + doReturn(true).when(signupActivity).validatesPresenceOfMandatoryFields(); + + assertThat(signupActivity.isValid(), equalTo(false)); + verify(password).setError(signupActivity.getString(R.string.password_length_error)); + } + + @Test + public void shouldSetErrorMessageIfConfirmPasswordIsNotSameAsPassword() { + userName = mock(EditText.class); + password = mock(EditText.class); organisation = mock(EditText.class); confirmPassword = mock(EditText.class); - password.setText("text"); + password.setText("password"); confirmPassword.setText("randomText"); userName.setText("user"); organisation.setText("org"); @@ -69,7 +81,7 @@ public void shouldSetErrorMessageIfConfirmPasswordIsNotSameAsPassword(){ doReturn(userName).when(signupActivity).findViewById(R.id.username); doReturn(confirmPassword).when(signupActivity).findViewById(R.id.confirm_password); doReturn(organisation).when(signupActivity).findViewById(R.id.organisation); - doReturn("text").when(signupActivity).getEditText(R.id.password); + doReturn("password").when(signupActivity).getEditText(R.id.password); doReturn("confirmText").when(signupActivity).getEditText(R.id.confirm_password); doReturn(true).when(signupActivity).validatesPresenceOfMandatoryFields(); @@ -79,46 +91,46 @@ public void shouldSetErrorMessageIfConfirmPasswordIsNotSameAsPassword(){ @Test public void shouldSaveUserDetailsInSharedPreferences() throws Exception { - User user = spy(createUser()); - doNothing().when(user).save(); - doReturn(user).when(signupActivity).buildUser(); - doReturn(true).when(signupActivity).isValid(); + User user = spy(createUser()); + doNothing().when(user).save(); + doReturn(user).when(signupActivity).buildUser(); + doReturn(true).when(signupActivity).isValid(); signupActivity.createUser(null); - verify(user).save(); + verify(user).save(); } @Test public void shouldCloseWhenUserDetailsAreCorrect() throws Exception { - fillUpFields(); + fillUpFields(); signupActivity.createUser(null); - verify(signupActivity).finish(); + verify(signupActivity).finish(); } @Test public void shouldShowToastAfterRedirectedToLoginPage() throws Exception { - fillUpFields(); + fillUpFields(); signupActivity.createUser(null); - assertThat(ShadowToast.getTextOfLatestToast(), equalTo(signupActivity.getString(R.string.registered)+" username")); + assertThat(ShadowToast.getTextOfLatestToast(), equalTo(signupActivity.getString(R.string.registered) + " username")); } @Test public void shouldCheckIfUsernameIsAlreadyTakenInMobile() throws Exception { - signupActivity.getContext().getSharedPreferences().edit().putString("user_username","{}").commit(); - userName = mock(EditText.class); + signupActivity.getContext().getSharedPreferences().edit().putString("user_username", "{}").commit(); + userName = mock(EditText.class); doReturn(userName).when(signupActivity).findViewById(R.id.username); - fillUpFields(); + fillUpFields(); signupActivity.createUser(null); assertThat(ShadowToast.getTextOfLatestToast(), equalTo(signupActivity.getString(R.string.username_taken))); verify(userName).setError(signupActivity.getString(R.string.username_taken)); } - protected void fillUpFields() { - doReturn("username").when(signupActivity).getEditText(R.id.username); - doReturn("fullname").when(signupActivity).getEditText(R.id.full_name); - doReturn("organisation").when(signupActivity).getEditText(R.id.organisation); - doReturn("text").when(signupActivity).getEditText(R.id.password); - doReturn("text").when(signupActivity).getEditText(R.id.confirm_password); - } + protected void fillUpFields() { + doReturn("username").when(signupActivity).getEditText(R.id.username); + doReturn("fullname").when(signupActivity).getEditText(R.id.full_name); + doReturn("organisation").when(signupActivity).getEditText(R.id.organisation); + doReturn("password").when(signupActivity).getEditText(R.id.password); + doReturn("password").when(signupActivity).getEditText(R.id.confirm_password); + } } diff --git a/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java b/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java index cc173e77..c36be0c0 100644 --- a/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java +++ b/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java @@ -83,8 +83,9 @@ public void shouldCallSyncWhenMenuSelected() { @Test public void shouldCallGetServerURLWhenMenuSelected() throws Exception { doNothing().when(activity).getServerAndSync(); - User currUser = ((RapidFtrApplication) Robolectric.application).getCurrentUser(); - currUser.setServerUrl(null); + User currentUser = mock(User.class); + doReturn(currentUser).when(activity).getCurrentUser(); + doReturn(null).when(currentUser).getServerUrl(); MenuItem item = mock(MenuItem.class); given(item.getItemId()).willReturn(R.id.synchronize_child); activity.onOptionsItemSelected(item); From 9121e84606fc149a08cc5da98c7b210bea84d6a3 Mon Sep 17 00:00:00 2001 From: LiQing Date: Fri, 17 May 2013 17:52:27 +0800 Subject: [PATCH 5/6] refactor the test code --- .../test/java/com/rapidftr/activity/ViewChildActivityTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java b/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java index c36be0c0..e563f6f8 100644 --- a/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java +++ b/RapidFTR-Android/src/test/java/com/rapidftr/activity/ViewChildActivityTest.java @@ -85,7 +85,6 @@ public void shouldCallGetServerURLWhenMenuSelected() throws Exception { doNothing().when(activity).getServerAndSync(); User currentUser = mock(User.class); doReturn(currentUser).when(activity).getCurrentUser(); - doReturn(null).when(currentUser).getServerUrl(); MenuItem item = mock(MenuItem.class); given(item.getItemId()).willReturn(R.id.synchronize_child); activity.onOptionsItemSelected(item); From 83d50f6a443dd9c768517586fd076ef45860db96 Mon Sep 17 00:00:00 2001 From: LiQing Date: Fri, 17 May 2013 20:11:31 +0800 Subject: [PATCH 6/6] update the text of UI --- RapidFTR-Android/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RapidFTR-Android/res/values/strings.xml b/RapidFTR-Android/res/values/strings.xml index 93464dc6..25045b2b 100644 --- a/RapidFTR-Android/res/values/strings.xml +++ b/RapidFTR-Android/res/values/strings.xml @@ -2,7 +2,7 @@ RapidFTR - 登录Log In + Log In Log Out Records are still being sychronised. Logging out now will cancel this process, are you sure you want to log out? Your session is not active on the server, Please logout and login again