mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Update database alias
This commit is contained in:
@@ -48,7 +48,7 @@ import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
|
||||
import com.kunzisoft.keepass.activities.helpers.OpenFileHelper
|
||||
import com.kunzisoft.keepass.activities.stylish.StylishActivity
|
||||
import com.kunzisoft.keepass.adapters.FileDatabaseHistoryAdapter
|
||||
import com.kunzisoft.keepass.adapters.FileInfo
|
||||
import com.kunzisoft.keepass.utils.FileInfo
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryEntity
|
||||
import com.kunzisoft.keepass.autofill.AutofillHelper
|
||||
@@ -165,6 +165,9 @@ class FileDatabaseSelectActivity : StylishActivity(),
|
||||
mAdapterDatabaseHistory = FileDatabaseHistoryAdapter(this)
|
||||
mAdapterDatabaseHistory?.setOnItemClickListener(this)
|
||||
mAdapterDatabaseHistory?.setFileSelectClearListener(this)
|
||||
mAdapterDatabaseHistory?.setSaveAliasListener { fileDatabaseHistoryWithNewAlias ->
|
||||
mFileDatabaseHistory?.addOrUpdateFileDatabaseHistory(fileDatabaseHistoryWithNewAlias)
|
||||
}
|
||||
fileDatabaseHistoryRecyclerView.adapter = mAdapterDatabaseHistory
|
||||
|
||||
// Load default database if not an orientation change
|
||||
@@ -379,7 +382,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
|
||||
runOnUiThread {
|
||||
if (result.isSuccess) {
|
||||
// Add database to recent files
|
||||
mFileDatabaseHistory?.addDatabaseUri(fileURI)
|
||||
mFileDatabaseHistory?.addOrUpdateDatabaseUri(fileURI)
|
||||
mAdapterDatabaseHistory?.notifyDataSetChanged()
|
||||
updateFileListVisibility()
|
||||
GroupActivity.launch(this@FileDatabaseSelectActivity)
|
||||
|
||||
@@ -51,6 +51,7 @@ import com.kunzisoft.keepass.activities.helpers.OpenFileHelper
|
||||
import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper
|
||||
import com.kunzisoft.keepass.activities.lock.LockingActivity
|
||||
import com.kunzisoft.keepass.activities.stylish.StylishActivity
|
||||
import com.kunzisoft.keepass.utils.FileDatabaseInfo
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
|
||||
import com.kunzisoft.keepass.autofill.AutofillHelper
|
||||
import com.kunzisoft.keepass.database.action.LoadDatabaseRunnable
|
||||
@@ -67,7 +68,6 @@ import com.kunzisoft.keepass.utils.UriUtil
|
||||
import com.kunzisoft.keepass.view.FingerPrintInfoView
|
||||
import com.kunzisoft.keepass.view.asError
|
||||
import kotlinx.android.synthetic.main.activity_password.*
|
||||
import java.io.File
|
||||
import java.io.FileNotFoundException
|
||||
import java.lang.Exception
|
||||
import java.lang.ref.WeakReference
|
||||
@@ -230,12 +230,10 @@ class PasswordActivity : StylishActivity() {
|
||||
mDatabaseFileUri = databaseFileUri
|
||||
|
||||
// Define title
|
||||
val dbUriString = databaseFileUri?.toString() ?: ""
|
||||
if (dbUriString.isNotEmpty()) {
|
||||
if (PreferencesUtil.isFullFilePathEnable(this))
|
||||
filenameView?.text = dbUriString
|
||||
else
|
||||
filenameView?.text = File(databaseFileUri!!.path!!).name // TODO Encapsulate
|
||||
databaseFileUri?.let {
|
||||
FileDatabaseInfo(this, it).retrieveDatabaseTitle { title ->
|
||||
filenameView?.text = title
|
||||
}
|
||||
}
|
||||
|
||||
// Define Key File text
|
||||
@@ -251,7 +249,7 @@ class PasswordActivity : StylishActivity() {
|
||||
newDefaultFileName = databaseFileUri?.toString() ?: newDefaultFileName
|
||||
}
|
||||
|
||||
prefs?.edit()?.apply() {
|
||||
prefs?.edit()?.apply {
|
||||
putString(KEY_DEFAULT_FILENAME, newDefaultFileName)
|
||||
apply()
|
||||
}
|
||||
|
||||
@@ -25,11 +25,15 @@ import android.support.annotation.ColorInt
|
||||
import android.support.v7.widget.RecyclerView
|
||||
import android.util.TypedValue
|
||||
import android.view.*
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import android.widget.ViewSwitcher
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryEntity
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.FileDatabaseInfo
|
||||
import com.kunzisoft.keepass.utils.FileInfo
|
||||
|
||||
class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
: RecyclerView.Adapter<FileDatabaseHistoryAdapter.FileDatabaseHistoryViewHolder>() {
|
||||
@@ -37,6 +41,7 @@ class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
private val inflater: LayoutInflater = LayoutInflater.from(context)
|
||||
private var fileItemOpenListener: FileItemOpenListener? = null
|
||||
private var fileSelectClearListener: FileSelectClearListener? = null
|
||||
private var saveAliasListener: ((FileDatabaseHistoryEntity)->Unit)? = null
|
||||
|
||||
private val listDatabaseFiles = ArrayList<FileDatabaseHistoryEntity>()
|
||||
|
||||
@@ -64,9 +69,9 @@ class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: FileDatabaseHistoryViewHolder, position: Int) {
|
||||
// Get info from position
|
||||
val fileHistoryEntity = listDatabaseFiles[position]
|
||||
|
||||
val fileDatabaseInfo = FileInfo(context, fileHistoryEntity.databaseUri)
|
||||
val fileDatabaseInfo = FileDatabaseInfo(context, fileHistoryEntity.databaseUri)
|
||||
|
||||
// Context menu creation
|
||||
holder.fileContainer.setOnCreateContextMenuListener(ContextMenuBuilder(fileDatabaseInfo))
|
||||
@@ -75,12 +80,7 @@ class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
holder.fileContainer.setOnClickListener(FileItemClickListener(fileHistoryEntity))
|
||||
|
||||
// File alias
|
||||
val aliasText = fileHistoryEntity.databaseAlias
|
||||
holder.fileAlias.text = when {
|
||||
aliasText.isNotEmpty() -> aliasText
|
||||
PreferencesUtil.isFullFilePathEnable(context) -> Uri.decode(fileDatabaseInfo.fileUri.toString())
|
||||
else -> fileDatabaseInfo.fileName
|
||||
}
|
||||
holder.fileAlias.text = fileDatabaseInfo.retrieveDatabaseAlias(fileHistoryEntity.databaseAlias)
|
||||
|
||||
// File path
|
||||
holder.filePath.text = Uri.decode(fileDatabaseInfo.fileUri.toString())
|
||||
@@ -101,15 +101,40 @@ class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
//This line hides or shows the layout in question
|
||||
holder.fileExpandContainer.visibility = if (isExpanded) View.VISIBLE else View.GONE
|
||||
|
||||
if (isExpanded)
|
||||
mPreviousExpandedPosition = position
|
||||
if (mPreviousExpandedPosition != position) {
|
||||
holder.fileInformation.setOnClickListener {
|
||||
mExpandedPosition = if (isExpanded) -1 else position
|
||||
notifyItemChanged(mPreviousExpandedPosition)
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
// Save alias modification
|
||||
holder.fileAliasCloseButton.setOnClickListener {
|
||||
// Change the alias
|
||||
fileHistoryEntity.databaseAlias = holder.fileAliasEdit.text.toString()
|
||||
saveAliasListener?.invoke(fileHistoryEntity)
|
||||
|
||||
// Finish save mode
|
||||
holder.fileMainSwitcher.showPrevious()
|
||||
// Refresh current position to show alias
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
|
||||
// Open alias modification
|
||||
holder.fileModifyButton.setOnClickListener {
|
||||
holder.fileAliasEdit.setText(holder.fileAlias.text)
|
||||
holder.fileMainSwitcher.showNext()
|
||||
}
|
||||
|
||||
if (isExpanded) {
|
||||
mPreviousExpandedPosition = position
|
||||
}
|
||||
|
||||
holder.fileInformation.setOnClickListener {
|
||||
mExpandedPosition = if (isExpanded) -1 else position
|
||||
|
||||
// Notify change
|
||||
notifyItemChanged(mPreviousExpandedPosition)
|
||||
notifyItemChanged(position)
|
||||
}
|
||||
|
||||
// Refresh View / Close alias modification if not contains fileAlias
|
||||
if (holder.fileMainSwitcher.currentView.findViewById<View>(R.id.file_alias)
|
||||
!= holder.fileAlias)
|
||||
holder.fileMainSwitcher.showPrevious()
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
@@ -133,6 +158,10 @@ class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
this.fileSelectClearListener = fileSelectClearListener
|
||||
}
|
||||
|
||||
fun setSaveAliasListener(listener : ((FileDatabaseHistoryEntity)->Unit)?) {
|
||||
this.saveAliasListener = listener
|
||||
}
|
||||
|
||||
interface FileItemOpenListener {
|
||||
fun onFileItemOpenListener(fileDatabaseHistoryEntity: FileDatabaseHistoryEntity)
|
||||
}
|
||||
@@ -167,12 +196,17 @@ class FileDatabaseHistoryAdapter(private val context: Context)
|
||||
|
||||
inner class FileDatabaseHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
|
||||
var fileContainer: ViewGroup = itemView.findViewById(R.id.file_main_container)
|
||||
var fileContainer: ViewGroup = itemView.findViewById(R.id.file_container_basic_info)
|
||||
|
||||
var fileAlias: TextView = itemView.findViewById(R.id.file_alias)
|
||||
var fileInformation: ImageView = itemView.findViewById(R.id.file_information)
|
||||
|
||||
var fileMainSwitcher: ViewSwitcher = itemView.findViewById(R.id.file_main_switcher)
|
||||
var fileAliasEdit: EditText = itemView.findViewById(R.id.file_alias_edit)
|
||||
var fileAliasCloseButton: ImageView = itemView.findViewById(R.id.file_alias_save)
|
||||
|
||||
var fileExpandContainer: ViewGroup = itemView.findViewById(R.id.file_expand_container)
|
||||
var fileModifyButton: ImageView = itemView.findViewById(R.id.file_modify_button)
|
||||
var filePath: TextView = itemView.findViewById(R.id.file_path)
|
||||
var filePreciseInfoContainer: ViewGroup = itemView.findViewById(R.id.file_precise_info_container)
|
||||
var fileModification: TextView = itemView.findViewById(R.id.file_modification)
|
||||
|
||||
@@ -32,6 +32,17 @@ class FileDatabaseHistory(applicationContext: Context) {
|
||||
.getDatabase(applicationContext)
|
||||
.databaseFileHistoryDao()
|
||||
|
||||
fun getFileDatabaseHistory(databaseUri: Uri, fileHistoryResultListener: (fileDatabaseHistoryResult: FileDatabaseHistoryEntity?) -> Unit) {
|
||||
ActionFileHistoryAsyncTask(
|
||||
{
|
||||
databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())
|
||||
},
|
||||
{
|
||||
fileHistoryResultListener.invoke(it)
|
||||
}
|
||||
).execute()
|
||||
}
|
||||
|
||||
fun getAll(fileHistoryResultListener: (fileDatabaseHistoryResult: List<FileDatabaseHistoryEntity>?) -> Unit) {
|
||||
ActionFileHistoryAsyncTask(
|
||||
{
|
||||
@@ -43,20 +54,28 @@ class FileDatabaseHistory(applicationContext: Context) {
|
||||
).execute()
|
||||
}
|
||||
|
||||
fun addDatabaseUri(databaseUri: Uri, keyFileUri: Uri? = null) {
|
||||
fun addOrUpdateDatabaseUri(databaseUri: Uri, keyFileUri: Uri? = null) {
|
||||
addOrUpdateFileDatabaseHistory(FileDatabaseHistoryEntity(
|
||||
databaseUri.toString(),
|
||||
"",
|
||||
keyFileUri?.toString(),
|
||||
System.currentTimeMillis()
|
||||
), true)
|
||||
}
|
||||
|
||||
fun addOrUpdateFileDatabaseHistory(fileDatabaseHistory: FileDatabaseHistoryEntity, unmodifiedAlias: Boolean = false) {
|
||||
ActionFileHistoryAsyncTask(
|
||||
{
|
||||
val newDatabaseFileHistory = FileDatabaseHistoryEntity(
|
||||
databaseUri.toString(),
|
||||
"",
|
||||
keyFileUri?.toString(),
|
||||
System.currentTimeMillis()
|
||||
)
|
||||
val fileDatabaseHistoryRetrieve = databaseFileHistoryDao.getByDatabaseUri(fileDatabaseHistory.databaseUri)
|
||||
|
||||
if (unmodifiedAlias) {
|
||||
fileDatabaseHistory.databaseAlias = fileDatabaseHistoryRetrieve?.databaseAlias ?: ""
|
||||
}
|
||||
// Update values if history element not yet in the database
|
||||
if (databaseFileHistoryDao.getByDatabaseUri(newDatabaseFileHistory.databaseUri) == null) {
|
||||
databaseFileHistoryDao.add(newDatabaseFileHistory)
|
||||
if (fileDatabaseHistoryRetrieve == null) {
|
||||
databaseFileHistoryDao.add(fileDatabaseHistory)
|
||||
} else {
|
||||
databaseFileHistoryDao.update(newDatabaseFileHistory)
|
||||
databaseFileHistoryDao.update(fileDatabaseHistory)
|
||||
}
|
||||
}
|
||||
).execute()
|
||||
|
||||
@@ -11,7 +11,7 @@ data class FileDatabaseHistoryEntity(
|
||||
val databaseUri: String,
|
||||
|
||||
@ColumnInfo(name = "database_alias")
|
||||
val databaseAlias: String,
|
||||
var databaseAlias: String,
|
||||
|
||||
@ColumnInfo(name = "keyfile_uri")
|
||||
var keyFileUri: String?,
|
||||
|
||||
@@ -120,7 +120,7 @@ class LoadDatabaseRunnable(private val mWeakContext: WeakReference<Context>,
|
||||
keyFileUri = null
|
||||
}
|
||||
mWeakContext.get()?.let {
|
||||
FileDatabaseHistory.getInstance(it).addDatabaseUri(uri, keyFileUri)
|
||||
FileDatabaseHistory.getInstance(it).addOrUpdateDatabaseUri(uri, keyFileUri)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.kunzisoft.keepass.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
|
||||
class FileDatabaseInfo : FileInfo {
|
||||
|
||||
constructor(context: Context, fileUri: Uri): super(context, fileUri)
|
||||
|
||||
constructor(context: Context, filePath: String): super(context, filePath)
|
||||
|
||||
fun retrieveDatabaseAlias(alias: String): String {
|
||||
return when {
|
||||
alias.isNotEmpty() -> alias
|
||||
PreferencesUtil.isFullFilePathEnable(context) -> filePath ?: ""
|
||||
else -> fileName ?: ""
|
||||
}
|
||||
}
|
||||
|
||||
fun retrieveDatabaseTitle(titleCallback: (String)->Unit) {
|
||||
|
||||
FileDatabaseHistory.getInstance(context.applicationContext).getFileDatabaseHistory(fileUri) {
|
||||
fileDatabaseHistoryEntity ->
|
||||
|
||||
titleCallback.invoke(retrieveDatabaseAlias(fileDatabaseHistoryEntity?.databaseAlias ?: ""))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,41 +17,56 @@
|
||||
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.kunzisoft.keepass.adapters
|
||||
package com.kunzisoft.keepass.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.support.v4.provider.DocumentFile
|
||||
import com.kunzisoft.keepass.R
|
||||
|
||||
import java.io.File
|
||||
import java.io.Serializable
|
||||
import java.text.DateFormat
|
||||
import java.util.Date
|
||||
import java.util.*
|
||||
|
||||
class FileInfo(private val context: Context, pathFile: String) : Serializable {
|
||||
open class FileInfo : Serializable {
|
||||
|
||||
var context: Context
|
||||
var fileUri: Uri
|
||||
var filePath: String? = null
|
||||
var fileName: String? = ""
|
||||
var fileUri: Uri? = null
|
||||
var lastModification = Date()
|
||||
var size: Long = 0L
|
||||
|
||||
init {
|
||||
fileUri = Uri.parse(pathFile)
|
||||
if (EXTERNAL_STORAGE_AUTHORITY == fileUri!!.authority) {
|
||||
constructor(context: Context, fileUri: Uri) {
|
||||
this.context = context
|
||||
this.fileUri = fileUri
|
||||
init()
|
||||
}
|
||||
|
||||
constructor(context: Context, filePath: String) {
|
||||
this.context = context
|
||||
this.fileUri = Uri.parse(filePath)
|
||||
init()
|
||||
}
|
||||
|
||||
fun init() {
|
||||
this.filePath = fileUri.path
|
||||
if (EXTERNAL_STORAGE_AUTHORITY == fileUri.authority) {
|
||||
val file = DocumentFile.fromSingleUri(context, fileUri)
|
||||
size = file.length()
|
||||
fileName = file.name
|
||||
lastModification = Date(file.lastModified())
|
||||
} else {
|
||||
val file = File(fileUri!!.path!!)
|
||||
size = file.length()
|
||||
fileName = file.name
|
||||
lastModification = Date(file.lastModified())
|
||||
filePath?.let {
|
||||
val file = File(it)
|
||||
size = file.length()
|
||||
fileName = file.name
|
||||
lastModification = Date(file.lastModified())
|
||||
}
|
||||
}
|
||||
|
||||
if (fileName == null || fileName!!.isEmpty()) {
|
||||
fileName = fileUri!!.path
|
||||
fileName = filePath
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +129,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_margin="24dp"
|
||||
android:minHeight="200dp"
|
||||
android:elevation="6dp"
|
||||
android:background="?attr/colorPrimaryDark"
|
||||
app:layout_constraintWidth_percent="@dimen/content_percent"
|
||||
|
||||
@@ -33,64 +33,119 @@
|
||||
android:layout_height="1dp"
|
||||
android:background="?attr/colorPrimaryDark"/>
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:id="@+id/file_main_container"
|
||||
android:orientation="horizontal"
|
||||
<ViewSwitcher
|
||||
android:id="@+id/file_main_switcher"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:elevation="8dp">
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_alias"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content">
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:id="@+id/file_container_basic_info"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/file_information"
|
||||
android:textColor="?attr/textColorInverse"
|
||||
tools:text="DatabaseAlias" />
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/file_information"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:padding="12dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:elevation="8dp">
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_alias"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/file_information"
|
||||
android:textColor="?attr/textColorInverse"
|
||||
tools:text="DatabaseAlias" />
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/file_information"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:padding="12dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/file_alias"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:src="@drawable/ic_info_white_24dp"
|
||||
android:tint="?android:attr/textColorHintInverse"
|
||||
android:contentDescription="@string/content_description_file_information"/>
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:id="@+id/file_container_alias_register"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/file_alias"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:src="@drawable/ic_info_white_24dp"
|
||||
android:contentDescription="@string/content_description_file_information"
|
||||
android:tint="?android:attr/textColorHintInverse"/>
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
android:elevation="8dp">
|
||||
<android.support.v7.widget.AppCompatEditText
|
||||
android:id="@+id/file_alias_edit"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:maxLines="2"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/file_alias_save"
|
||||
android:textColor="?attr/textColorInverse"
|
||||
tools:text="DatabaseAlias" />
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/file_alias_save"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:padding="12dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/file_alias_edit"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:src="@drawable/ic_save_white_24dp"
|
||||
android:contentDescription="@string/content_description_file_information"/>
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
</ViewSwitcher>
|
||||
|
||||
<LinearLayout
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:id="@+id/file_expand_container"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/colorPrimaryDark"
|
||||
app:layout_constraintTop_toBottomOf="@+id/file_main_container"
|
||||
android:padding="8dp">
|
||||
app:layout_constraintTop_toBottomOf="@+id/file_main_switcher">
|
||||
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/file_modify_button"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:padding="12dp"
|
||||
android:src="@drawable/ic_mode_edit_white_24dp"
|
||||
android:scaleX="-1"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:tint="?android:attr/textColorHintInverse"/>
|
||||
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_path"
|
||||
android:textIsSelectable="true"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:padding="12dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/file_modify_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:text="/path/to/DatabaseName.kdbx"
|
||||
android:textColor="?android:attr/textColorHintInverse"
|
||||
android:gravity="end"
|
||||
@@ -98,38 +153,38 @@
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:id="@+id/file_precise_info_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toBottomOf="@+id/file_path"
|
||||
app:layout_constraintStart_toEndOf="@+id/file_modify_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:paddingBottom="12dp"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:orientation="horizontal">
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_modification"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"
|
||||
tools:text="25 Augst"
|
||||
android:textColor="?android:attr/textColorHintInverse"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/file_size"
|
||||
android:layout_margin="8dp"
|
||||
android:gravity="start"/>
|
||||
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_size"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"
|
||||
tools:text="8 bytes"
|
||||
android:gravity="end"
|
||||
android:textColor="?android:attr/textColorHintInverse"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/file_modification"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_margin="8dp"
|
||||
android:gravity="end"/>
|
||||
app:layout_constraintStart_toEndOf="@+id/file_modification"
|
||||
app:layout_constraintTop_toTopOf="@+id/file_modification"
|
||||
tools:text="8 bytes" />
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
|
||||
</LinearLayout>
|
||||
Reference in New Issue
Block a user