diff --git a/.gitignore b/.gitignore index b595689..5da7c95 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /build /captures .externalNativeBuild +*.apk diff --git a/control/src/main/java/com/appmon/control/DeviceListActivity.java b/control/src/main/java/com/appmon/control/DeviceListActivity.java index 631fb6c..708a07f 100644 --- a/control/src/main/java/com/appmon/control/DeviceListActivity.java +++ b/control/src/main/java/com/appmon/control/DeviceListActivity.java @@ -30,6 +30,8 @@ public class DeviceListActivity extends AppCompatActivity implements IDeviceList IDeviceListPresenter mPresenter; ListView mListView; + TextView mNoDevicesText; + List mDeviceList; DeviceListAdapter mListAdapter; @@ -38,6 +40,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_device_list); mListView = (ListView) findViewById(R.id.deviceList); + mNoDevicesText = (TextView) findViewById(R.id.noDevicesText); mPresenter = new DeviceListPresenter(ModelManager.getInstance() .getDeviceListModel()); mPresenter.attachView(this); @@ -94,6 +97,13 @@ public void openAppList(String deviceId) { public void updateList(List devices) { mDeviceList = devices; mListAdapter.notifyDataSetChanged(); + if (mDeviceList.size() == 0) { + mListView.setVisibility(View.GONE); + mNoDevicesText.setVisibility(View.VISIBLE); + } else { + mNoDevicesText.setVisibility(View.GONE); + mListView.setVisibility(View.VISIBLE); + } } @Override diff --git a/control/src/main/java/com/appmon/control/SettingsActivity.java b/control/src/main/java/com/appmon/control/SettingsActivity.java index 7228017..29a5d6b 100644 --- a/control/src/main/java/com/appmon/control/SettingsActivity.java +++ b/control/src/main/java/com/appmon/control/SettingsActivity.java @@ -133,6 +133,8 @@ public void showMessage(Message msg) { case NETWORK_ERROR: Toast.makeText(this, R.string.text_network_error, Toast.LENGTH_SHORT).show(); break; + case REAUTH_NEEDED: + Toast.makeText(this, R.string.text_reauth, Toast.LENGTH_SHORT).show(); } } diff --git a/control/src/main/java/com/appmon/control/models/applist/AppListModel.java b/control/src/main/java/com/appmon/control/models/applist/AppListModel.java index ce2b39d..7a2b88d 100644 --- a/control/src/main/java/com/appmon/control/models/applist/AppListModel.java +++ b/control/src/main/java/com/appmon/control/models/applist/AppListModel.java @@ -15,11 +15,11 @@ public class AppListModel implements IAppListModel { // // private Map mListenerBridges; private DatabaseBridgeManager mDatabaseBridgeManager; - private IDatabaseService mDatabase; private String lastUserId = null; private IAuthService mAuth; + private IDatabaseService mDatabase; public AppListModel(ICloudServices cloudServices) { mDatabase = cloudServices.getDatabase(); @@ -78,10 +78,12 @@ public void onChildRemoved(IDataSnapshot prevSnapshot) { }; mDatabaseBridgeManager.addListener(getRootPath() + presenter.getDeviceId(), presenter, listener); + mDatabase.goOnline(); } @Override public void removePresenter(PresenterOps presenter) { + mDatabase.goOffline(); mDatabaseBridgeManager.removeListener(presenter); } diff --git a/control/src/main/java/com/appmon/control/models/devicelist/DeviceListModel.java b/control/src/main/java/com/appmon/control/models/devicelist/DeviceListModel.java index b828899..87c3d14 100644 --- a/control/src/main/java/com/appmon/control/models/devicelist/DeviceListModel.java +++ b/control/src/main/java/com/appmon/control/models/devicelist/DeviceListModel.java @@ -6,6 +6,7 @@ import com.appmon.shared.IAuthService; import com.appmon.shared.ICloudServices; import com.appmon.shared.IDataSnapshot; +import com.appmon.shared.IDatabaseService; import com.appmon.shared.entities.DeviceInfo; public class DeviceListModel implements IDeviceListModel { @@ -15,9 +16,10 @@ public class DeviceListModel implements IDeviceListModel { private String lastUserId = null; private IAuthService mAuth; - + private IDatabaseService mDatabase; public DeviceListModel(ICloudServices cloudServices) { - mDatabaseBridgeManager = new DatabaseBridgeManager<>(cloudServices.getDatabase()); + mDatabase = cloudServices.getDatabase(); + mDatabaseBridgeManager = new DatabaseBridgeManager<>(mDatabase); mAuth = cloudServices.getAuth(); } @@ -72,11 +74,12 @@ public void onCanceled(DatabaseError error) { }; // link listener mDatabaseBridgeManager.addListener(getRootPath(), presenter, listener); - + mDatabase.goOnline(); } @Override public void removePresenter(PresenterOps presenter) { + mDatabase.goOffline(); mDatabaseBridgeManager.removeListener(presenter); } } diff --git a/control/src/main/java/com/appmon/control/models/user/IUserModel.java b/control/src/main/java/com/appmon/control/models/user/IUserModel.java index eff7627..47a1da3 100644 --- a/control/src/main/java/com/appmon/control/models/user/IUserModel.java +++ b/control/src/main/java/com/appmon/control/models/user/IUserModel.java @@ -24,7 +24,7 @@ interface IResetPasswordListener extends IFallibleListener { enum ChangeAppPinError { WEAK_PIN } enum ChangeClientPinError { WEAK_PIN, INTERNAL_ERROR } - enum ChangePasswordError { WEAK_PASSWORD, INTERNAL_ERROR } + enum ChangePasswordError { WEAK_PASSWORD, REAUTH_NEEDED, INTERNAL_ERROR } enum RegisterError { WEAK_PASSWORD, INVALID_EMAIL, USER_EXISTS, INTERNAL_ERROR } enum SignInError {INVALID_EMAIL, WRONG_PASSWORD, INTERNAL_ERROR } enum ResetPasswordError { INVALID_USER, INTERNAL_ERROR } diff --git a/control/src/main/java/com/appmon/control/models/user/UserModel.java b/control/src/main/java/com/appmon/control/models/user/UserModel.java index 9b35dbe..985ff85 100644 --- a/control/src/main/java/com/appmon/control/models/user/UserModel.java +++ b/control/src/main/java/com/appmon/control/models/user/UserModel.java @@ -202,6 +202,9 @@ public void onFailure(IUser.ChangePasswordError error) { case WEAK_PASSWORD: l.onFail(ChangePasswordError.WEAK_PASSWORD); break; + case REAUTH_NEEDED: + l.onFail(ChangePasswordError.REAUTH_NEEDED); + break; default: l.onFail(ChangePasswordError.INTERNAL_ERROR); } @@ -244,6 +247,7 @@ public void changeClientPin(String pin) { } return; } + mDatabase.goOnline(); // can be turned off by device list model mDatabase.setValue(mUserRootPath + "pin", pin, new ResultListener() { @Override public void onSuccess(Void value) { diff --git a/control/src/main/java/com/appmon/control/presenters/SettingsPresenter.java b/control/src/main/java/com/appmon/control/presenters/SettingsPresenter.java index b008fc8..952d121 100644 --- a/control/src/main/java/com/appmon/control/presenters/SettingsPresenter.java +++ b/control/src/main/java/com/appmon/control/presenters/SettingsPresenter.java @@ -34,6 +34,10 @@ public void onFail(IUserModel.ChangePasswordError error) { case WEAK_PASSWORD: mView.showInputError(ISettingsView.InputError.WEAK_PASSWORD); break; + case REAUTH_NEEDED: + mView.showMessage(ISettingsView.Message.REAUTH_NEEDED); + mView.clearFocus(); + break; case INTERNAL_ERROR: mView.showMessage(ISettingsView.Message.NETWORK_ERROR); mView.clearFocus(); @@ -124,10 +128,11 @@ public void changeAppPin(String pin, String pinRepeat) { @Override public void changeClientPin(String pin) { + if (mView != null) { + mView.setProgressVisible(true); + mView.clearInputErrors(); + } mModel.changeClientPin(pin); - if (mView == null) return; - mView.setProgressVisible(true); - mView.clearInputErrors(); } @Override diff --git a/control/src/main/java/com/appmon/control/views/ISettingsView.java b/control/src/main/java/com/appmon/control/views/ISettingsView.java index 8974d5a..188eda6 100644 --- a/control/src/main/java/com/appmon/control/views/ISettingsView.java +++ b/control/src/main/java/com/appmon/control/views/ISettingsView.java @@ -20,6 +20,7 @@ enum Message { APP_PIN_CHANGED, CLIENT_PIN_CHANGED, NETWORK_ERROR, + REAUTH_NEEDED, } /** diff --git a/control/src/main/res/layout/activity_device_list.xml b/control/src/main/res/layout/activity_device_list.xml index d93b3e8..b914f88 100644 --- a/control/src/main/res/layout/activity_device_list.xml +++ b/control/src/main/res/layout/activity_device_list.xml @@ -14,12 +14,14 @@ + android:layout_height="match_parent" + android:visibility="gone"/> + android:visibility="visible"/> diff --git a/control/src/main/res/values/strings.xml b/control/src/main/res/values/strings.xml index a4b3241..f8bfdbe 100644 --- a/control/src/main/res/values/strings.xml +++ b/control/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ Sign in Register - No devices + No connected devices Search applications Change password Change pin @@ -50,6 +50,7 @@ No applications Device list sync error App list sync error + Please sign out and log in again Enter pin: Pin diff --git a/shared/src/main/java/com/appmon/shared/IUser.java b/shared/src/main/java/com/appmon/shared/IUser.java index 2221bdd..56bd064 100644 --- a/shared/src/main/java/com/appmon/shared/IUser.java +++ b/shared/src/main/java/com/appmon/shared/IUser.java @@ -6,7 +6,7 @@ * Represents base user account actions. */ public interface IUser { - enum ChangePasswordError {WEAK_PASSWORD, INVALID_USER} + enum ChangePasswordError {WEAK_PASSWORD, REAUTH_NEEDED, INTERNAL_ERROR} /** * @return current user unique ID. Can't be null. */ diff --git a/shared/src/main/java/com/appmon/shared/firebase/FirebaseUser.java b/shared/src/main/java/com/appmon/shared/firebase/FirebaseUser.java index 0b88a8d..3db4428 100644 --- a/shared/src/main/java/com/appmon/shared/firebase/FirebaseUser.java +++ b/shared/src/main/java/com/appmon/shared/firebase/FirebaseUser.java @@ -7,6 +7,7 @@ import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuthInvalidUserException; +import com.google.firebase.auth.FirebaseAuthRecentLoginRequiredException; import com.google.firebase.auth.FirebaseAuthWeakPasswordException; /** @@ -41,8 +42,11 @@ public void onComplete(@NonNull Task task) { } else { if (task.getException() instanceof FirebaseAuthWeakPasswordException) { listener.onFailure(ChangePasswordError.WEAK_PASSWORD); - } else if (task.getException() instanceof FirebaseAuthInvalidUserException) { - listener.onFailure(ChangePasswordError.INVALID_USER); + } else if (task.getException() instanceof + FirebaseAuthRecentLoginRequiredException) { + listener.onFailure(ChangePasswordError.REAUTH_NEEDED); + } else { + listener.onFailure(ChangePasswordError.INTERNAL_ERROR); } } }