Add selection mode and fix read only

This commit is contained in:
J-Jamet
2019-02-23 14:39:03 +01:00
parent 5f051ed2a9
commit 953e63f55d
17 changed files with 170 additions and 144 deletions

View File

@@ -101,7 +101,7 @@
android:name="com.kunzisoft.keepass.activities.GroupActivity"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="adjustPan"
android:launchMode="singleTop">
android:launchMode="singleTask">
<meta-data
android:name="android.app.default_searchable"
android:value="com.kunzisoft.keepass.search.SearchResults"

View File

@@ -89,7 +89,7 @@ public class EntryActivity extends LockingHideActivity {
if (TimeoutHelper.INSTANCE.checkTimeAndLockIfTimeout(activity)) {
Intent intent = new Intent(activity, EntryActivity.class);
intent.putExtra(KEY_ENTRY, Types.UUIDtoBytes(pw.getUUID()));
ReadOnlyHelper.putReadOnlyInIntent(intent, readOnly);
ReadOnlyHelper.INSTANCE.putReadOnlyInIntent(intent, readOnly);
activity.startActivityForResult(intent, EntryEditActivity.ADD_OR_UPDATE_ENTRY_REQUEST_CODE);
}
}

View File

@@ -1,4 +1,4 @@
package com.kunzisoft.keepass.selection
package com.kunzisoft.keepass.activities
import android.app.assist.AssistStructure
import android.content.Intent
@@ -8,11 +8,20 @@ import com.kunzisoft.keepass.autofill.AutofillHelper
object EntrySelectionHelper {
private const val EXTRA_ENTRY_SELECTION_MODE = "com.kunzisoft.keepass.extra.ENTRY_SELECTION_MODE"
private const val DEFAULT_ENTRY_SELECTION_MODE = false
fun addEntrySelectionModeExtraInIntent(intent: Intent) {
intent.putExtra(EXTRA_ENTRY_SELECTION_MODE, true)
}
fun removeEntrySelectionModeFromIntent(intent: Intent) {
intent.removeExtra(EXTRA_ENTRY_SELECTION_MODE)
}
fun retrieveEntrySelectionModeFromIntent(intent: Intent): Boolean {
return intent.getBooleanExtra(EXTRA_ENTRY_SELECTION_MODE, DEFAULT_ENTRY_SELECTION_MODE)
}
fun doEntrySelectionAction(intent: Intent,
standardAction: () -> Unit,
keyboardAction: () -> Unit,
@@ -25,7 +34,7 @@ object EntrySelectionHelper {
}
}
if (assistStructure == null) {
if (intent.getBooleanExtra(EXTRA_ENTRY_SELECTION_MODE, false)) {
if (intent.getBooleanExtra(EXTRA_ENTRY_SELECTION_MODE, DEFAULT_ENTRY_SELECTION_MODE)) {
intent.removeExtra(EXTRA_ENTRY_SELECTION_MODE)
keyboardAction.invoke()
} else {

View File

@@ -86,7 +86,6 @@ import com.kunzisoft.keepass.magikeyboard.KeyboardEntryNotificationService;
import com.kunzisoft.keepass.magikeyboard.KeyboardHelper;
import com.kunzisoft.keepass.magikeyboard.MagikIME;
import com.kunzisoft.keepass.password.AssignPasswordHelper;
import com.kunzisoft.keepass.selection.EntrySelectionHelper;
import com.kunzisoft.keepass.settings.PreferencesUtil;
import com.kunzisoft.keepass.tasks.SaveDatabaseProgressTaskDialogFragment;
import com.kunzisoft.keepass.tasks.UIToastTask;
@@ -97,8 +96,6 @@ import com.kunzisoft.keepass.view.AddNodeButtonView;
import net.cachapa.expandablelayout.ExpandableLayout;
import static com.kunzisoft.keepass.activities.ReadOnlyHelper.READ_ONLY_DEFAULT;
public class GroupActivity extends LockingActivity
implements GroupEditDialogFragment.EditGroupListener,
IconPickerDialogFragment.IconPickerListener,
@@ -122,6 +119,7 @@ public class GroupActivity extends LockingActivity
private ExpandableLayout toolbarPasteExpandableLayout;
private Toolbar toolbarPaste;
private ImageView iconView;
private TextView modeTitleView;
private AddNodeButtonView addNodeButtonView;
private TextView groupNameView;
@@ -147,7 +145,7 @@ public class GroupActivity extends LockingActivity
if (group != null) {
intent.putExtra(GROUP_ID_KEY, group.getId());
}
ReadOnlyHelper.putReadOnlyInIntent(intent, readOnly);
ReadOnlyHelper.INSTANCE.putReadOnlyInIntent(intent, readOnly);
intentBuildLauncher.launchActivity(intent);
}
}
@@ -159,7 +157,7 @@ public class GroupActivity extends LockingActivity
*/
public static void launch(Activity activity) {
launch(activity, READ_ONLY_DEFAULT);
launch(activity, PreferencesUtil.enableReadOnlyDatabase(activity));
}
public static void launch(Activity activity, boolean readOnly) {
@@ -178,15 +176,11 @@ public class GroupActivity extends LockingActivity
* Keyboard Launch
* -------------------------
*/
// TODO implement pre search to directly open the direct group
public static void launchForKeyboardSelection(Activity activity, boolean readOnly) {
launchForKeyboardSelection(activity, null, readOnly);
}
public static void launchForKeyboardSelection(Activity activity, PwGroup group, boolean readOnly) {
// TODO implement pre search to directly open the direct group
TimeoutHelper.INSTANCE.recordTime(activity);
buildAndLaunchIntent(activity, group, readOnly,
buildAndLaunchIntent(activity, null, readOnly,
(intent) -> KeyboardHelper.INSTANCE.startActivityForKeyboardSelection(activity, intent));
}
@@ -195,19 +189,14 @@ public class GroupActivity extends LockingActivity
* Autofill Launch
* -------------------------
*/
// TODO implement pre search to directly open the direct group
@RequiresApi(api = Build.VERSION_CODES.O)
public static void launchForAutofillResult(Activity activity, @NonNull AssistStructure assistStructure, boolean readOnly) {
launchForAutofillResult(activity, null, assistStructure, readOnly);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public static void launchForAutofillResult(Activity activity, PwGroup group, @NonNull AssistStructure assistStructure, boolean readOnly) {
// TODO implement pre search to directly open the direct group
TimeoutHelper.INSTANCE.recordTime(activity);
buildAndLaunchIntent(activity, group, readOnly,
buildAndLaunchIntent(activity, null, readOnly,
(intent) -> AutofillHelper.INSTANCE.startActivityForAutofillResult(activity, intent, assistStructure));
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -230,15 +219,11 @@ public class GroupActivity extends LockingActivity
groupNameView = findViewById(R.id.group_name);
toolbarPasteExpandableLayout = findViewById(R.id.expandable_toolbar_paste_layout);
toolbarPaste = findViewById(R.id.toolbar_paste);
modeTitleView = findViewById(R.id.mode_title_view);
// Focus view to reinitialize timeout
resetAppTimeoutWhenViewFocusedOrChanged(addNodeButtonView);
invalidateOptionsMenu();
// Get arg from intent or instance state
setReadOnly(ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrIntent(savedInstanceState, getIntent()));
// Retrieve elements after an orientation change
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(OLD_GROUP_TO_UPDATE_KEY))
@@ -380,7 +365,6 @@ public class GroupActivity extends LockingActivity
outState.putParcelable(NODE_TO_COPY_KEY, nodeToCopy);
if (nodeToMove != null)
outState.putParcelable(NODE_TO_MOVE_KEY, nodeToMove);
ReadOnlyHelper.onSaveInstanceState(outState, getReadOnly());
super.onSaveInstanceState(outState);
}
@@ -459,6 +443,13 @@ public class GroupActivity extends LockingActivity
}
}
// Show selection mode message if needed
if (getSelectionMode()) {
modeTitleView.setVisibility(View.VISIBLE);
} else {
modeTitleView.setVisibility(View.GONE);
}
// Show button if allowed
if (addNodeButtonView != null) {
@@ -513,6 +504,8 @@ public class GroupActivity extends LockingActivity
GroupActivity.this,
KeyboardEntryNotificationService.class));
}
// Consume the selection mode
EntrySelectionHelper.INSTANCE.removeEntrySelectionModeFromIntent(getIntent());
moveTaskToBack(true);
return null;
},
@@ -856,41 +849,42 @@ public class GroupActivity extends LockingActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search, menu);
if (!getReadOnly())
inflater.inflate(R.menu.database_master_key, menu);
inflater.inflate(R.menu.database_lock, menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search, menu);
inflater.inflate(R.menu.database_lock, menu);
if (!getReadOnly())
inflater.inflate(R.menu.database_master_key, menu);
if (!getSelectionMode()) {
inflater.inflate(R.menu.default_menu, menu);
MenuUtil.INSTANCE.contributionMenuInflater(inflater, menu);
}
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
assert searchManager != null;
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
assert searchManager != null;
MenuItem searchItem = menu.findItem(R.id.menu_search);
SearchView searchView = null;
if (searchItem != null) {
searchView = (SearchView) searchItem.getActionView();
}
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, GroupActivity.class)));
searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
searchView.setSuggestionsAdapter(searchSuggestionAdapter);
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionClick(int position) {
onNodeClick(searchSuggestionAdapter.getEntryFromPosition(position));
return true;
}
MenuItem searchItem = menu.findItem(R.id.menu_search);
SearchView searchView = null;
if (searchItem != null) {
searchView = (SearchView) searchItem.getActionView();
}
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, GroupActivity.class)));
searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
searchView.setSuggestionsAdapter(searchSuggestionAdapter);
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionClick(int position) {
onNodeClick(searchSuggestionAdapter.getEntryFromPosition(position));
return true;
}
@Override
public boolean onSuggestionSelect(int position) {
return true;
}
});
}
MenuUtil.INSTANCE.contributionMenuInflater(inflater, menu);
inflater.inflate(R.menu.default_menu, menu);
@Override
public boolean onSuggestionSelect(int position) {
return true;
}
});
}
super.onCreateOptionsMenu(menu);
@@ -900,7 +894,7 @@ public class GroupActivity extends LockingActivity
return true;
}
@Override
@Override
public void startActivity(Intent intent) {
// Get the intent, verify the action and get the query

View File

@@ -58,7 +58,7 @@ public class ListNodesFragment extends StylishFragment implements
bundle.putParcelable(GROUP_KEY, group);
}
bundle.putBoolean(IS_SEARCH, isASearch);
ReadOnlyHelper.putReadOnlyInBundle(bundle, readOnly);
ReadOnlyHelper.INSTANCE.putReadOnlyInBundle(bundle, readOnly);
ListNodesFragment listNodesFragment = new ListNodesFragment();
listNodesFragment.setArguments(bundle);
return listNodesFragment;
@@ -99,7 +99,7 @@ public class ListNodesFragment extends StylishFragment implements
if ( getActivity() != null ) {
setHasOptionsMenu(true);
readOnly = ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState, getArguments());
readOnly = ReadOnlyHelper.INSTANCE.retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState, getArguments());
if (getArguments() != null) {
// Contains all the group in element
@@ -127,7 +127,7 @@ public class ListNodesFragment extends StylishFragment implements
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
ReadOnlyHelper.onSaveInstanceState(outState, readOnly);
ReadOnlyHelper.INSTANCE.onSaveInstanceState(outState, readOnly);
super.onSaveInstanceState(outState);
}

