diff --git a/CHANGELOG b/CHANGELOG index 8e298fde5..70c8e9bd9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,9 +1,10 @@ KeepassDX (2.5.0.0beta16) * New search in a single fragment * Search suggestions - * Fix read-only mode + * Added the display of usernames * Added translations - * Fix parcelable / toolbar + * Fix read-only mode + * Fix parcelable / toolbar / back KeepassDX (2.5.0.0beta15) * Read only mode diff --git a/app/src/androidTest/java/com/kunzisoft/keepass/tests/PwEntryTestV4.java b/app/src/androidTest/java/com/kunzisoft/keepass/tests/PwEntryTestV4.java index 15d26127a..bae5a731a 100644 --- a/app/src/androidTest/java/com/kunzisoft/keepass/tests/PwEntryTestV4.java +++ b/app/src/androidTest/java/com/kunzisoft/keepass/tests/PwEntryTestV4.java @@ -45,10 +45,10 @@ public class PwEntryTestV4 extends TestCase { entry.setBackgroupColor("blue"); entry.putProtectedBinary("key1", new ProtectedBinary(false, new byte[] {0,1})); - entry.setCustomIcon(new PwIconCustom(UUID.randomUUID(), new byte[0])); + entry.setIconCustom(new PwIconCustom(UUID.randomUUID(), new byte[0])); entry.setForegroundColor("red"); entry.addToHistory(new PwEntryV4()); - entry.setIcon(new PwIconStandard(5)); + entry.setIconStandard(new PwIconStandard(5)); entry.setOverrideURL("override"); entry.setParent(new PwGroupV4()); entry.addExtraField("key2", new ProtectedString(false, "value2")); diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.java b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.java index f591cb285..779cd1205 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.java +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.java @@ -47,7 +47,6 @@ import com.kunzisoft.keepass.database.ExtraFields; import com.kunzisoft.keepass.database.PwDatabase; import com.kunzisoft.keepass.database.PwEntry; import com.kunzisoft.keepass.database.security.ProtectedString; -import com.kunzisoft.keepass.icons.IconPackChooser; import com.kunzisoft.keepass.lock.LockingActivity; import com.kunzisoft.keepass.lock.LockingHideActivity; import com.kunzisoft.keepass.notifications.NotificationCopyingService; @@ -84,6 +83,8 @@ public class EntryActivity extends LockingHideActivity { private ClipboardHelper clipboardHelper; private boolean firstLaunchOfActivity; + private int iconColor; + public static void launch(Activity act, PwEntry pw, boolean readOnly) { if (LockingActivity.checkTimeIsAllowedOrFinish(act)) { Intent intent = new Intent(act, EntryActivity.class); @@ -125,6 +126,11 @@ public class EntryActivity extends LockingHideActivity { finish(); return; } + + // Retrieve the textColor to tint the icon + int[] attrs = {R.attr.textColorInverse}; + TypedArray ta = getTheme().obtainStyledAttributes(attrs); + iconColor = ta.getColor(0, Color.WHITE); // Refresh Menu contents in case onCreateMenuOptions was called before mEntry was set invalidateOptionsMenu(); @@ -312,15 +318,7 @@ public class EntryActivity extends LockingHideActivity { mEntry.startToManageFieldReferences(pm); // Assign title icon - if (IconPackChooser.getSelectedIconPack(this).tintable()) { - // Retrieve the textColor to tint the icon - int[] attrs = {R.attr.textColorInverse}; - TypedArray ta = getTheme().obtainStyledAttributes(attrs); - int iconColor = ta.getColor(0, Color.WHITE); - App.getDB().getDrawFactory().assignDatabaseIconTo(this, titleIconView, mEntry.getIcon(), true, iconColor); - } else { - App.getDB().getDrawFactory().assignDatabaseIconTo(this, titleIconView, mEntry.getIcon()); - } + db.getDrawFactory().assignDatabaseIconTo(this, titleIconView, mEntry.getIcon(), iconColor); // Assign title text titleView.setText(mEntry.getVisualTitle()); diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.java b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.java index d470c2685..8f21d8d51 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.java +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.java @@ -56,7 +56,6 @@ import com.kunzisoft.keepass.database.action.node.UpdateEntryRunnable; import com.kunzisoft.keepass.database.security.ProtectedString; import com.kunzisoft.keepass.dialogs.GeneratePasswordDialogFragment; import com.kunzisoft.keepass.dialogs.IconPickerDialogFragment; -import com.kunzisoft.keepass.icons.IconPackChooser; import com.kunzisoft.keepass.lock.LockingActivity; import com.kunzisoft.keepass.lock.LockingHideActivity; import com.kunzisoft.keepass.settings.PreferencesUtil; @@ -71,7 +70,7 @@ import java.util.UUID; import javax.annotation.Nullable; -import static com.kunzisoft.keepass.dialogs.IconPickerDialogFragment.UNDEFINED_ICON_ID; +import static com.kunzisoft.keepass.dialogs.IconPickerDialogFragment.KEY_ICON_STANDARD; public class EntryEditActivity extends LockingHideActivity implements IconPickerDialogFragment.IconPickerListener, @@ -89,10 +88,12 @@ public class EntryEditActivity extends LockingHideActivity public static final int ADD_OR_UPDATE_ENTRY_REQUEST_CODE = 7129; public static final String ADD_OR_UPDATE_ENTRY_KEY = "ADD_OR_UPDATE_ENTRY_KEY"; + private Database database; + protected PwEntry mEntry; protected PwEntry mCallbackNewEntry; protected boolean mIsNew; - protected int mSelectedIconID = UNDEFINED_ICON_ID; + protected PwIconStandard mSelectedIconStandard; // Views private ScrollView scrollView; @@ -143,7 +144,6 @@ public class EntryEditActivity extends LockingHideActivity setContentView(R.layout.entry_edit); Toolbar toolbar = findViewById(R.id.toolbar); - toolbar.setTitle(getString(R.string.app_name)); setSupportActionBar(toolbar); assert getSupportActionBar() != null; getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -162,8 +162,8 @@ public class EntryEditActivity extends LockingHideActivity entryExtraFieldsContainer = findViewById(R.id.advanced_container); // Likely the app has been killed exit the activity - Database db = App.getDB(); - if ( ! db.getLoaded() ) { + database = App.getDB(); + if ( ! database.getLoaded() ) { finish(); return; } @@ -176,18 +176,16 @@ public class EntryEditActivity extends LockingHideActivity TypedArray ta = getTheme().obtainStyledAttributes(attrs); iconColor = ta.getColor(0, Color.WHITE); - PwDatabase pm = db.getPwDatabase(); + mSelectedIconStandard = database.getPwDatabase().getIconFactory().getUnknownIcon(); + + PwDatabase pm = database.getPwDatabase(); if ( uuidBytes == null ) { PwGroupId parentId = intent.getParcelableExtra(KEY_PARENT); PwGroup parent = pm.getGroupByGroupId(parentId); - mEntry = db.createEntry(parent); + mEntry = database.createEntry(parent); mIsNew = true; // Add the default icon - if (IconPackChooser.getSelectedIconPack(this).tintable()) { - App.getDB().getDrawFactory().assignDefaultDatabaseIconTo(this, entryIconView, true, iconColor); - } else { - App.getDB().getDrawFactory().assignDefaultDatabaseIconTo(this, entryIconView); - } + database.getDrawFactory().assignDefaultDatabaseIconTo(this, entryIconView, iconColor); } else { UUID uuid = Types.bytestoUUID(uuidBytes); mEntry = pm.getEntryByUUIDId(uuid); @@ -195,8 +193,12 @@ public class EntryEditActivity extends LockingHideActivity fillData(); } + // Assign title + setTitle((mIsNew) ? getString(R.string.add_entry) : getString(R.string.edit_entry)); + // Retrieve the icon after an orientation change - if (savedInstanceState != null && savedInstanceState.containsKey(IconPickerDialogFragment.KEY_ICON_ID)) { + if (savedInstanceState != null + && savedInstanceState.containsKey(KEY_ICON_STANDARD)) { iconPicked(savedInstanceState); } @@ -259,9 +261,9 @@ public class EntryEditActivity extends LockingHideActivity EntryEditActivity act = EntryEditActivity.this; RunnableOnFinish task; if ( mIsNew ) { - task = new AddEntryRunnable(act, App.getDB(), mCallbackNewEntry, onFinish); + task = new AddEntryRunnable(act, database, mCallbackNewEntry, onFinish); } else { - task = new UpdateEntryRunnable(act, App.getDB(), mEntry, mCallbackNewEntry, onFinish); + task = new UpdateEntryRunnable(act, database, mEntry, mCallbackNewEntry, onFinish); } task.setUpdateProgressTaskStatus( new UpdateProgressTaskStatus(this, @@ -409,7 +411,7 @@ public class EntryEditActivity extends LockingHideActivity newEntry.setLastModificationTime(new PwDate()); newEntry.setTitle(entryTitleView.getText().toString()); - newEntry.setIcon(retrieveIcon()); + newEntry.setIconStandard(retrieveIcon()); newEntry.setUrl(entryUrlView.getText().toString()); newEntry.setUsername(entryUserNameView.getText().toString()); @@ -436,14 +438,14 @@ public class EntryEditActivity extends LockingHideActivity /** * Retrieve the icon by the selection, or the first icon in the list if the entry is new or the last one - * @return */ private PwIconStandard retrieveIcon() { - if(mSelectedIconID != UNDEFINED_ICON_ID) - return App.getDB().getPwDatabase().getIconFactory().getIcon(mSelectedIconID); + + if (!mSelectedIconStandard.isUnknown()) + return mSelectedIconStandard; else { if (mIsNew) { - return App.getDB().getPwDatabase().getIconFactory().getKeyIcon(); + return database.getPwDatabase().getIconFactory().getKeyIcon(); } else { // Keep previous icon, if no new one was selected @@ -475,13 +477,18 @@ public class EntryEditActivity extends LockingHideActivity return super.onOptionsItemSelected(item); } + private void assignIconView() { + database.getDrawFactory() + .assignDatabaseIconTo( + this, + entryIconView, + mEntry.getIcon(), + iconColor); + } + protected void fillData() { - if (IconPackChooser.getSelectedIconPack(this).tintable()) { - App.getDB().getDrawFactory().assignDatabaseIconTo(this, entryIconView, mEntry.getIcon(), true, iconColor); - } else { - App.getDB().getDrawFactory().assignDatabaseIconTo(this, entryIconView, mEntry.getIcon()); - } + assignIconView(); // Don't start the field reference manager, we want to see the raw ref mEntry.stopToManageFieldReferences(); @@ -515,14 +522,15 @@ public class EntryEditActivity extends LockingHideActivity @Override public void iconPicked(Bundle bundle) { - mSelectedIconID = bundle.getInt(IconPickerDialogFragment.KEY_ICON_ID); - entryIconView.setImageResource(IconPackChooser.getSelectedIconPack(this).iconToResId(mSelectedIconID)); + mSelectedIconStandard = bundle.getParcelable(KEY_ICON_STANDARD); + mEntry.setIconStandard(mSelectedIconStandard); + assignIconView(); } @Override protected void onSaveInstanceState(Bundle outState) { - if (mSelectedIconID != UNDEFINED_ICON_ID) { - outState.putInt(IconPickerDialogFragment.KEY_ICON_ID, mSelectedIconID); + if (!mSelectedIconStandard.isUnknown()) { + outState.putParcelable(KEY_ICON_STANDARD, mSelectedIconStandard); super.onSaveInstanceState(outState); } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.java b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.java index 89a156873..6b15ce0d9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.java +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.java @@ -62,6 +62,7 @@ import com.kunzisoft.keepass.database.PwDatabase; import com.kunzisoft.keepass.database.PwEntry; import com.kunzisoft.keepass.database.PwGroup; import com.kunzisoft.keepass.database.PwGroupId; +import com.kunzisoft.keepass.database.PwGroupV4; import com.kunzisoft.keepass.database.PwIcon; import com.kunzisoft.keepass.database.PwIconStandard; import com.kunzisoft.keepass.database.PwNode; @@ -79,7 +80,6 @@ import com.kunzisoft.keepass.dialogs.GroupEditDialogFragment; import com.kunzisoft.keepass.dialogs.IconPickerDialogFragment; import com.kunzisoft.keepass.dialogs.ReadOnlyDialog; import com.kunzisoft.keepass.dialogs.SortDialogFragment; -import com.kunzisoft.keepass.icons.IconPackChooser; import com.kunzisoft.keepass.lock.LockingActivity; import com.kunzisoft.keepass.password.AssignPasswordHelper; import com.kunzisoft.keepass.selection.EntrySelectionHelper; @@ -136,6 +136,8 @@ public class GroupActivity extends LockingActivity private SearchEntryCursorAdapter searchSuggestionAdapter; + private int iconColor; + // After a database creation public static void launch(Activity act) { launch(act, READ_ONLY_DEFAULT); @@ -267,6 +269,11 @@ public class GroupActivity extends LockingActivity nodeToMove = null; }); + // Retrieve the textColor to tint the icon + int[] attrs = {R.attr.textColorInverse}; + TypedArray ta = getTheme().obtainStyledAttributes(attrs); + iconColor = ta.getColor(0, Color.WHITE); + String fragmentTag = LIST_NODES_FRAGMENT_TAG; if (currentGroupIsASearch) fragmentTag = SEARCH_FRAGMENT_TAG; @@ -439,15 +446,7 @@ public class GroupActivity extends LockingActivity // Assign the group icon depending of IconPack or custom icon iconView.setVisibility(View.VISIBLE); if (mCurrentGroup != null) { - if (IconPackChooser.getSelectedIconPack(this).tintable()) { - // Retrieve the textColor to tint the icon - int[] attrs = {R.attr.textColorInverse}; - TypedArray ta = getTheme().obtainStyledAttributes(attrs); - int iconColor = ta.getColor(0, Color.WHITE); - App.getDB().getDrawFactory().assignDatabaseIconTo(this, iconView, mCurrentGroup.getIcon(), true, iconColor); - } else { - App.getDB().getDrawFactory().assignDatabaseIconTo(this, iconView, mCurrentGroup.getIcon()); - } + database.getDrawFactory().assignDatabaseIconTo(this, iconView, mCurrentGroup.getIcon(), iconColor); if (toolbar != null) { if (mCurrentGroup.containsParent()) @@ -706,7 +705,8 @@ public class GroupActivity extends LockingActivity // Refresh the elements assignGroupViewElements(); // Refresh suggestions to change preferences - searchSuggestionAdapter.reInit(this); + if (searchSuggestionAdapter != null) + searchSuggestionAdapter.reInit(this); } /** @@ -978,7 +978,7 @@ public class GroupActivity extends LockingActivity try { iconStandard = (PwIconStandard) icon; } catch (Exception ignored) {} // TODO custom icon - newGroup.setIcon(iconStandard); + newGroup.setIconStandard(iconStandard); // If group created save it in the database AddGroupRunnable addGroupRunnable = new AddGroupRunnable(this, @@ -1000,8 +1000,11 @@ public class GroupActivity extends LockingActivity updateGroup.setName(name); try { iconStandard = (PwIconStandard) icon; - } catch (Exception ignored) {} // TODO custom icon - updateGroup.setIcon(iconStandard); + updateGroup = ((PwGroupV4) oldGroupToUpdate).clone(); // TODO generalize + } catch (Exception e) { + e.printStackTrace(); + } // TODO custom icon + updateGroup.setIconStandard(iconStandard); if (listNodesFragment != null) listNodesFragment.removeNode(oldGroupToUpdate); diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.java b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.java index c8d3b1bec..f225bc629 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.java +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodeAdapter.java @@ -42,7 +42,6 @@ import com.kunzisoft.keepass.database.PwEntry; import com.kunzisoft.keepass.database.PwGroup; import com.kunzisoft.keepass.database.PwNode; import com.kunzisoft.keepass.database.SortNodeEnum; -import com.kunzisoft.keepass.icons.IconPackChooser; import com.kunzisoft.keepass.settings.PreferencesUtil; import com.kunzisoft.keepass.utils.Util; @@ -224,20 +223,16 @@ public class NodeAdapter extends RecyclerView.Adapter { public void onBindViewHolder(@NonNull BasicViewHolder holder, int position) { PwNode subNode = nodeSortedList.get(position); // Assign image - if (IconPackChooser.getSelectedIconPack(context).tintable()) { - int iconColor = Color.BLACK; - switch (subNode.getType()) { - case GROUP: - iconColor = iconGroupColor; - break; - case ENTRY: - iconColor = iconEntryColor; - break; - } - database.getDrawFactory().assignDatabaseIconTo(context, holder.icon, subNode.getIcon(), true, iconColor); - } else { - database.getDrawFactory().assignDatabaseIconTo(context, holder.icon, subNode.getIcon()); + int iconColor = Color.BLACK; + switch (subNode.getType()) { + case GROUP: + iconColor = iconGroupColor; + break; + case ENTRY: + iconColor = iconEntryColor; + break; } + database.getDrawFactory().assignDatabaseIconTo(context, holder.icon, subNode.getIcon(), iconColor); // Assign text holder.text.setText(subNode.getTitle()); // Assign click diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.java b/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.java index ff459b07e..1914d857f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.java +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/SearchEntryCursorAdapter.java @@ -36,7 +36,6 @@ import com.kunzisoft.keepass.database.PwEntry; import com.kunzisoft.keepass.database.PwIcon; import com.kunzisoft.keepass.database.PwIconFactory; import com.kunzisoft.keepass.database.cursor.EntryCursor; -import com.kunzisoft.keepass.icons.IconPackChooser; import com.kunzisoft.keepass.settings.PreferencesUtil; import java.util.UUID; @@ -102,16 +101,15 @@ public class SearchEntryCursorAdapter extends CursorAdapter { ViewHolder viewHolder = (ViewHolder) view.getTag(); // Assign image - if (IconPackChooser.getSelectedIconPack(context).tintable()) { - database.getDrawFactory().assignDatabaseIconTo(context, viewHolder.imageViewIcon, icon, true, iconColor); - } else { - database.getDrawFactory().assignDatabaseIconTo(context, viewHolder.imageViewIcon, icon); - } + database.getDrawFactory().assignDatabaseIconTo(context, viewHolder.imageViewIcon, icon, iconColor); + // Assign title String showTitle = PwEntry.getVisualTitle(false, title, username, url, uuid); viewHolder.textViewTitle.setText(showTitle); if (displayUsername && !username.isEmpty()) { viewHolder.textViewSubTitle.setText(String.format("(%s)", username)); + } else { + viewHolder.textViewSubTitle.setText(""); } } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/Database.java b/app/src/main/java/com/kunzisoft/keepass/database/Database.java index 68bd6a7a9..e08bec5b2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/Database.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/Database.java @@ -205,17 +205,21 @@ public class Database { // TODO real content provider if (!query.isEmpty()) { PwGroup searchResult = search(query, 6); + PwVersion version = getPwDatabase().getVersion(); for (int i=0; i < searchResult.numbersOfChildEntries(); i++) { PwEntry entry = searchResult.getChildEntryAt(i); - try { - switch (getPwDatabase().getVersion()) { - case V3: - cursor.addEntry((PwEntryV3) entry); - case V4: - cursor.addEntry((PwEntryV4) entry); + if (!entry.isMetaStream()) { // TODO metastream + try { + switch (version) { + case V3: + cursor.addEntry((PwEntryV3) entry); + continue; + case V4: + cursor.addEntry((PwEntryV4) entry); + } + } catch (Exception e) { + Log.e(TAG, "This version of PwEntry can't be added to the cursor", e); } - } catch (Exception e) { - Log.e(TAG, "This version of PwGroup can't be populated", e); } } } @@ -223,20 +227,22 @@ public class Database { } public void populateEntry(PwEntry pwEntry, EntryCursor cursor) { - // TODO invert field reference manager - pwEntry.startToManageFieldReferences(getPwDatabase()); PwIconFactory iconFactory = getPwDatabase().getIconFactory(); try { switch (getPwDatabase().getVersion()) { case V3: cursor.populateEntry((PwEntryV3) pwEntry, iconFactory); + break; case V4: + // TODO invert field reference manager + pwEntry.startToManageFieldReferences(getPwDatabase()); cursor.populateEntry((PwEntryV4) pwEntry, iconFactory); + pwEntry.stopToManageFieldReferences(); + break; } } catch (Exception e) { Log.e(TAG, "This version of PwGroup can't be populated", e); } - pwEntry.stopToManageFieldReferences(); } public void saveData(Context ctx) throws IOException, PwDbOutputException { @@ -515,18 +521,17 @@ public class Database { } public PwEntry createEntry(@Nullable PwGroup parent) { - PwEntry newPwEntry = null; try { switch (getPwDatabase().getVersion()) { case V3: - newPwEntry = new PwEntryV3((PwGroupV3) parent); + return new PwEntryV3((PwGroupV3) parent); case V4: - newPwEntry = new PwEntryV4((PwGroupV4) parent); + return new PwEntryV4((PwGroupV4) parent); } } catch (Exception e) { Log.e(TAG, "This version of PwEntry can't be created", e); } - return newPwEntry; + return null; } public PwGroup createGroup(PwGroup parent) { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwDatabase.java b/app/src/main/java/com/kunzisoft/keepass/database/PwDatabase.java index d8bc845b9..cd2a797ae 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwDatabase.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwDatabase.java @@ -35,7 +35,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -public abstract class PwDatabase, +public abstract class PwDatabase, PwEntryDB extends PwEntry> { public static final UUID UUID_ZERO = new UUID(0,0); diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwDatabaseV3.java b/app/src/main/java/com/kunzisoft/keepass/database/PwDatabaseV3.java index 072daa404..3c813614e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwDatabaseV3.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwDatabaseV3.java @@ -91,7 +91,7 @@ public class PwDatabaseV3 extends PwDatabase { PwGroupV3 group = createGroup(); group.setId(newGroupId()); group.setName(name); - group.setIcon(iconFactory.getIcon(iconId)); + group.setIconStandard(iconFactory.getIcon(iconId)); addGroupTo(group, parent); } @@ -176,7 +176,7 @@ public class PwDatabaseV3 extends PwDatabase { */ for (int i = 0; i < entries.size(); i++) { PwEntryV3 ent = entries.get(i); - if (ent.getGroupId() == parent.getGroupId()) + if (ent.getParent().getGroupId() == parent.getGroupId()) kids.add(ent); } return kids; diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV3.java b/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV3.java index 28051747d..6a93c7586 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV3.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV3.java @@ -77,8 +77,6 @@ public class PwEntryV3 extends PwEntry { private static final String PMS_ID_USER = "SYSTEM"; private static final String PMS_ID_URL = "$"; - // TODO Parent ID to remove - private int groupId; private String title; private String username; private byte[] password; @@ -94,12 +92,10 @@ public class PwEntryV3 extends PwEntry { public PwEntryV3(PwGroupV3 p) { construct(p); - groupId = ((PwGroupIdV3) this.parent.getId()).getId(); // TODO remove } public PwEntryV3(Parcel in) { super(in); - groupId = in.readInt(); title = in.readString(); username = in.readString(); in.readByteArray(password); @@ -112,7 +108,6 @@ public class PwEntryV3 extends PwEntry { @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); - dest.writeInt(groupId); dest.writeString(title); dest.writeString(username); dest.writeByteArray(password); @@ -136,7 +131,6 @@ public class PwEntryV3 extends PwEntry { protected void updateWith(PwEntryV3 source) { super.assign(source); - groupId = source.groupId; title = source.title; username = source.username; @@ -182,12 +176,9 @@ public class PwEntryV3 extends PwEntry { return newEntry; } - public int getGroupId() { - return groupId; - } - public void setGroupId(int groupId) { - this.groupId = groupId; + this.parent = new PwGroupV3(); + this.parent.setGroupId(groupId); } @Override diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV4.java b/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV4.java index 6170f3c5d..921a44141 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV4.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwEntryV4.java @@ -93,7 +93,8 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger { parentGroupLastMod = in.readParcelable(PwDate.class.getClassLoader()); customData = MemUtil.readStringParcelableMap(in); fields = in.readParcelable(ExtraFields.class.getClassLoader()); - binaries = MemUtil.readStringParcelableMap(in, ProtectedBinary.class); + // TODO binaries takes too much memory for parcelable + // binaries = MemUtil.readStringParcelableMap(in, ProtectedBinary.class); foregroundColor = in.readString(); backgroupColor = in.readString(); overrideURL = in.readString(); @@ -112,7 +113,7 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger { dest.writeParcelable(parentGroupLastMod, flags); MemUtil.writeStringParcelableMap(dest, customData); dest.writeParcelable(fields, flags); - MemUtil.writeStringParcelableMap(dest, flags, binaries); + // TODO MemUtil.writeStringParcelableMap(dest, flags, binaries); dest.writeString(foregroundColor); dest.writeString(backgroupColor); dest.writeString(overrideURL); @@ -241,14 +242,6 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger { fields.putProtectedString(key, value, protect); } - public PwIconCustom getCustomIcon() { - return customIcon; - } - - public void setCustomIcon(PwIconCustom icon) { - this.customIcon = icon; - } - public PwDate getLocationChanged() { return parentGroupLastMod; } @@ -275,15 +268,28 @@ public class PwEntryV4 extends PwEntry implements ITimeLogger { return decodeRefKey(mDecodeRef, STR_URL); } - @Override + @Override public PwIcon getIcon() { - if (customIcon == null || customIcon.getUUID().equals(PwDatabase.UUID_ZERO)) { + if (customIcon == null || customIcon.isUnknown()) { return super.getIcon(); } else { return customIcon; } } + public void setIconCustom(PwIconCustom icon) { + this.customIcon = icon; + } + + public PwIconCustom getIconCustom() { + return customIcon; + } + + public void setIconStandard(PwIconStandard icon) { + this.icon = icon; + this.customIcon = PwIconCustom.ZERO; + } + @Override public boolean allowExtraFields() { return true; diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwGroup.java b/app/src/main/java/com/kunzisoft/keepass/database/PwGroup.java index a494084a1..6f97bd489 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwGroup.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwGroup.java @@ -24,14 +24,14 @@ import android.os.Parcel; import java.util.ArrayList; import java.util.List; -public abstract class PwGroup - extends PwNode { +public abstract class PwGroup + extends PwNode { protected String name = ""; // TODO verify children not needed - transient protected List childGroups = new ArrayList<>(); - transient protected List childEntries = new ArrayList<>(); + transient protected List childGroups = new ArrayList<>(); + transient protected List childEntries = new ArrayList<>(); protected PwGroup() { super(); @@ -54,48 +54,48 @@ public abstract class PwGroup source) { + protected void assign(PwGroup source) { super.assign(source); name = source.name; } - public List getChildGroups() { + public List getChildGroups() { return childGroups; } - public List getChildEntries() { + public List getChildEntries() { return childEntries; } - public void setGroups(List groups) { + public void setGroups(List groups) { childGroups = groups; } - public void setEntries(List entries) { + public void setEntries(List entries) { childEntries = entries; } - public void addChildGroup(ChildGroup group) { + public void addChildGroup(GroupG group) { this.childGroups.add(group); } - public void addChildEntry(ChildEntry entry) { + public void addChildEntry(EntryE entry) { this.childEntries.add(entry); } - public ChildGroup getChildGroupAt(int number) { + public GroupG getChildGroupAt(int number) { return this.childGroups.get(number); } - public ChildEntry getChildEntryAt(int number) { + public EntryE getChildEntryAt(int number) { return this.childEntries.get(number); } - public void removeChildGroup(ChildGroup group) { + public void removeChildGroup(GroupG group) { this.childGroups.remove(group); } - public void removeChildEntry(ChildEntry entry) { + public void removeChildEntry(EntryE entry) { this.childEntries.remove(entry); } @@ -119,7 +119,7 @@ public abstract class PwGroup getDirectChildren() { List children = new ArrayList<>(); children.addAll(childGroups); - for(ChildEntry child : childEntries) { + for(EntryE child : childEntries) { if (!child.isMetaStream()) children.add(child); } @@ -154,15 +154,15 @@ public abstract class PwGroup groupHandler, - EntryHandler entryHandler) { + public boolean preOrderTraverseTree(GroupHandler groupHandler, + EntryHandler entryHandler) { if (entryHandler != null) { - for (ChildEntry entry : childEntries) { + for (EntryE entry : childEntries) { if (!entryHandler.operate(entry)) return false; } } - for (ChildGroup group : childGroups) { + for (GroupG group : childGroups) { if ((groupHandler != null) && !groupHandler.operate(group)) return false; group.preOrderTraverseTree(groupHandler, entryHandler); } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV3.java b/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV3.java index 5b14cac7e..2da96b601 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV3.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV3.java @@ -22,7 +22,7 @@ package com.kunzisoft.keepass.database; import android.os.Parcel; -public class PwGroupV3 extends PwGroup { +public class PwGroupV3 extends PwGroup { // for tree traversing private int groupId; diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV4.java b/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV4.java index 959a741af..e1055c3ce 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV4.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwGroupV4.java @@ -27,7 +27,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -public class PwGroupV4 extends PwGroup implements ITimeLogger { +public class PwGroupV4 extends PwGroup implements ITimeLogger { public static final boolean DEFAULT_SEARCHING_ENABLED = true; @@ -65,7 +65,7 @@ public class PwGroupV4 extends PwGroup implemen customIcon = in.readParcelable(PwIconCustom.class.getClassLoader()); usageCount = in.readLong(); parentGroupLastMod = in.readParcelable(PwDate.class.getClassLoader()); - customData = MemUtil.readStringParcelableMap(in); + // TODO customData = MemUtil.readStringParcelableMap(in); expires = in.readByte() != 0; notes = in.readString(); isExpanded = in.readByte() != 0; @@ -84,7 +84,7 @@ public class PwGroupV4 extends PwGroup implemen dest.writeParcelable(customIcon, flags); dest.writeLong(usageCount); dest.writeParcelable(parentGroupLastMod, flags); - MemUtil.writeStringParcelableMap(dest, customData); + // TODO MemUtil.writeStringParcelableMap(dest, customData); dest.writeByte((byte) (expires ? 1 : 0)); dest.writeString(notes); dest.writeByte((byte) (isExpanded ? 1 : 0)); @@ -169,14 +169,6 @@ public class PwGroupV4 extends PwGroup implemen this.uuid = uuid; } - public PwIconCustom getCustomIcon() { - return customIcon; - } - - public void setCustomIcon(PwIconCustom icon) { - this.customIcon = icon; - } - @Override public PwGroupId getId() { return new PwGroupIdV4(uuid); @@ -232,6 +224,19 @@ public class PwGroupV4 extends PwGroup implemen } } + public PwIconCustom getIconCustom() { + return customIcon; + } + + public void setIconCustom(PwIconCustom icon) { + this.customIcon = icon; + } + + public void setIconStandard(PwIconStandard icon) { // TODO Encapsulate with PwEntryV4 + this.icon = icon; + this.customIcon = PwIconCustom.ZERO; + } + public void putCustomData(String key, String value) { customData.put(key, value); } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwIconCustom.java b/app/src/main/java/com/kunzisoft/keepass/database/PwIconCustom.java index a1d9c132b..a92d9cdad 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwIconCustom.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwIconCustom.java @@ -27,7 +27,7 @@ public class PwIconCustom extends PwIcon { public static final PwIconCustom ZERO = new PwIconCustom(PwDatabase.UUID_ZERO, new byte[0]); private final UUID uuid; - private byte[] imageData; + transient private byte[] imageData; public PwIconCustom(UUID uuid, byte[] data) { super(); @@ -44,7 +44,8 @@ public class PwIconCustom extends PwIcon { protected PwIconCustom(Parcel in) { super(in); uuid = (UUID) in.readSerializable(); - in.readByteArray(imageData); + // TODO Take too much memories + // in.readByteArray(imageData); } @Override @@ -67,7 +68,7 @@ public class PwIconCustom extends PwIcon { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeSerializable(uuid); - dest.writeByteArray(imageData); + // Too big for a parcelable dest.writeByteArray(imageData); } public static final Creator CREATOR = new Creator() { @@ -82,7 +83,7 @@ public class PwIconCustom extends PwIcon { } }; - @Override + @Override public int hashCode() { final int prime = 31; int result = 1; diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwIconFactory.java b/app/src/main/java/com/kunzisoft/keepass/database/PwIconFactory.java index 740341ea8..843e1bb71 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwIconFactory.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwIconFactory.java @@ -37,6 +37,10 @@ public class PwIconFactory { */ private ReferenceMap customCache = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK); + public PwIconStandard getUnknownIcon() { + return getIcon(PwIconStandard.UNKNOWN); + } + public PwIconStandard getKeyIcon() { return getIcon(PwIconStandard.KEY); } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/PwNode.java b/app/src/main/java/com/kunzisoft/keepass/database/PwNode.java index cd54eef1f..97d69e80b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/PwNode.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/PwNode.java @@ -132,14 +132,14 @@ public abstract class PwNode implements ISmallTimeLogger * @return Visual icon */ public PwIcon getIcon() { - return icon; + return getIconStandard(); } public PwIconStandard getIconStandard() { return icon; } - public void setIcon(PwIconStandard icon) { + public void setIconStandard(PwIconStandard icon) { this.icon = icon; } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteGroupRunnable.java b/app/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteGroupRunnable.java index 80e1986d1..b41a6b414 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteGroupRunnable.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteGroupRunnable.java @@ -31,15 +31,15 @@ import java.util.List; public class DeleteGroupRunnable extends ActionNodeDatabaseRunnable { - private PwGroup mGroupToDelete; + private PwGroup mGroupToDelete; private PwGroup mParent; private boolean mRecycle; - public DeleteGroupRunnable(Context ctx, Database db, PwGroup group, AfterActionNodeOnFinish finish) { + public DeleteGroupRunnable(Context ctx, Database db, PwGroup group, AfterActionNodeOnFinish finish) { this(ctx, db, group, finish, false); } - public DeleteGroupRunnable(Context ctx, Database db, PwGroup group, AfterActionNodeOnFinish finish, boolean dontSave) { + public DeleteGroupRunnable(Context ctx, Database db, PwGroup group, AfterActionNodeOnFinish finish, boolean dontSave) { super(ctx, db, finish, dontSave); mGroupToDelete = group; } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.java b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.java index 693cd042d..041d1e789 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/cursor/EntryCursor.java @@ -67,8 +67,8 @@ public class EntryCursor extends MatrixCursor { entry.getUUID().getLeastSignificantBits(), entry.getTitle(), entry.getIconStandard().getIconId(), - entry.getCustomIcon().getUUID().getMostSignificantBits(), - entry.getCustomIcon().getUUID().getLeastSignificantBits(), + entry.getIconCustom().getUUID().getMostSignificantBits(), + entry.getIconCustom().getUUID().getLeastSignificantBits(), entry.getUsername(), entry.getPassword(), entry.getUrl(), @@ -88,7 +88,7 @@ public class EntryCursor extends MatrixCursor { pwEntry.setTitle(getString(getColumnIndex(EntryCursor.COLUMN_INDEX_TITLE))); PwIconStandard iconStandard = iconFactory.getIcon(getInt(getColumnIndex(EntryCursor.COLUMN_INDEX_ICON_STANDARD))); - pwEntry.setIcon(iconStandard); + pwEntry.setIconStandard(iconStandard); pwEntry.setUsername(getString(getColumnIndex(EntryCursor.COLUMN_INDEX_USERNAME))); pwEntry.setPassword(getString(getColumnIndex(EntryCursor.COLUMN_INDEX_PASSWORD))); @@ -107,7 +107,7 @@ public class EntryCursor extends MatrixCursor { PwIconCustom iconCustom = iconFactory.getIcon( new UUID(getLong(getColumnIndex(EntryCursor.COLUMN_INDEX_ICON_CUSTOM_UUID_MOST_SIGNIFICANT_BITS)), getLong(getColumnIndex(EntryCursor.COLUMN_INDEX_ICON_CUSTOM_UUID_LEAST_SIGNIFICANT_BITS)))); - pwEntry.setCustomIcon(iconCustom); + pwEntry.setIconCustom(iconCustom); // Retrieve extra fields if (extraFieldCursor.moveToFirst()) { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV3.java b/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV3.java index 2d0a33744..0c507e45b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV3.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV3.java @@ -316,7 +316,7 @@ public class ImporterV3 extends Importer { grp.setExpiryTime(new PwDate(buf, offset)); break; case 0x0007 : - grp.setIcon(db.getIconFactory().getIcon(LEDataInputStream.readInt(buf, offset))); + grp.setIconStandard(db.getIconFactory().getIcon(LEDataInputStream.readInt(buf, offset))); break; case 0x0008 : grp.setLevel(LEDataInputStream.readUShort(buf, offset)); @@ -353,7 +353,7 @@ public class ImporterV3 extends Importer { iconId = 0; } - ent.setIcon(db.getIconFactory().getIcon(iconId)); + ent.setIconStandard(db.getIconFactory().getIcon(iconId)); break; case 0x0004 : ent.setTitle(Types.readCString(buf, offset)); diff --git a/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV4.java b/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV4.java index 6ec3d2e29..7719019a4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV4.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/load/ImporterV4.java @@ -556,9 +556,9 @@ public class ImporterV4 extends Importer { } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemNotes) ) { ctxGroup.setNotes(ReadString(xpp)); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemIcon) ) { - ctxGroup.setIcon(db.getIconFactory().getIcon((int)ReadUInt(xpp, 0))); + ctxGroup.setIconStandard(db.getIconFactory().getIcon((int)ReadUInt(xpp, 0))); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemCustomIconID) ) { - ctxGroup.setCustomIcon(db.getIconFactory().getIcon(ReadUuid(xpp))); + ctxGroup.setIconCustom(db.getIconFactory().getIcon(ReadUuid(xpp))); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemTimes) ) { return SwitchContext(ctx, KdbContext.GroupTimes, xpp); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemIsExpanded) ) { @@ -611,9 +611,9 @@ public class ImporterV4 extends Importer { if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemUuid) ) { ctxEntry.setUUID(ReadUuid(xpp)); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemIcon) ) { - ctxEntry.setIcon(db.getIconFactory().getIcon((int)ReadUInt(xpp, 0))); + ctxEntry.setIconStandard(db.getIconFactory().getIcon((int)ReadUInt(xpp, 0))); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemCustomIconID) ) { - ctxEntry.setCustomIcon(db.getIconFactory().getIcon(ReadUuid(xpp))); + ctxEntry.setIconCustom(db.getIconFactory().getIcon(ReadUuid(xpp))); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemFgColor) ) { ctxEntry.setForegroundColor(ReadString(xpp)); } else if ( name.equalsIgnoreCase(PwDatabaseV4XML.ElemBgColor) ) { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/save/PwDbV4Output.java b/app/src/main/java/com/kunzisoft/keepass/database/save/PwDbV4Output.java index 214af00b6..53b4f5701 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/save/PwDbV4Output.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/save/PwDbV4Output.java @@ -352,8 +352,8 @@ public class PwDbV4Output extends PwDbOutput { writeObject(PwDatabaseV4XML.ElemNotes, group.getNotes()); writeObject(PwDatabaseV4XML.ElemIcon, group.getIconStandard().getIconId()); - if (!group.getCustomIcon().equals(PwIconCustom.ZERO)) { - writeObject(PwDatabaseV4XML.ElemCustomIconID, group.getCustomIcon().getUUID()); + if (!group.getIconCustom().equals(PwIconCustom.ZERO)) { + writeObject(PwDatabaseV4XML.ElemCustomIconID, group.getIconCustom().getUUID()); } writeList(PwDatabaseV4XML.ElemTimes, group); @@ -377,8 +377,8 @@ public class PwDbV4Output extends PwDbOutput { writeObject(PwDatabaseV4XML.ElemUuid, entry.getUUID()); writeObject(PwDatabaseV4XML.ElemIcon, entry.getIconStandard().getIconId()); - if (!entry.getCustomIcon().equals(PwIconCustom.ZERO)) { - writeObject(PwDatabaseV4XML.ElemCustomIconID, entry.getCustomIcon().getUUID()); + if (!entry.getIconCustom().equals(PwIconCustom.ZERO)) { + writeObject(PwDatabaseV4XML.ElemCustomIconID, entry.getIconCustom().getUUID()); } writeObject(PwDatabaseV4XML.ElemFgColor, entry.getForegroundColor()); diff --git a/app/src/main/java/com/kunzisoft/keepass/database/save/PwEntryOutputV3.java b/app/src/main/java/com/kunzisoft/keepass/database/save/PwEntryOutputV3.java index c9ba3feda..291b60a46 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/save/PwEntryOutputV3.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/save/PwEntryOutputV3.java @@ -79,7 +79,7 @@ public class PwEntryOutputV3 { // Group ID mOS.write(GROUPID_FIELD_TYPE); mOS.write(LONG_FOUR); - mOS.write(LEDataOutputStream.writeIntBuf(mPE.getGroupId())); + mOS.write(LEDataOutputStream.writeIntBuf(mPE.getParent().getGroupId())); // Image ID mOS.write(IMAGEID_FIELD_TYPE); diff --git a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchDbHelper.java b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchDbHelper.java index 91351aa69..288011b10 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchDbHelper.java +++ b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchDbHelper.java @@ -42,7 +42,7 @@ import java.util.Locale; import java.util.Queue; public class SearchDbHelper, - PwGroupSearch extends PwGroup, + PwGroupSearch extends PwGroup, PwEntrySearch extends PwEntry> { private final Context mCtx; diff --git a/app/src/main/java/com/kunzisoft/keepass/dialogs/GroupEditDialogFragment.java b/app/src/main/java/com/kunzisoft/keepass/dialogs/GroupEditDialogFragment.java index 8151b4312..3e58ccb71 100644 --- a/app/src/main/java/com/kunzisoft/keepass/dialogs/GroupEditDialogFragment.java +++ b/app/src/main/java/com/kunzisoft/keepass/dialogs/GroupEditDialogFragment.java @@ -35,9 +35,9 @@ import android.widget.Toast; import com.kunzisoft.keepass.R; import com.kunzisoft.keepass.app.App; +import com.kunzisoft.keepass.database.Database; import com.kunzisoft.keepass.database.PwGroup; import com.kunzisoft.keepass.database.PwIcon; -import com.kunzisoft.keepass.icons.IconPackChooser; import static com.kunzisoft.keepass.dialogs.GroupEditDialogFragment.EditGroupDialogAction.CREATION; import static com.kunzisoft.keepass.dialogs.GroupEditDialogFragment.EditGroupDialogAction.UPDATE; @@ -49,9 +49,11 @@ public class GroupEditDialogFragment extends DialogFragment public static final String TAG_CREATE_GROUP = "TAG_CREATE_GROUP"; public static final String KEY_NAME = "KEY_NAME"; - public static final String KEY_ICON_ID = "KEY_ICON_ID"; + public static final String KEY_ICON = "KEY_ICON"; public static final String KEY_ACTION_ID = "KEY_ACTION_ID"; + private Database database; + private EditGroupListener editGroupListener; private EditGroupDialogAction editGroupDialogAction; @@ -59,6 +61,7 @@ public class GroupEditDialogFragment extends DialogFragment private PwIcon iconGroup; private ImageView iconButton; + private int iconColor; public enum EditGroupDialogAction { CREATION, UPDATE, NONE; @@ -79,7 +82,7 @@ public class GroupEditDialogFragment extends DialogFragment public static GroupEditDialogFragment build(PwGroup group) { Bundle bundle = new Bundle(); bundle.putString(KEY_NAME, group.getName()); - bundle.putParcelable(KEY_ICON_ID, group.getIcon()); + bundle.putParcelable(KEY_ICON, group.getIcon()); bundle.putInt(KEY_ACTION_ID, UPDATE.ordinal()); GroupEditDialogFragment fragment = new GroupEditDialogFragment(); fragment.setArguments(bundle); @@ -112,20 +115,21 @@ public class GroupEditDialogFragment extends DialogFragment // 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); + iconColor = ta.getColor(0, Color.WHITE); // Init elements + database = App.getDB(); editGroupDialogAction = EditGroupDialogAction.NONE; nameGroup = ""; - iconGroup = App.getDB().getPwDatabase().getIconFactory().getFolderIcon(); + iconGroup = database.getPwDatabase().getIconFactory().getFolderIcon(); if (savedInstanceState != null && savedInstanceState.containsKey(KEY_ACTION_ID) && savedInstanceState.containsKey(KEY_NAME) - && savedInstanceState.containsKey(KEY_ICON_ID)) { + && savedInstanceState.containsKey(KEY_ICON)) { editGroupDialogAction = getActionFromOrdinal(savedInstanceState.getInt(KEY_ACTION_ID)); nameGroup = savedInstanceState.getString(KEY_NAME); - iconGroup = savedInstanceState.getParcelable(KEY_ICON_ID); + iconGroup = savedInstanceState.getParcelable(KEY_ICON); } else { @@ -135,30 +139,16 @@ public class GroupEditDialogFragment extends DialogFragment if (getArguments() != null && getArguments().containsKey(KEY_NAME) - && getArguments().containsKey(KEY_ICON_ID)) { + && getArguments().containsKey(KEY_ICON)) { nameGroup = getArguments().getString(KEY_NAME); - iconGroup = getArguments().getParcelable(KEY_ICON_ID); + iconGroup = getArguments().getParcelable(KEY_ICON); } } // 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); - } + assignIconView(); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(root) @@ -195,18 +185,26 @@ public class GroupEditDialogFragment extends DialogFragment return builder.create(); } + private void assignIconView() { + database.getDrawFactory() + .assignDatabaseIconTo( + getContext(), + iconButton, + iconGroup, + iconColor); + } + @Override public void iconPicked(Bundle bundle) { - int selectedIconID = bundle.getInt(IconPickerDialogFragment.KEY_ICON_ID); - iconButton.setImageResource(IconPackChooser.getSelectedIconPack(getContext()).iconToResId(selectedIconID)); - iconGroup = App.getDB().getPwDatabase().getIconFactory().getIcon(selectedIconID); + iconGroup = bundle.getParcelable(IconPickerDialogFragment.KEY_ICON_STANDARD); + assignIconView(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putInt(KEY_ACTION_ID, editGroupDialogAction.ordinal()); outState.putString(KEY_NAME, nameGroup); - outState.putParcelable(KEY_ICON_ID, iconGroup); + outState.putParcelable(KEY_ICON, iconGroup); super.onSaveInstanceState(outState); } diff --git a/app/src/main/java/com/kunzisoft/keepass/dialogs/IconPickerDialogFragment.java b/app/src/main/java/com/kunzisoft/keepass/dialogs/IconPickerDialogFragment.java index bb791d871..83ba32474 100644 --- a/app/src/main/java/com/kunzisoft/keepass/dialogs/IconPickerDialogFragment.java +++ b/app/src/main/java/com/kunzisoft/keepass/dialogs/IconPickerDialogFragment.java @@ -37,14 +37,16 @@ import android.widget.GridView; import android.widget.ImageView; import com.kunzisoft.keepass.R; +import com.kunzisoft.keepass.database.PwIconStandard; import com.kunzisoft.keepass.icons.IconPack; import com.kunzisoft.keepass.icons.IconPackChooser; import com.kunzisoft.keepass.stylish.StylishActivity; public class IconPickerDialogFragment extends DialogFragment { - public static final String KEY_ICON_ID = "icon_id"; - public static final int UNDEFINED_ICON_ID = -1; + + public static final String KEY_ICON_STANDARD = "KEY_ICON_STANDARD"; + private IconPickerListener iconPickerListener; private IconPack iconPack; @@ -85,7 +87,7 @@ public class IconPickerDialogFragment extends DialogFragment { currIconGridView.setOnItemClickListener((parent, v, position, id) -> { Bundle bundle = new Bundle(); - bundle.putInt(KEY_ICON_ID, position); + bundle.putParcelable(KEY_ICON_STANDARD, new PwIconStandard(position)); iconPickerListener.iconPicked(bundle); dismiss(); }); diff --git a/app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.java b/app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.java index aacccf67f..068989a0b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.java +++ b/app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.java @@ -65,52 +65,50 @@ public class IconDrawableFactory { private ReferenceMap standardIconMap = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK); /** - * Assign a default database icon to an ImageView + * Assign a default database icon to an ImageView and tint it if needed * * @param context Context to build the drawable - * @param iv ImageView that will host the drawable + * @param iconView ImageView that will host the drawable + * @param tintColor Use this color to tint tintable icon */ - public void assignDefaultDatabaseIconTo(Context context, ImageView iv) { - assignDefaultDatabaseIconTo(context, iv, false, Color.WHITE); + public void assignDefaultDatabaseIconTo(Context context, ImageView iconView, int tintColor) { + if (IconPackChooser.getSelectedIconPack(context).tintable()) { + assignDrawableTo(context, + iconView, + IconPackChooser.getSelectedIconPack(context).getDefaultIconId(), + true, + tintColor); + } else { + assignDrawableTo(context, + iconView, + IconPackChooser.getSelectedIconPack(context).getDefaultIconId(), + false, + Color.WHITE); + } } /** - * Assign a default database icon to an ImageView and tint it + * Assign a database icon to an ImageView and tint it if needed * * @param context Context to build the drawable - * @param iv ImageView that will host the drawable - */ - public void assignDefaultDatabaseIconTo(Context context, ImageView iv, boolean tint, int tintColor) { - assignDrawableTo(context, iv, IconPackChooser.getSelectedIconPack(context).getDefaultIconId(), tint, tintColor); - } - - /** - * Assign a database icon to an ImageView - * - * @param context Context to build the drawable - * @param iv ImageView that will host the drawable + * @param iconView ImageView that will host the drawable * @param icon The icon from the database + * @param tintColor Use this color to tint tintable icon */ - public void assignDatabaseIconTo(Context context, ImageView iv, PwIcon icon) { - assignDatabaseIconTo(context, iv, icon, false, Color.WHITE); + public void assignDatabaseIconTo(Context context, ImageView iconView, PwIcon icon, int tintColor) { + if (IconPackChooser.getSelectedIconPack(context).tintable()) { + assignDrawableToImageView(getIconDrawable(context, icon, true, tintColor), + iconView, + true, + tintColor); + } else { + assignDrawableToImageView(getIconDrawable(context, icon, true, tintColor), + iconView, + false, + Color.WHITE); + } } - /** - * Assign a database icon to an ImageView and tint it - * - * @param context Context to build the drawable - * @param imageView ImageView that will host the drawable - * @param icon The icon from the database - * @param tint true will tint the drawable with tintColor - * @param tintColor Use this color if tint is true - */ - public void assignDatabaseIconTo(Context context, ImageView imageView, PwIcon icon, boolean tint, int tintColor) { - assignDrawableToImageView(getIconDrawable(context, icon, tint, tintColor), - imageView, - tint, - tintColor); - } - /** * Assign an image by its resourceId to an ImageView and tint it * diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a7ab7891a..a22b4257f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,6 +23,7 @@ KeePass DX is an Android implementation of the KeePass password manager. Accept Add entry + Edit entry Add group Add string Encryption diff --git a/fastlane/metadata/android/en-US/changelogs/16.txt b/fastlane/metadata/android/en-US/changelogs/16.txt index 9f575e211..cc47d3299 100644 --- a/fastlane/metadata/android/en-US/changelogs/16.txt +++ b/fastlane/metadata/android/en-US/changelogs/16.txt @@ -1,5 +1,6 @@ * New search in a single fragment * Search suggestions - * Fix read-only mode + * Added the display of usernames * Added translations - * Fix parcelable / toolbar \ No newline at end of file + * Fix read-only mode + * Fix parcelable / toolbar / back \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/16.txt b/fastlane/metadata/android/fr-FR/changelogs/16.txt index 7fe60696d..cbdd6844c 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/16.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/16.txt @@ -1,5 +1,6 @@ * Nouvelle recherche dans un seul fragment * Suggestions de recherche - * Correction du mode lecture seule + * Ajout de l'affichage des noms d'utilisateurs * Ajout de traductions - * Correction de parcelable / de barre de navigation \ No newline at end of file + * Correction du mode lecture seule + * Correction de parcelable / barre de navigation / retour \ No newline at end of file