Skip to content

Commit

Permalink
Merge pull request #38 from unbiaseduser/ui-refactor
Browse files Browse the repository at this point in the history
UI improvements
  • Loading branch information
KiARC committed Oct 20, 2022
2 parents 437ac37 + 198d078 commit 785ee5e
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 142 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Expand Up @@ -13,6 +13,7 @@
<activity
android:name=".Create"
android:exported="false"
android:label="Add new addiction"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".Main"
Expand Down
101 changes: 51 additions & 50 deletions app/src/main/java/com/katiearose/sobriety/Create.kt
Expand Up @@ -3,23 +3,29 @@ package com.katiearose.sobriety
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.animation.AnimationUtils
import android.widget.*
import androidx.appcompat.app.AlertDialog
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_SHORT
import com.google.android.material.snackbar.Snackbar
import java.time.LocalDate
import com.google.android.material.textfield.TextInputLayout
import com.google.android.material.timepicker.MaterialTimePicker
import java.time.LocalTime
import java.time.ZoneId
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.*


class Create : AppCompatActivity() {
private lateinit var createButton: Button
private lateinit var datePickerButton: ConstraintLayout
private lateinit var timePickerButton: ConstraintLayout
private lateinit var textInputLayout: TextInputLayout
private lateinit var nameEntry: EditText
private lateinit var dateView: TextView
private lateinit var timeView: TextView
Expand All @@ -37,6 +43,7 @@ class Create : AppCompatActivity() {
datePickerButton = findViewById(R.id.clPickDate)
timePickerButton = findViewById(R.id.clPickTime)

textInputLayout = findViewById(R.id.til)
nameEntry = findViewById(R.id.etTitle)
dateView = findViewById(R.id.tvDate)
timeView = findViewById(R.id.tvTime)
Expand All @@ -62,65 +69,59 @@ class Create : AppCompatActivity() {
}

private fun pickDate() {
val builder = AlertDialog.Builder(this)
builder.setTitle("Pick Starting Date")
val input = DatePicker(this)
input.maxDate = System.currentTimeMillis()
input.updateDate(startDateTime.year, startDateTime.monthValue - 1, startDateTime.dayOfMonth)
builder.setView(input)
builder.setPositiveButton(
"OK"
) { _, _ ->
startDateTime = ZonedDateTime.of(
LocalDate.of(input.year, input.month + 1, input.dayOfMonth),
startDateTime.toLocalTime(),
ZoneId.systemDefault()
)
dateView.text = startDateTime.toLocalDate().toString()
val datePicker = MaterialDatePicker.Builder.datePicker()
.setTitleText("Pick Starting Date")
.setCalendarConstraints(CalendarConstraints.Builder().setEnd(System.currentTimeMillis()).build())
.build()
datePicker.addOnPositiveButtonClickListener {
if (it > System.currentTimeMillis())
Snackbar.make(findViewById(R.id.clCreate), "You can't select a future date", LENGTH_SHORT).show()
else {
startDateTime = ZonedDateTime.of(
Date(it).toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
startDateTime.toLocalTime(),
ZoneId.systemDefault()
)
dateView.text = startDateTime.toLocalDate().toString()
}
}
builder.setNegativeButton(
"Cancel"
) { dialog, _ -> dialog.cancel() }
builder.show()
datePicker.show(supportFragmentManager, null)
}

private fun pickTime() {
val builder = AlertDialog.Builder(this)
builder.setTitle("Pick Starting Time")
val input = TimePicker(this)
builder.setView(input)
builder.setPositiveButton(
"OK"
) { _, _ ->
if (input.validateInput()) startDateTime = ZonedDateTime.of(
startDateTime.toLocalDate(),
LocalTime.of(input.hour, input.minute),
ZoneId.systemDefault()
)
timeView.text = startDateTime.toLocalTime().toString()
val isToday = startDateTime.toLocalDate() == ZonedDateTime.now().toLocalDate()
val timePicker = MaterialTimePicker.Builder()
.setTitleText("Pick Starting Time")
.setHour(ZonedDateTime.now().hour)
.setMinute(ZonedDateTime.now().minute)
.build()
timePicker.addOnPositiveButtonClickListener {
if ((timePicker.hour > ZonedDateTime.now().hour ||
(timePicker.hour == ZonedDateTime.now().hour && timePicker.minute > ZonedDateTime.now().minute)) &&
isToday)
Snackbar.make(findViewById(R.id.clCreate), "You can't select a future time", LENGTH_SHORT).show()
else {
startDateTime = ZonedDateTime.of(
startDateTime.toLocalDate(),
LocalTime.of(timePicker.hour, timePicker.minute),
ZoneId.systemDefault()
)
timeView.text = startDateTime.toLocalTime().toString()
}
}
builder.setNegativeButton(
"Cancel"
) { dialog, _ -> dialog.cancel() }
builder.show()
timePicker.show(supportFragmentManager, null)
}

private fun create() {
val name = nameEntry.text.toString().trim()
val nameExists = names.contains(name)

//Don't allow creating without a name, or with a duplicate name
if (name == "" || nameExists) {
if (nameExists) {
Snackbar.make(
findViewById(R.id.clCreate),
"Can't create duplicate entries",
Snackbar.LENGTH_SHORT
).show()
}
val animationShake =
if (name.isEmpty() || nameExists) {
textInputLayout.error = if (name.isEmpty()) "Name is empty" else "Can't create duplicate entries"
/*val animationShake =
AnimationUtils.loadAnimation(this, R.anim.shake)
nameEntry.startAnimation(animationShake)
nameEntry.startAnimation(animationShake)*/
return
}

Expand Down
36 changes: 29 additions & 7 deletions app/src/main/java/com/katiearose/sobriety/Main.kt
Expand Up @@ -16,22 +16,44 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import java.io.FileNotFoundException
import java.time.Instant
import java.util.*


class Main : AppCompatActivity() {

companion object {
const val EXTRA_NAMES = "com.katiearose.sobriety.EXTRA_NAMES"
private const val MINUTE = 60
private const val HOUR = MINUTE * 60
private const val DAY = HOUR * 24
private const val WEEK = DAY * 7
private const val MONTH = DAY * 31
private const val YEAR = MONTH * 12
fun secondsToString(given: Long): String {
var time = given
val s = time % 60
val s = time % MINUTE
time -= s
val m = (time % 3600) / 60
time -= m * 60
val h = (time % 86400) / 3600
time -= h * 3600
val d = time / 86400
return "$d days, $h hours, $m minutes and $s seconds"
val m = (time % HOUR) / MINUTE
time -= m * MINUTE
val h = (time % DAY) / HOUR
time -= h * HOUR
val d = (time % WEEK) / DAY
time -= d * DAY
val w = (time % MONTH) / WEEK
time -= w * WEEK
val mo = (time % YEAR) / MONTH
time -= mo * MONTH
val y = time / YEAR
val stringBuilder = StringBuilder()
if (y != 0L) stringBuilder.append("$y years, ")
if (mo != 0L) stringBuilder.append("$mo months, ")
if (w != 0L) stringBuilder.append("$w weeks, ")
if (d != 0L) stringBuilder.append("$d days, ")
if (h != 0L) stringBuilder.append("$h hours, ")
if (m != 0L) stringBuilder.append("$m minutes, ")
if (!(y == 0L && mo == 0L && w == 0L && d == 0L && h == 0L && m == 0L)) stringBuilder.append("and ")
stringBuilder.append("$s seconds")
return stringBuilder.toString()
}

fun timeSinceInstant(given: Instant) = Instant.now().epochSecond - given.epochSecond
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/ripple.xml
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?colorControlHighlight">

<item android:id="@android:id/mask">
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>
158 changes: 80 additions & 78 deletions app/src/main/res/layout/activity_create.xml
Expand Up @@ -7,95 +7,97 @@
android:layout_height="match_parent"
tools:context=".Create">


<androidx.appcompat.widget.LinearLayoutCompat
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/til"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="30dp">
android:layout_height="wrap_content"
android:hint="Addiction name"
android:layout_marginTop="240dp"
app:layout_constraintBottom_toTopOf="@id/clPickTime"
app:layout_constraintTop_toTopOf="parent" >

<EditText
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:height="48dp"
android:hint="Addiction name"
android:inputType="textCapSentences" />
android:layout_height="match_parent"
android:inputType="textCapSentences"/>

</com.google.android.material.textfield.TextInputLayout>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clPickTime"
android:layout_width="match_parent"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clPickTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingVertical="10dp"
android:layout_marginTop="60dp"
app:layout_constraintTop_toBottomOf="@id/til"
app:layout_constraintBottom_toTopOf="@id/clPickDate">

<TextView
android:id="@+id/tvPickTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingVertical="10dp">

<TextView
android:id="@+id/tvPickTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:text="Time"
android:textColor="?attr/colorOnBackground"
android:textSize="@dimen/text_size_medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tvTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="234:2348:349"
app:layout_constraintStart_toStartOf="@id/tvPickTime"
app:layout_constraintTop_toBottomOf="@id/tvPickTime" />


</androidx.constraintlayout.widget.ConstraintLayout>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clPickDate"
android:layout_width="match_parent"
android:layout_marginStart="3dp"
android:text="Time"
android:textColor="?attr/colorOnBackground"
android:textSize="@dimen/text_size_medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tvTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingVertical="10dp">

<TextView
android:id="@+id/tvPickDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:text="Date"
android:textColor="?attr/colorOnBackground"
android:textSize="@dimen/text_size_medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:text="234:2348:349"
app:layout_constraintStart_toStartOf="@id/tvPickTime"
app:layout_constraintTop_toBottomOf="@id/tvPickTime" />

<TextView
android:id="@+id/tvDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="23.02.2017"
app:layout_constraintStart_toStartOf="@id/tvPickDate"
app:layout_constraintTop_toBottomOf="@id/tvPickDate" />

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clPickDate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingVertical="10dp"
android:layout_marginBottom="60dp"
app:layout_constraintTop_toBottomOf="@id/clPickTime"
app:layout_constraintBottom_toTopOf="@id/btnCreate">

<TextView
android:id="@+id/tvPickDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">

<Button
android:id="@+id/btnCreate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="30dp"
android:text="CREATE"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.appcompat.widget.LinearLayoutCompat>
android:layout_marginStart="3dp"
android:text="Date"
android:textColor="?attr/colorOnBackground"
android:textSize="@dimen/text_size_medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tvDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="23.02.2017"
app:layout_constraintStart_toStartOf="@id/tvPickDate"
app:layout_constraintTop_toBottomOf="@id/tvPickDate" />


</androidx.constraintlayout.widget.ConstraintLayout>

<Button
android:id="@+id/btnCreate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="30dp"
android:text="CREATE"
android:layout_marginBottom="240dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/clPickDate"
app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

0 comments on commit 785ee5e

Please sign in to comment.