Commit 0a4d74ee authored by Alexandre Lision's avatar Alexandre Lision
Browse files

account: fix crash in details screen

This was due to the account observer not being removed. When reopening
the details, the previous observer was still alive and was trying to
refresh the UI account on a destroyed view instance

Change-Id: I14021b9ae231e32bb019d6c10d4d88f558b150db
Tuleap: #894
parent 5137ad4a
......@@ -94,7 +94,31 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
@Override
public void update(Observable observable, Object data) {
processAccount();
if (mAccSelected == null || mService == null) {
return;
}
final Account acc = mAccSelected;
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(acc.getAlias());
}
final IDRingService remote = getRemoteService();
if (remote == null) {
Log.w(TAG, "Error updating account, remote service is null");
return;
}
mService.getThreadPool().submit(new Runnable() {
@Override
public void run() {
try {
remote.setCredentials(acc.getAccountID(), acc.getCredentialsHashMapList());
remote.setAccountDetails(acc.getAccountID(), acc.getDetails());
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
};
......@@ -106,12 +130,13 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
mService = binder.getService();
mBound = true;
String account_id = getIntent().getData().getLastPathSegment();
String accountId = getIntent().getData().getLastPathSegment();
Log.i(TAG, "Service connected " + className.getClassName() + " " + getIntent().getData().toString());
mAccSelected = mService.getAccount(account_id);
if (mAccSelected == null)
mAccSelected = mService.getAccount(accountId);
if (mAccSelected == null) {
finish();
}
mAccSelected.addObserver(mAccountObserver);
getSupportActionBar().setTitle(mAccSelected.getAlias());
......@@ -134,6 +159,7 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
@Override
public void onServiceDisconnected(ComponentName arg0) {
// Called in case of service crashing or getting killed
mAccSelected.deleteObserver(mAccountObserver);
mBound = false;
}
......@@ -167,6 +193,9 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
if (mBound) {
unbindService(mConnection);
if (mAccSelected != null) {
mAccSelected.deleteObserver(mAccountObserver);
}
mBound = false;
}
}
......@@ -184,33 +213,13 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
case R.id.menuitem_export:
startExport();
break;
default:
break;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
private void processAccount() {
final Account acc = mAccSelected;
final IDRingService remote = getRemoteService();
getSupportActionBar().setTitle(acc.getAlias());
mService.getThreadPool().submit(new Runnable() {
@Override
public void run() {
try {
remote.setCredentials(acc.getAccountID(), acc.getCredentialsHashMapList());
remote.setAccountDetails(acc.getAccountID(), acc.getDetails());
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private AlertDialog createDeleteDialog() {
Activity ownerActivity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(ownerActivity);
......@@ -268,7 +277,7 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
}
private void startExport() {
boolean hasPermission = (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
boolean hasPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
if (hasPermission) {
showExportDialog();
} else {
......@@ -297,7 +306,7 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
LayoutInflater inflater = getLayoutInflater();
ViewGroup v = (ViewGroup) inflater.inflate(R.layout.dialog_account_export, null);
final TextView pwd = (TextView) v.findViewById(R.id.newpwd_txt);
final TextView pwd_confirm = (TextView) v.findViewById(R.id.newpwd_confirm_txt);
final TextView pwdConfirm = (TextView) v.findViewById(R.id.newpwd_confirm_txt);
builder.setMessage(R.string.account_export_message)
.setTitle(R.string.account_export_title)
.setPositiveButton(R.string.account_export, null)
......@@ -313,10 +322,8 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
pwd.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Log.w(TAG, "onEditorAction " + actionId + " " + (event == null ? null : event.toString()));
if (actionId == EditorInfo.IME_ACTION_NEXT)
return checkPassword(v, null);
return false;
Log.i(TAG, "onEditorAction " + actionId + " " + (event == null ? null : event.toString()));
return actionId == EditorInfo.IME_ACTION_NEXT && checkPassword(v, null);
}
});
pwd.setOnFocusChangeListener(new View.OnFocusChangeListener() {
......@@ -329,15 +336,13 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
}
}
});
pwd_confirm.setOnEditorActionListener(new TextView.OnEditorActionListener() {
pwdConfirm.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Log.w(TAG, "onEditorAction " + actionId + " " + (event == null ? null : event.toString()));
if (actionId == EditorInfo.IME_ACTION_DONE) {
if (!checkPassword(pwd, v)) {
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).callOnClick();
return true;
}
if (actionId == EditorInfo.IME_ACTION_DONE && !checkPassword(pwd, v)) {
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).callOnClick();
return true;
}
return false;
}
......@@ -349,7 +354,7 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!checkPassword(pwd, pwd_confirm)) {
if (!checkPassword(pwd, pwdConfirm)) {
final String pwd_txt = pwd.getText().toString();
alertDialog.dismiss();
......@@ -409,7 +414,7 @@ public class AccountEditionActivity extends AppCompatActivity implements LocalSe
}
protected void onPostExecute(Integer ret) {
if (exportDialog != null){
if (exportDialog != null) {
exportDialog.dismiss();
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment