Added author to commit and UI improvements

This commit is contained in:
Abdelilah El Aissaoui 2021-09-24 16:46:01 +02:00
parent 3ad0d12503
commit 67d410fd12
7 changed files with 206 additions and 78 deletions

View File

@ -0,0 +1,176 @@
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.res.useResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import extensions.filePath
import extensions.icon
import extensions.md5
import extensions.toByteArray
import kotlinx.coroutines.*
import org.eclipse.jgit.diff.DiffEntry
import org.eclipse.jgit.revwalk.RevCommit
import org.jetbrains.skija.Image.makeFromEncoded
import theme.backgroundColorLight
import theme.primaryTextColor
import java.net.HttpURLConnection
import java.net.URL
@Composable
fun CommitChanges(commitDiff: Pair<RevCommit, List<DiffEntry>>, onDiffSelected: (DiffEntry) -> Unit) {
val commit = commitDiff.first
val diff = commitDiff.second
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.background),
) {
Column(
modifier = Modifier
.padding(all = 8.dp)
.fillMaxWidth(),
) {
val scroll = rememberScrollState(0)
Text(
text = commit.fullMessage,
modifier = Modifier
.padding(8.dp)
.fillMaxWidth()
.background(MaterialTheme.colors.surface)
.height(120.dp)
.verticalScroll(scroll),
)
Card(
modifier = Modifier
.padding(horizontal = 8.dp, vertical = 8.dp)
.fillMaxWidth()
.height(72.dp)
) {
Row(
modifier = Modifier
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
val url = "https://www.gravatar.com/avatar/${commit.authorIdent.emailAddress.md5}"
Image(
bitmap = rememberNetworkImage(url),
modifier = Modifier
.padding(horizontal = 16.dp)
.height(40.dp)
.clip(CircleShape),
contentDescription = null,
)
Column(
modifier = Modifier
.fillMaxSize(),
verticalArrangement = Arrangement.Center
) {
Text(commit.authorIdent.name)
}
}
}
}
CommitLogChanges(diff, onDiffSelected = onDiffSelected)
}
}
suspend fun loadImage(link: String): ByteArray = withContext(Dispatchers.IO) {
val url = URL(link)
val connection = url.openConnection() as HttpURLConnection
connection.connect()
connection.inputStream.toByteArray()
}
@Composable
fun rememberNetworkImage(url: String): ImageBitmap {
var image by remember(url) {
mutableStateOf<ImageBitmap>(
useResource("image.jpg") {
makeFromEncoded(it.toByteArray()).asImageBitmap()
}
)
}
LaunchedEffect(url) {
loadImage(url).let {
image = makeFromEncoded(it).asImageBitmap()
}
}
return image
}
@Composable
fun CommitLogChanges(diffEntries: List<DiffEntry>, onDiffSelected: (DiffEntry) -> Unit) {
val selectedIndex = remember(diffEntries) { mutableStateOf(-1) }
LazyColumn(
modifier = Modifier
.background(backgroundColorLight)
.fillMaxSize()
) {
itemsIndexed(items = diffEntries) { index, diffEntry ->
val textColor = if (selectedIndex.value == index) {
MaterialTheme.colors.primary
} else
MaterialTheme.colors.primaryTextColor
Column(
modifier = Modifier
.height(56.dp)
.fillMaxWidth()
.clickable {
selectedIndex.value = index
onDiffSelected(diffEntry)
},
verticalArrangement = Arrangement.Center,
) {
Spacer(modifier = Modifier.weight(2f))
Row {
Icon(
modifier = Modifier
.padding(start = 16.dp)
.size(24.dp),
imageVector = diffEntry.icon,
contentDescription = null,
tint = MaterialTheme.colors.primary,
)
Text(
text = diffEntry.filePath,
modifier = Modifier.padding(horizontal = 16.dp),
color = textColor,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
Spacer(modifier = Modifier.weight(2f))
Divider()
}
}
}
}

View File

@ -13,10 +13,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import extensions.filePath
import extensions.icon
import git.LogStatus
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.diff.DiffEntry
@ -26,7 +24,7 @@ import org.eclipse.jgit.revwalk.RevTree
import org.eclipse.jgit.revwalk.RevWalk
import org.eclipse.jgit.treewalk.AbstractTreeIterator
import org.eclipse.jgit.treewalk.CanonicalTreeParser
import theme.backgroundColor
import theme.backgroundColorLight
import theme.primaryTextColor
import theme.secondaryTextColor
import java.io.IOException
@ -170,22 +168,6 @@ fun prepareTreeParser(repository: Repository, commit: RevCommit): AbstractTreeIt
}
}
@Composable
fun CommitChanges(commitDiff: Pair<RevCommit, List<DiffEntry>>, onDiffSelected: (DiffEntry) -> Unit) {
val commit = commitDiff.first
val diff = commitDiff.second
Column(
modifier = Modifier
.fillMaxSize(),
) {
Text(commit.fullMessage)
Text(commit.commitTime.toString())
CommitLogChanges(diff, onDiffSelected = onDiffSelected)
}
}
@Composable
fun Log(
gitManager: GitManager,
@ -207,7 +189,7 @@ fun Log(
LazyColumn(
modifier = Modifier
.background(backgroundColor)
.background(MaterialTheme.colors.surface)
.fillMaxSize()
) {
if (gitManager.hasUncommitedChanges())
@ -282,59 +264,4 @@ fun Log(
}
}
}
}
@Composable
fun CommitLogChanges(diffEntries: List<DiffEntry>, onDiffSelected: (DiffEntry) -> Unit) {
val selectedIndex = remember(diffEntries) { mutableStateOf(-1) }
LazyColumn(
modifier = Modifier
.background(backgroundColor)
.fillMaxSize()
) {
itemsIndexed(items = diffEntries) { index, diffEntry ->
val textColor = if (selectedIndex.value == index) {
MaterialTheme.colors.primary
} else
MaterialTheme.colors.primaryTextColor
Column(
modifier = Modifier
.height(56.dp)
.fillMaxWidth()
.clickable {
selectedIndex.value = index
onDiffSelected(diffEntry)
},
verticalArrangement = Arrangement.Center,
) {
Spacer(modifier = Modifier.weight(2f))
Row {
Icon(
modifier = Modifier
.padding(start = 16.dp)
.size(24.dp),
imageVector = diffEntry.icon,
contentDescription = null,
tint = MaterialTheme.colors.primary,
)
Text(
text = diffEntry.filePath,
modifier = Modifier.padding(horizontal = 16.dp),
color = textColor,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
Spacer(modifier = Modifier.weight(2f))
Divider()
}
}
}
}
}

View File

@ -0,0 +1,12 @@
package extensions
import java.io.ByteArrayOutputStream
import java.io.InputStream
fun InputStream.toByteArray(): ByteArray {
val byteArrayOutputStream = ByteArrayOutputStream()
return byteArrayOutputStream.use { byteArrayOutStream ->
this.transferTo(byteArrayOutStream)
byteArrayOutStream.toByteArray()
}
}

View File

@ -0,0 +1,10 @@
package extensions
import java.math.BigInteger
import java.security.MessageDigest
val String.md5: String
get() {
val md = MessageDigest.getInstance("MD5")
return BigInteger(1, md.digest(this.toByteArray())).toString(16).padStart(32, '0')
}

View File

@ -14,4 +14,6 @@ val errorColor = Color(0xFFFA4B4B)
val primaryGrayLight = Color(0xFF464646)
val accentGrayLight = Color(0xFFCCCCCC)
val backgroundColor = Color(0xFFf9f9f9)
//val backgroundColorLight = Color(0xFFE8E8E8)
val backgroundColorLight = Color(0xFFC2C2C2)
val surfaceColorLight = Color(0xFFf9f9f9)

View File

@ -14,7 +14,8 @@ private val LightColorPalette = lightColors(
primary = primary,
primaryVariant = primaryDark,
secondary = secondary,
background = backgroundColor,
background = backgroundColorLight,
surface = surfaceColorLight,
error = errorColor
/* Other default colors to override

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB