Fix crash when orientation change after a modification

This commit is contained in:
J-Jamet
2018-04-21 15:44:17 +02:00
parent fb1b90a281
commit 1d065e7bc5
2 changed files with 102 additions and 64 deletions

View File

@@ -53,6 +53,7 @@ import com.kunzisoft.keepass.database.Database;
import com.kunzisoft.keepass.database.PwEntry;
import com.kunzisoft.keepass.database.PwGroup;
import com.kunzisoft.keepass.database.PwGroupId;
import com.kunzisoft.keepass.database.PwIcon;
import com.kunzisoft.keepass.database.PwIconStandard;
import com.kunzisoft.keepass.database.PwNode;
import com.kunzisoft.keepass.database.SortNodeEnum;
@@ -87,6 +88,7 @@ public class GroupActivity extends ListNodesActivity
private static final String TAG = "Group Activity:";
private static final String OLD_GROUP_TO_UPDATE_KEY = "OLD_GROUP_TO_UPDATE_KEY";
private PwGroup oldGroupToUpdate;
public static void launch(Activity act) {
@@ -140,6 +142,11 @@ public class GroupActivity extends ListNodesActivity
return;
}
if (savedInstanceState != null
&& savedInstanceState.containsKey(OLD_GROUP_TO_UPDATE_KEY)) {
oldGroupToUpdate = (PwGroup) savedInstanceState.getSerializable(OLD_GROUP_TO_UPDATE_KEY);
}
// Construct main view
setContentView(getLayoutInflater().inflate(R.layout.list_nodes_with_add_button, null));
@@ -525,9 +532,9 @@ public class GroupActivity extends ListNodesActivity
@Override
public void approveEditGroup(GroupEditDialogFragment.EditGroupDialogAction action,
String name,
int iconId) {
Database database = App.getDB(); // TODO encapsulate iconFactory
PwIconStandard icon = database.getPwDatabase().getIconFactory().getIcon(iconId);
PwIcon icon) {
Database database = App.getDB();
PwIconStandard iconStandard = database.getPwDatabase().getIconFactory().getFirstIcon();
switch (action) {
case CREATION:
@@ -535,7 +542,10 @@ public class GroupActivity extends ListNodesActivity
// Build the group
PwGroup newGroup = database.createGroup(mCurrentGroup);
newGroup.setName(name);
newGroup.setIcon(icon);
try {
iconStandard = (PwIconStandard) icon;
} catch (Exception e) {} // TODO custom icon
newGroup.setIcon(iconStandard);
new ProgressTask(this,
new AddGroup(this,
@@ -547,29 +557,41 @@ public class GroupActivity extends ListNodesActivity
break;
case UPDATE:
// If update add new elements
PwGroup updateGroup = oldGroupToUpdate.clone();
updateGroup.setName(name);
updateGroup.setIcon(icon);
if (oldGroupToUpdate != null) {
PwGroup updateGroup = oldGroupToUpdate.clone();
updateGroup.setName(name);
try {
iconStandard = (PwIconStandard) icon;
} catch (Exception e) {} // TODO custom icon
updateGroup.setIcon(iconStandard);
mAdapter.removeNode(oldGroupToUpdate);
// If group update
new ProgressTask(this,
new UpdateGroup(this,
App.getDB(),
oldGroupToUpdate,
updateGroup,
new AfterUpdateNode(new Handler())),
R.string.saving_database)
.run();
mAdapter.removeNode(oldGroupToUpdate);
// If group update
new ProgressTask(this,
new UpdateGroup(this,
App.getDB(),
oldGroupToUpdate,
updateGroup,
new AfterUpdateNode(new Handler())),
R.string.saving_database)
.run();
}
break;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putSerializable(OLD_GROUP_TO_UPDATE_KEY, oldGroupToUpdate);
super.onSaveInstanceState(outState);
}
@Override
public void cancelEditGroup(GroupEditDialogFragment.EditGroupDialogAction action,
String name,
int iconId) {
PwIcon iconId) {
// Do nothing here
}

View File

@@ -41,6 +41,7 @@ import com.kunzisoft.keepass.icons.IconPackChooser;
import static com.kunzisoft.keepass.dialogs.GroupEditDialogFragment.EditGroupDialogAction.CREATION;
import static com.kunzisoft.keepass.dialogs.GroupEditDialogFragment.EditGroupDialogAction.UPDATE;
import static com.kunzisoft.keepass.dialogs.GroupEditDialogFragment.EditGroupDialogAction.getActionFromOrdinal;
public class GroupEditDialogFragment extends DialogFragment
implements IconPickerDialogFragment.IconPickerListener {
@@ -51,12 +52,13 @@ public class GroupEditDialogFragment extends DialogFragment
public static final String KEY_ICON_ID = "KEY_ICON_ID";
public static final String KEY_ACTION_ID = "KEY_ACTION_ID";
private EditGroupDialogAction editGroupDialogAction = EditGroupDialogAction.NONE;
private EditGroupListener editGroupListener;
private EditGroupDialogAction editGroupDialogAction;
private String nameGroup;
private PwIcon iconGroup;
private ImageView iconButton;
private int mSelectedIconID;
public enum EditGroupDialogAction {
CREATION, UPDATE, NONE;
@@ -107,52 +109,57 @@ public class GroupEditDialogFragment extends DialogFragment
TextView nameField = root.findViewById(R.id.group_name);
iconButton = root.findViewById(R.id.icon_button);
if (getArguments() != null
&& getArguments().containsKey(KEY_ACTION_ID))
editGroupDialogAction = EditGroupDialogAction.getActionFromOrdinal(getArguments().getInt(KEY_ACTION_ID));
// Retrieve the textColor to tint the icon
int[] attrs = {android.R.attr.textColorPrimary};
TypedArray ta = getActivity().getTheme().obtainStyledAttributes(attrs);
int iconColor = ta.getColor(0, Color.WHITE);
if (getArguments() != null
&& getArguments().containsKey(KEY_NAME)
&& getArguments().containsKey(KEY_ICON_ID)) {
nameField.setText(getArguments().getString(KEY_NAME));
// populate the icon
if (IconPackChooser.getSelectedIconPack(getContext()).tintable()) {
App.getDB().getDrawFactory()
.assignDatabaseIconTo(
getContext(),
iconButton,
(PwIcon) getArguments().getSerializable(KEY_ICON_ID),
true,
iconColor);
} else {
App.getDB().getDrawFactory()
.assignDatabaseIconTo(
getContext(),
iconButton,
(PwIcon) getArguments().getSerializable(KEY_ICON_ID));
}
// Init elements
editGroupDialogAction = EditGroupDialogAction.NONE;
nameGroup = "";
iconGroup = App.getDB().getPwDatabase().getIconFactory().getFirstIcon();
if (savedInstanceState != null
&& savedInstanceState.containsKey(KEY_ACTION_ID)
&& savedInstanceState.containsKey(KEY_NAME)
&& savedInstanceState.containsKey(KEY_ICON_ID)) {
editGroupDialogAction = getActionFromOrdinal(savedInstanceState.getInt(KEY_ACTION_ID));
nameGroup = savedInstanceState.getString(KEY_NAME);
iconGroup = (PwIcon) savedInstanceState.getSerializable(KEY_ICON_ID);
} else {
// populate the icon with the default one if not found
if (IconPackChooser.getSelectedIconPack(getContext()).tintable()) {
App.getDB().getDrawFactory()
.assignDefaultDatabaseIconTo(
getContext(),
iconButton,
true,
iconColor);
} else {
App.getDB().getDrawFactory()
.assignDefaultDatabaseIconTo(
getContext(),
iconButton);
if (getArguments() != null
&& getArguments().containsKey(KEY_ACTION_ID))
editGroupDialogAction = EditGroupDialogAction.getActionFromOrdinal(getArguments().getInt(KEY_ACTION_ID));
if (getArguments() != null
&& getArguments().containsKey(KEY_NAME)
&& getArguments().containsKey(KEY_ICON_ID)) {
nameGroup = getArguments().getString(KEY_NAME);
iconGroup = (PwIcon) getArguments().getSerializable(KEY_ICON_ID);
}
}
// populate the name
nameField.setText(nameGroup);
// populate the icon
if (IconPackChooser.getSelectedIconPack(getContext()).tintable()) {
App.getDB().getDrawFactory()
.assignDatabaseIconTo(
getContext(),
iconButton,
iconGroup,
true,
iconColor);
} else {
App.getDB().getDrawFactory()
.assignDatabaseIconTo(
getContext(),
iconButton,
iconGroup);
}
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(root)
.setPositiveButton(android.R.string.ok, (dialog, id) -> {
@@ -161,7 +168,7 @@ public class GroupEditDialogFragment extends DialogFragment
editGroupListener.approveEditGroup(
editGroupDialogAction,
name,
mSelectedIconID);
iconGroup);
GroupEditDialogFragment.this.getDialog().cancel();
}
@@ -174,7 +181,7 @@ public class GroupEditDialogFragment extends DialogFragment
editGroupListener.cancelEditGroup(
editGroupDialogAction,
name,
mSelectedIconID);
iconGroup);
GroupEditDialogFragment.this.getDialog().cancel();
});
@@ -190,12 +197,21 @@ public class GroupEditDialogFragment extends DialogFragment
@Override
public void iconPicked(Bundle bundle) {
mSelectedIconID = bundle.getInt(IconPickerDialogFragment.KEY_ICON_ID);
iconButton.setImageResource(IconPackChooser.getSelectedIconPack(getContext()).iconToResId(mSelectedIconID));
int selectedIconID = bundle.getInt(IconPickerDialogFragment.KEY_ICON_ID);
iconButton.setImageResource(IconPackChooser.getSelectedIconPack(getContext()).iconToResId(selectedIconID));
iconGroup = App.getDB().getPwDatabase().getIconFactory().getIcon(selectedIconID);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(KEY_ACTION_ID, editGroupDialogAction.ordinal());
outState.putString(KEY_NAME, nameGroup);
outState.putSerializable(KEY_ICON_ID, iconGroup);
super.onSaveInstanceState(outState);
}
public interface EditGroupListener {
void approveEditGroup(EditGroupDialogAction action, String name, int selectedIconId);
void cancelEditGroup(EditGroupDialogAction action, String name, int selectedIconId);
void approveEditGroup(EditGroupDialogAction action, String name, PwIcon selectedIcon);
void cancelEditGroup(EditGroupDialogAction action, String name, PwIcon selectedIcon);
}
}