View File

@@ -1,61 +0,0 @@
package com.kunzisoft.keepass.activities;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.kunzisoft.keepass.settings.PreferencesUtil;
public class ReadOnlyHelper {
public static final String READ_ONLY_KEY = "READ_ONLY_KEY";
public static final boolean READ_ONLY_DEFAULT = false;
public static boolean retrieveReadOnlyFromInstanceStateOrPreference(Context context, Bundle savedInstanceState) {
boolean readOnly;
if (savedInstanceState != null
&& savedInstanceState.containsKey(READ_ONLY_KEY)) {
readOnly = savedInstanceState.getBoolean(READ_ONLY_KEY);
} else {
readOnly = PreferencesUtil.enableReadOnlyDatabase(context);
}
return readOnly;
}
public static boolean retrieveReadOnlyFromInstanceStateOrArguments(Bundle savedInstanceState, Bundle arguments) {
boolean readOnly = READ_ONLY_DEFAULT;
if (savedInstanceState != null
&& savedInstanceState.containsKey(READ_ONLY_KEY)) {
readOnly = savedInstanceState.getBoolean(READ_ONLY_KEY);
} else if (arguments != null
&& arguments.containsKey(READ_ONLY_KEY)) {
readOnly = arguments.getBoolean(READ_ONLY_KEY);
}
return readOnly;
}
public static boolean retrieveReadOnlyFromInstanceStateOrIntent(Bundle savedInstanceState, Intent intent) {
boolean readOnly = READ_ONLY_DEFAULT;
if (savedInstanceState != null
&& savedInstanceState.containsKey(READ_ONLY_KEY)) {
readOnly = savedInstanceState.getBoolean(READ_ONLY_KEY);
} else {
if (intent != null)
readOnly = intent.getBooleanExtra(READ_ONLY_KEY, READ_ONLY_DEFAULT);
}
return readOnly;
}
public static void putReadOnlyInIntent(Intent intent, boolean readOnly) {
intent.putExtra(READ_ONLY_KEY, readOnly);
}
public static void putReadOnlyInBundle(Bundle bundle, boolean readOnly) {
bundle.putBoolean(READ_ONLY_KEY, readOnly);
}
public static void onSaveInstanceState(Bundle outState, boolean readOnly) {
outState.putBoolean(READ_ONLY_KEY, readOnly);
}
}

