From 04dabcb41828b4f440a772bdd6757d72a4c5d32a Mon Sep 17 00:00:00 2001 From: icewithcola Date: Fri, 26 Apr 2024 13:42:06 +0800 Subject: [PATCH] Add TODO app --- app/build.gradle.kts | 40 +++- app/src/main/AndroidManifest.xml | 40 +++- .../uk/kagurach/android101/MainActivity.java | 53 ++++- .../uk/kagurach/android101/MainActivity2.java | 2 +- .../kagurach/android101/todoList/AddPage.kt | 185 ++++++++++++++++++ .../android101/todoList/MainActivity.kt | 85 ++++++++ .../kagurach/android101/todoList/TodoItem.kt | 17 ++ .../android101/todoList/TodoItemLoader.kt | 106 ++++++++++ .../android101/todoList/TodoListView.kt | 167 ++++++++++++++++ .../android101/todoList/ui/theme/Color.kt | 10 + app/src/main/res/layout/activity_main2.xml | 2 +- app/src/main/res/resources.properties | 1 + app/src/main/res/values-zh-rCN/strings.xml | 14 ++ app/src/main/res/values/strings.xml | 30 ++- app/src/main/res/values/themes.xml | 4 + app/src/main/res/xml/shortcuts.xml | 17 ++ gradle.properties | 2 +- gradle/libs.versions.toml | 27 +++ 18 files changed, 774 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/uk/kagurach/android101/todoList/AddPage.kt create mode 100644 app/src/main/java/uk/kagurach/android101/todoList/MainActivity.kt create mode 100644 app/src/main/java/uk/kagurach/android101/todoList/TodoItem.kt create mode 100644 app/src/main/java/uk/kagurach/android101/todoList/TodoItemLoader.kt create mode 100644 app/src/main/java/uk/kagurach/android101/todoList/TodoListView.kt create mode 100644 app/src/main/java/uk/kagurach/android101/todoList/ui/theme/Color.kt create mode 100644 app/src/main/res/resources.properties create mode 100644 app/src/main/res/values-zh-rCN/strings.xml create mode 100644 app/src/main/res/xml/shortcuts.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0382773..7fe44ba 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "uk.kagurach.android101" minSdk = 31 targetSdk = 34 - versionCode = 132 - versionName = "1.3.2" + versionCode = 140 + versionName = "1.4.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -33,16 +33,50 @@ android { kotlinOptions { jvmTarget = "17" } + buildFeatures { + compose = true + viewBinding = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + androidResources { + generateLocaleConfig = true + } } dependencies { - implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + implementation(libs.androidx.room.common) + implementation(libs.androidx.room.ktx) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.activity) + implementation(libs.androidx.annotation) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) + + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 177a87e..34e59f8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,15 +14,6 @@ android:supportsRtl="true" android:theme="@style/Theme.Android101" tools:targetApi="31"> - - - @@ -32,6 +23,37 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/uk/kagurach/android101/MainActivity.java b/app/src/main/java/uk/kagurach/android101/MainActivity.java index 990f610..9f15a48 100644 --- a/app/src/main/java/uk/kagurach/android101/MainActivity.java +++ b/app/src/main/java/uk/kagurach/android101/MainActivity.java @@ -1,9 +1,15 @@ package uk.kagurach.android101; import android.Manifest; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutManager; import android.os.Build; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; @@ -17,6 +23,8 @@ import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import java.util.Arrays; + public class MainActivity extends AppCompatActivity { PageHelper pageHelper; @Override @@ -29,6 +37,7 @@ public class MainActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + } @Override @@ -50,6 +59,7 @@ public class MainActivity extends AppCompatActivity { 101); } textViewAppendString(tv,"Check Finished"); + textViewAppendString(tv,"提示:常桉有惊喜"); } textViewAppendString(tv,"*************************\nfinished"); @@ -58,10 +68,8 @@ public class MainActivity extends AppCompatActivity { Button button = findViewById(R.id.Page1NextPage); button.setEnabled(true); - } - - public void jumpToNext(View view) { - pageHelper.goNext(); + button.setOnClickListener(pageHelper.pageButtonHandler); + button.setOnLongClickListener(new LongClickHandler(this)); } private void textViewAppendString(@NonNull TextView tv, String s){ @@ -72,4 +80,41 @@ public class MainActivity extends AppCompatActivity { last += s; tv.setText(last); } + private final class LongClickHandler implements View.OnLongClickListener + { + LongClickHandler(Context ctx){ + context = ctx; + } + Context context; + + + @Override + public boolean onLongClick(View v){ + CreateShortcut(context); + return false; + } + } + private void CreateShortcut(Context context) { + ShortcutManager shortcutManager = + this.getSystemService(ShortcutManager.class); + if (shortcutManager.isRequestPinShortcutSupported()) { + ShortcutInfo pinShortcutInfo; + try { + pinShortcutInfo = + new ShortcutInfo.Builder(context, "start_TODO").build(); + }catch (Exception e){ + Log.e("ShortCutManager", Arrays.toString(e.getStackTrace())); + return; + } + + Intent pinnedShortcutCallbackIntent = + shortcutManager.createShortcutResultIntent(pinShortcutInfo); + + PendingIntent successCallback = PendingIntent.getBroadcast(context, 0, + pinnedShortcutCallbackIntent, PendingIntent.FLAG_IMMUTABLE); + + shortcutManager.requestPinShortcut(pinShortcutInfo, + successCallback.getIntentSender()); + } + } } \ No newline at end of file diff --git a/app/src/main/java/uk/kagurach/android101/MainActivity2.java b/app/src/main/java/uk/kagurach/android101/MainActivity2.java index 10a85ee..f4b4ae7 100644 --- a/app/src/main/java/uk/kagurach/android101/MainActivity2.java +++ b/app/src/main/java/uk/kagurach/android101/MainActivity2.java @@ -62,7 +62,7 @@ public class MainActivity2 extends AppCompatActivity { public void setColor(View view) { TextView t = findViewById(R.id.test2strview); - EditText r_edit = findViewById(R.id.R); + EditText r_edit = findViewById(R.id.EditText_R); EditText g_edit = findViewById(R.id.G); EditText b_edit = findViewById(R.id.B); diff --git a/app/src/main/java/uk/kagurach/android101/todoList/AddPage.kt b/app/src/main/java/uk/kagurach/android101/todoList/AddPage.kt new file mode 100644 index 0000000..3fe7918 --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/todoList/AddPage.kt @@ -0,0 +1,185 @@ +package uk.kagurach.android101.todoList + +import android.content.Intent +import android.icu.util.Calendar +import android.os.Bundle +import android.view.MotionEvent +import android.view.inputmethod.InputMethodManager +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.DatePicker +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TimePicker +import androidx.compose.material3.TimePickerState +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.ContextCompat +import uk.kagurach.android101.R +import uk.kagurach.android101.todoList.ui.theme.LightBlue100 +import java.text.SimpleDateFormat + + +class AddPage() : ComponentActivity() { + var item: TodoItem? = null + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + // A surface container using the 'background' color from the theme + Surface( + modifier = Modifier.fillMaxSize(), + ) { + AddPageLayout() + } + } + } + + // Fix Input Method + override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { + if (currentFocus != null) { + val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0) + } + return super.dispatchTouchEvent(ev) + } + + @OptIn(ExperimentalMaterial3Api::class) + @Composable + fun AddPageLayout(){ + val context = LocalContext.current + + var title by remember { + mutableStateOf( + when (item){ + null -> "" + else -> item!!.title + } + ) + } + val c = Calendar.getInstance() + + val timePickerState by remember { + mutableStateOf( + when (item){ + null -> TimePickerState(c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true) + else -> TimePickerState( + item!!.dueDate.split(" ")[1].split(":")[0].toInt(), + item!!.dueDate.split(" ")[1].split(":")[1].toInt(), + true + ) + } + ) + } + + val datePickerState = rememberDatePickerState( + initialDisplayedMonthMillis = System.currentTimeMillis(), + yearRange = 2024..2099 + ) + Scaffold ( + topBar = { + Surface( + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + ) { + Text( + text = context.getText(R.string.edit_page_title).toString(), + fontSize = 30.sp, + textAlign = TextAlign.Center + ) + } + }, + content = { padding -> + Column( + modifier = Modifier + .fillMaxWidth() + .verticalScroll(rememberScrollState()) + .padding(padding) + ) { + TextField( + value = title, + onValueChange = { title = it }, + label = { Text(context.getText(R.string.enter_title).toString()) }, + maxLines = 1, + modifier = Modifier + .height(80.dp) + .fillMaxWidth() + ) + Box( + modifier = Modifier.padding(top = 15.dp, bottom = 15.dp), + contentAlignment = Alignment.CenterStart + ) { + DatePicker(state = datePickerState) + } + TimePicker( + state = timePickerState, + modifier = Modifier.padding(start = 70.dp) + ) + } + }, + floatingActionButtonPosition = FabPosition.End, + floatingActionButton = { + Submit { + if (title.isBlank()||datePickerState.selectedDateMillis==null){ + Toast.makeText(context,"Please Fill Every field",Toast.LENGTH_SHORT) + .show() + return@Submit + } + val loader = TodoItemLoader(context) + val sdf = SimpleDateFormat("yyyy-MM-dd") + + + val todoItem = TodoItem( + loader.getLastId()+1, + title.replace("\t"," "), + sdf.format(datePickerState.selectedDateMillis) + " " + + timePickerState.hour.toString() + ":" + + timePickerState.minute.toString() + ) + loader.changeItem(todoItem) + val myIntent = Intent(context, MainActivity::class.java) + ContextCompat.startActivity(context, myIntent, null) + } + }, + ) + + } + + @Composable + fun Submit(onClick: () -> Unit) { + FloatingActionButton( + onClick = { onClick() }, + containerColor = LightBlue100 + ) { + Icon(Icons.Filled.Add, "Submit") + } + } +} diff --git a/app/src/main/java/uk/kagurach/android101/todoList/MainActivity.kt b/app/src/main/java/uk/kagurach/android101/todoList/MainActivity.kt new file mode 100644 index 0000000..e351f27 --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/todoList/MainActivity.kt @@ -0,0 +1,85 @@ +package uk.kagurach.android101.todoList + +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.core.content.ContextCompat +import uk.kagurach.android101.todoList.ui.theme.LightBlue100 + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + val loader = TodoItemLoader(this) + val tmpList = loader.getTodoItems() + super.onCreate(savedInstanceState) + setContent { + LayOut(tmpList) + } + } +} + + @OptIn(ExperimentalMaterial3Api::class) + @Composable + fun LayOut(tmpList : List?) { + val context = LocalContext.current + + Scaffold ( + topBar = { + TopAppBar( + title = { Text("Simple TODO ^_^") } + ) + }, + content = { + padding -> + Surface( + modifier = Modifier.padding(padding) + .verticalScroll(rememberScrollState()) + ) { + if (tmpList != null) { + Column { + for (i in tmpList) { + TodoItemView(todoItem = i) + } + } + } + } + }, + floatingActionButtonPosition = FabPosition.End, + floatingActionButton = { + NextPage { + val myIntent = Intent(context, AddPage::class.java) + ContextCompat.startActivity(context, myIntent, null) + } + }, + ) + + } + + @Composable + fun NextPage(onClick: () -> Unit) { + FloatingActionButton( + onClick = { onClick() }, + containerColor = LightBlue100 + ) { + Icon(Icons.Filled.Add, "Floating action button.") + } + } + + diff --git a/app/src/main/java/uk/kagurach/android101/todoList/TodoItem.kt b/app/src/main/java/uk/kagurach/android101/todoList/TodoItem.kt new file mode 100644 index 0000000..7c6776b --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/todoList/TodoItem.kt @@ -0,0 +1,17 @@ +package uk.kagurach.android101.todoList + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class TodoItem( + @PrimaryKey(autoGenerate = true) + val id: Int, + + var title: String, + var dueDate: String, + + var isCompleted:Boolean = false, + + var MarkDeleted:Boolean = false +) diff --git a/app/src/main/java/uk/kagurach/android101/todoList/TodoItemLoader.kt b/app/src/main/java/uk/kagurach/android101/todoList/TodoItemLoader.kt new file mode 100644 index 0000000..650fc94 --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/todoList/TodoItemLoader.kt @@ -0,0 +1,106 @@ +package uk.kagurach.android101.todoList + +import android.content.Context +import android.util.Log +import java.io.File +import java.io.FileWriter + +class TodoItemLoader(private val context: Context) { + private val db = File(context.filesDir,"db") + + public fun getTodoItems(): List?{ + if (!db.exists()){ + return null + } + val lines = db.readLines() + if (lines.isEmpty()){ + return null + } + + var list: List = listOf() + for (line in lines){ + val split = line.split("\t") + val item: TodoItem + try { + item = TodoItem(split[0].toInt(),split[1],split[2], split[3].toBooleanStrict()) + list = list + item + } catch (e: Exception){ + Log.e("DB Error", e.printStackTrace().toString()) + } + } + if (list.isNotEmpty()){ + return list + } + return null + } + + public fun saveTodoItems(list:List){ + var result = "" + for (i in list){ + if(!i.MarkDeleted) { + result += "%s\t%s\t%s\t%s\n".format( + i.id.toString(), + i.title, + i.dueDate, + i.isCompleted.toString() + ) + } + } + val fileWriter = FileWriter(db) + fileWriter.write(result) + fileWriter.close() + } + + public fun getLastId():Int{ + val items = getTodoItems(); + return if (items==null){ + 0 + }else{ + var max = 0 + for (i in items){ + if (i.id>max){ + max = i.id + } + } + max + } + } + + public fun changeItem(todoItem: TodoItem){ + var items = getTodoItems() + var changeFlag = false + if (items != null) { + for (i in items){ + if (i.id==todoItem.id){ + i.title = todoItem.title + i.dueDate = todoItem.dueDate + i.MarkDeleted = todoItem.MarkDeleted + i.isCompleted = todoItem.isCompleted + changeFlag = true + break + } + } + if (!changeFlag){ + items = items + todoItem + } + }else{ + items = listOf(todoItem) + } + saveTodoItems(items) + } + + public fun searchItem(id:Int): TodoItem?{ + val items = getTodoItems(); + return if (items==null){ + null + }else{ + for (i in items){ + if (i.id>id){ + return i + } + } + null + } + } +} + diff --git a/app/src/main/java/uk/kagurach/android101/todoList/TodoListView.kt b/app/src/main/java/uk/kagurach/android101/todoList/TodoListView.kt new file mode 100644 index 0000000..d32cac8 --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/todoList/TodoListView.kt @@ -0,0 +1,167 @@ +package uk.kagurach.android101.todoList + +import android.content.Context +import android.content.Intent +import android.widget.Toast +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.ContextCompat +import uk.kagurach.android101.R +import uk.kagurach.android101.todoList.ui.theme.Blue100 +import uk.kagurach.android101.todoList.ui.theme.Green100 + +@Composable +fun TodoItemView(todoItem: TodoItem) { + val context = LocalContext.current + val loader = TodoItemLoader(context) + + var deleteText by remember { + mutableStateOf(context.getText(R.string.first_delete).toString()) + } + var bgColor by remember { + mutableStateOf( + when (todoItem.isCompleted){ + true -> Green100 + false -> Blue100 + } + ) + } + var needShow by remember { + mutableStateOf(true) + } + if (!needShow){ + return + } + + Spacer(modifier = Modifier.height(10.dp)) + Surface( + modifier = Modifier + .wrapContentSize() + .fillMaxWidth(), + shape = RoundedCornerShape(20.dp), + color = bgColor + ) { + Column( + modifier = Modifier.padding( + start = 10.dp, + end = 10.dp + ) + ){ + Text( + text = todoItem.title, + color = Color.Black, + fontSize = 30.sp, + fontFamily = FontFamily.Monospace + ) + Row{ + Spacer(modifier = Modifier.weight(1f)) + Text( + text = todoItem.dueDate, + color = Color.Black, + fontSize = 20.sp, + fontFamily = FontFamily.SansSerif + ) + } + Row { + TextButton( + onClick = { + if (!todoItem.isCompleted){ + Toast.makeText( context, + context.getText(R.string.yes_not_finish) + ,Toast.LENGTH_SHORT).show() + }else{ + todoItem.isCompleted = false + loader.changeItem(todoItem) + bgColor = Blue100 + } + }, + shape = RoundedCornerShape(0), + modifier = Modifier.width(110.dp) + ) { + Text(text = context.getText(R.string.unfinish).toString()) + } + Spacer(modifier = Modifier.width(20.dp)) + TextButton( + onClick = { + if (todoItem.isCompleted){ + Toast.makeText( context, + context.getText(R.string.already_finish) + ,Toast.LENGTH_SHORT).show() + }else{ + todoItem.isCompleted = true + loader.changeItem(todoItem) + bgColor = Green100 + } + }, + shape = RoundedCornerShape(0), + modifier = Modifier.width(110.dp) + ) { + Text(text = context.getText(R.string.finish).toString()) + } + Spacer(modifier = Modifier.width(20.dp)) + TextButton( + onClick = { + when (deleteText){ + context.getText(R.string.first_delete).toString() -> + deleteText=context.getText(R.string.second_delete).toString() + else -> { + needShow = false + todoItem.MarkDeleted = true + loader.changeItem(todoItem) + } + } + }, + shape = RoundedCornerShape(0), + modifier = Modifier.width(110.dp) + ) { + Text( + text = deleteText + ) + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun TodoItemPreview(){ + val todoItem = TodoItem( + 0,"Test TODO Item","2024-04-30 11:45", + ) + val todoItem2 = TodoItem( + 1,"测试喵","2024-11-01 22:33",true + ) + Column { + TodoItemView(todoItem) + TodoItemView(todoItem2) + } +} + +fun NextPage(context:Context,item: TodoItem) { + val myIntent = Intent(context, AddPage::class.java) + myIntent.putExtra("ITEM",item.id) + ContextCompat.startActivity(context, myIntent, null) +} \ No newline at end of file diff --git a/app/src/main/java/uk/kagurach/android101/todoList/ui/theme/Color.kt b/app/src/main/java/uk/kagurach/android101/todoList/ui/theme/Color.kt new file mode 100644 index 0000000..c1c369d --- /dev/null +++ b/app/src/main/java/uk/kagurach/android101/todoList/ui/theme/Color.kt @@ -0,0 +1,10 @@ +package uk.kagurach.android101.todoList.ui.theme + +import androidx.compose.ui.graphics.Color + + +val Green100 = Color(0xFFC8E6C9) +val Blue100 = Color(0xFFBBDEFB) +val Red100 = Color(0xFFFFCDD2) +val LightBlue100 = Color(0xFFB2EBF2) +val Yellow100 = Color(0xFFFFF9C4) diff --git a/app/src/main/res/layout/activity_main2.xml b/app/src/main/res/layout/activity_main2.xml index 4325da4..4c1b748 100644 --- a/app/src/main/res/layout/activity_main2.xml +++ b/app/src/main/res/layout/activity_main2.xml @@ -86,7 +86,7 @@ android:orientation="horizontal"> + + Android 101 + 您已经完成了喵 + 呜呜您还没完成呢 + 做完了! + 还没好! + 修改您的TODO任务 + 标题 + 删除 + 确认删除 + 任务清单 + 启动任务清单 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b49a947..118bde4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,12 +1,24 @@ + TODO List + You have already finished❤️ + You haven\'t finished😇 + Finish + Not Finish + add_page + Edit Your TODO Item Here + Enter Title + Delete + Delete!! + Android101 - 你好,世界! - 下一页 - 单击下一页,长按上一页 - 测试文本 - 设置颜色 - 设置 - 设置文本 - 弱智计算器 - 退格 + 你好,世界! + 下一页 + 单击下一页,长按上一页 + 测试文本 + 设置颜色 + 设置 + 设置文本 + 弱智计算器 + 退格 + Open TODO \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index cf06cc9..ec70d6e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -13,4 +13,8 @@ ?attr/colorPrimaryVariant +