View File

@@ -0,0 +1,59 @@
package com.kunzisoft.keepass.activities
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.kunzisoft.keepass.settings.PreferencesUtil
object ReadOnlyHelper {
private const val READ_ONLY_KEY = "READ_ONLY_KEY"
const val READ_ONLY_DEFAULT = false
fun retrieveReadOnlyFromIntent(intent: Intent): Boolean {
return intent.getBooleanExtra(READ_ONLY_KEY, READ_ONLY_DEFAULT)
}
fun retrieveReadOnlyFromInstanceStateOrPreference(context: Context, savedInstanceState: Bundle?): Boolean {
return if (savedInstanceState != null && savedInstanceState.containsKey(READ_ONLY_KEY)) {
savedInstanceState.getBoolean(READ_ONLY_KEY)
} else {
PreferencesUtil.enableReadOnlyDatabase(context)
}
}
fun retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState: Bundle?, arguments: Bundle?): Boolean {
var readOnly = READ_ONLY_DEFAULT
if (savedInstanceState != null && savedInstanceState.containsKey(READ_ONLY_KEY)) {
readOnly = savedInstanceState.getBoolean(READ_ONLY_KEY)
} else if (arguments != null && arguments.containsKey(READ_ONLY_KEY)) {
readOnly = arguments.getBoolean(READ_ONLY_KEY)
}
return readOnly
}
fun retrieveReadOnlyFromInstanceStateOrIntent(savedInstanceState: Bundle?, intent: Intent?): Boolean {
var readOnly = READ_ONLY_DEFAULT
if (savedInstanceState != null && savedInstanceState.containsKey(READ_ONLY_KEY)) {
readOnly = savedInstanceState.getBoolean(READ_ONLY_KEY)
} else {
if (intent != null)
readOnly = intent.getBooleanExtra(READ_ONLY_KEY, READ_ONLY_DEFAULT)
}
return readOnly
}
fun putReadOnlyInIntent(intent: Intent, readOnly: Boolean) {
intent.putExtra(READ_ONLY_KEY, readOnly)
}
fun putReadOnlyInBundle(bundle: Bundle, readOnly: Boolean) {
bundle.putBoolean(READ_ONLY_KEY, readOnly)
}
fun onSaveInstanceState(outState: Bundle, readOnly: Boolean) {
outState.putBoolean(READ_ONLY_KEY, readOnly)
}
}

View File

@@ -28,6 +28,7 @@ import android.content.IntentFilter
import android.os.Bundle
import android.util.Log
import android.view.View
import com.kunzisoft.keepass.activities.EntrySelectionHelper
import com.kunzisoft.keepass.activities.ReadOnlyHelper
import com.kunzisoft.keepass.app.App
import com.kunzisoft.keepass.settings.PreferencesUtil
@@ -51,7 +52,12 @@ abstract class LockingActivity : StylishActivity() {
private var lockReceiver: LockReceiver? = null
private var exitLock: Boolean = false
// Force readOnly if Entry Selection mode
protected var readOnly: Boolean = false
get() {
return field || selectionMode
}
protected var selectionMode: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -75,8 +81,6 @@ abstract class LockingActivity : StylishActivity() {
}
exitLock = false
readOnly = false
readOnly = ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrIntent(savedInstanceState, intent)
}
@@ -93,6 +97,9 @@ abstract class LockingActivity : StylishActivity() {
override fun onResume() {
super.onResume()
// To refresh when back to normal workflow from selection workflow
selectionMode = EntrySelectionHelper.retrieveEntrySelectionModeFromIntent(intent)
if (timeoutEnable) {
// End activity if database not loaded
if (!App.getDB().loaded) {
@@ -108,6 +115,8 @@ abstract class LockingActivity : StylishActivity() {
if (!exitLock)
TimeoutHelper.recordTime(this)
}
invalidateOptionsMenu()
}
override fun onSaveInstanceState(outState: Bundle) {

View File

@@ -31,6 +31,7 @@ import android.support.v7.app.AppCompatActivity
import com.kunzisoft.keepass.activities.GroupActivity
import com.kunzisoft.keepass.app.App
import com.kunzisoft.keepass.fileselect.FileSelectActivity
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper
@RequiresApi(api = Build.VERSION_CODES.O)
@@ -41,7 +42,7 @@ class AutoFillLauncherActivity : AppCompatActivity() {
val assistStructure = AutofillHelper.retrieveAssistStructure(intent)
if (assistStructure != null) {
if (App.getDB().loaded && TimeoutHelper.checkTime(this))
GroupActivity.launchForAutofillResult(this, assistStructure, true)
GroupActivity.launchForAutofillResult(this, assistStructure, PreferencesUtil.enableReadOnlyDatabase(this))
else {
FileSelectActivity.launchForAutofillResult(this, assistStructure)
}

View File

@@ -32,8 +32,8 @@ import android.view.autofill.AutofillManager
import android.view.autofill.AutofillValue
import android.widget.RemoteViews
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.EntrySelectionHelper
import com.kunzisoft.keepass.database.PwEntry
import com.kunzisoft.keepass.selection.EntrySelectionHelper
import java.util.*

View File

@@ -58,7 +58,7 @@ import com.kunzisoft.keepass.dialogs.CreateFileDialogFragment;
import com.kunzisoft.keepass.magikeyboard.KeyboardHelper;
import com.kunzisoft.keepass.password.AssignPasswordHelper;
import com.kunzisoft.keepass.password.PasswordActivity;
import com.kunzisoft.keepass.selection.EntrySelectionHelper;
import com.kunzisoft.keepass.activities.EntrySelectionHelper;
import com.kunzisoft.keepass.settings.PreferencesUtil;
import com.kunzisoft.keepass.stylish.StylishActivity;
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment;

View File

@@ -2,7 +2,7 @@ package com.kunzisoft.keepass.magikeyboard
import android.app.Activity
import android.content.Intent
import com.kunzisoft.keepass.selection.EntrySelectionHelper
import com.kunzisoft.keepass.activities.EntrySelectionHelper
object KeyboardHelper {

View File

@@ -5,6 +5,7 @@ import android.support.v7.app.AppCompatActivity
import com.kunzisoft.keepass.activities.GroupActivity
import com.kunzisoft.keepass.app.App
import com.kunzisoft.keepass.fileselect.FileSelectActivity
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper
class KeyboardLauncherActivity : AppCompatActivity() {
@@ -15,7 +16,7 @@ class KeyboardLauncherActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
if (App.getDB().loaded && TimeoutHelper.checkTime(this))
GroupActivity.launchForKeyboardSelection(this, true)
GroupActivity.launchForKeyboardSelection(this, PreferencesUtil.enableReadOnlyDatabase(this))
else {
// Pass extra to get entry
FileSelectActivity.launchForKeyboardSelection(this)

View File

@@ -71,7 +71,7 @@ import com.kunzisoft.keepass.fingerprint.FingerPrintAnimatedVector;
import com.kunzisoft.keepass.fingerprint.FingerPrintExplanationDialog;
import com.kunzisoft.keepass.fingerprint.FingerPrintHelper;
import com.kunzisoft.keepass.magikeyboard.KeyboardHelper;
import com.kunzisoft.keepass.selection.EntrySelectionHelper;
import com.kunzisoft.keepass.activities.EntrySelectionHelper;
import com.kunzisoft.keepass.settings.PreferencesUtil;
import com.kunzisoft.keepass.stylish.StylishActivity;
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment;
@@ -243,7 +243,7 @@ public class PasswordActivity extends StylishActivity
checkboxKeyfileView = findViewById(R.id.keyfile_checkox);
checkboxDefaultDatabaseView = findViewById(R.id.default_database);
readOnly = ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrPreference(this, savedInstanceState);
readOnly = ReadOnlyHelper.INSTANCE.retrieveReadOnlyFromInstanceStateOrPreference(this, savedInstanceState);
View browseView = findViewById(R.id.browse_button);
keyFileHelper = new KeyFileHelper(PasswordActivity.this);
@@ -334,7 +334,7 @@ public class PasswordActivity extends StylishActivity
@Override
protected void onSaveInstanceState(Bundle outState) {
ReadOnlyHelper.onSaveInstanceState(outState, readOnly);
ReadOnlyHelper.INSTANCE.onSaveInstanceState(outState, readOnly);
super.onSaveInstanceState(outState);
}

View File

@@ -90,7 +90,7 @@ public class NestedSettingsFragment extends PreferenceFragmentCompat
// supply arguments to bundle.
Bundle args = new Bundle();
args.putInt(TAG_KEY, key.ordinal());
ReadOnlyHelper.putReadOnlyInBundle(args, databaseReadOnly);
ReadOnlyHelper.INSTANCE.putReadOnlyInBundle(args, databaseReadOnly);
fragment.setArguments(args);
return fragment;
}
@@ -124,7 +124,7 @@ public class NestedSettingsFragment extends PreferenceFragmentCompat
key = getArguments().getInt(TAG_KEY);
database = App.getDB();
databaseReadOnly = ReadOnlyHelper.retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState, getArguments());
databaseReadOnly = ReadOnlyHelper.INSTANCE.retrieveReadOnlyFromInstanceStateOrArguments(savedInstanceState, getArguments());
databaseReadOnly = database.isReadOnly() || databaseReadOnly;
// Load the preferences from an XML resource
@@ -552,7 +552,7 @@ public class NestedSettingsFragment extends PreferenceFragmentCompat
@Override
public void onSaveInstanceState(Bundle outState) {
ReadOnlyHelper.onSaveInstanceState(outState, databaseReadOnly);
ReadOnlyHelper.INSTANCE.onSaveInstanceState(outState, databaseReadOnly);
super.onSaveInstanceState(outState);
}

View File

@@ -98,13 +98,26 @@
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/nodes_list_fragment_container"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_below="@+id/toolbar"
android:background="?android:attr/windowBackground" />
android:layout_below="@+id/toolbar">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/mode_title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="6dp"
android:gravity="center_horizontal"
android:background="?attr/colorAccent"
android:text="@string/selection_mode"/>
<FrameLayout
android:id="@+id/nodes_list_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground" />
</LinearLayout>
<com.kunzisoft.keepass.view.AddNodeButtonView
android:id="@+id/add_node_button"

View File

@@ -157,6 +157,7 @@
<string name="read_only">Write-protected</string>
<string name="read_only_warning">KeePass DX needs write permission in order to change anything in your database.</string>
<string name="read_only_kitkat_warning">Starting with Android KitKat, some devices no longer allow apps to write to the SD card.</string>
<string name="selection_mode">Selection mode</string>
<string name="recentfile_title">Recent file history</string>
<string name="recentfile_summary">Remember recent filenames</string>
<string name="remember_keyfile_summary">Remembers the location of databases keyfiles</string>