Bump hikage-core, hikage-extension, hikage-extension-betterandroid, hikage-extension-compose, hikage-compiler, hikage-widget-androidx, hikage-widget-material version to 1.0.0

This commit is contained in:
2025-04-20 05:32:06 +08:00
parent 794c535789
commit 99abe3cd18
218 changed files with 13256 additions and 627 deletions

View File

@@ -0,0 +1,60 @@
plugins {
autowire(libs.plugins.android.application)
autowire(libs.plugins.kotlin.android)
autowire(libs.plugins.kotlin.ksp)
}
android {
namespace = property.project.samples.app.packageName
compileSdk = property.project.android.compileSdk
defaultConfig {
applicationId = property.project.samples.app.packageName
minSdk = property.project.android.minSdk
targetSdk = property.project.android.targetSdk
versionName = property.project.samples.app.versionName
versionCode = property.project.samples.app.versionCode
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
signingConfig = signingConfigs.getByName("debug")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs = listOf(
"-Xno-param-assertions",
"-Xno-call-assertions",
"-Xno-receiver-assertions"
)
}
buildFeatures {
buildConfig = true
viewBinding = true
}
}
dependencies {
ksp(projects.hikageCompiler)
implementation(projects.hikageCore)
implementation(projects.hikageExtension)
implementation(projects.hikageExtensionBetterandroid)
implementation(projects.hikageWidgetAndroidx)
implementation(projects.hikageWidgetMaterial)
implementation(com.highcapable.pangutext.pangutext.android)
implementation(com.highcapable.betterandroid.ui.component)
implementation(com.highcapable.betterandroid.ui.extension)
implementation(com.highcapable.betterandroid.system.extension)
implementation(androidx.core.core.ktx)
implementation(androidx.appcompat.appcompat)
testImplementation(junit.junit)
androidTestImplementation(androidx.test.ext.junit)
androidTestImplementation(androidx.test.espresso.espresso.core)
}

46
samples/app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,46 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-ignorewarnings
-optimizationpasses 10
-dontusemixedcaseclassnames
-dontoptimize
-verbose
-overloadaggressively
-allowaccessmodification
-adaptclassstrings
-adaptresourcefilenames
-adaptresourcefilecontents
-renamesourcefileattribute P
-keepattributes SourceFile,Signature,LineNumberTable
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
public static *** throwUninitializedProperty(...);
public static *** throwUninitializedPropertyAccessException(...);
}
-keep class * extends android.app.Activity
-keep class * implements androidx.viewbinding.ViewBinding {
<init>();
*** inflate(android.view.LayoutInflater);
}

View File

@@ -0,0 +1,24 @@
package com.highcapable.hikage.demo
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.highcapable.hikage.demo", appContext.packageName)
}
}

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name=".DemoApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.DefaultAppTheme"
tools:targetApi="31">
<activity
android:name=".ui.MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,33 @@
/*
* Hikage - An Android responsive UI building tool.
* Copyright (C) 2019 HighCapable
* https://github.com/BetterAndroid/Hikage
*
* Apache License Version 2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is created by fankes on 2025/4/20.
*/
package com.highcapable.hikage.demo
import android.app.Application
import com.google.android.material.color.DynamicColors
class DemoApp : Application() {
override fun onCreate() {
super.onCreate()
DynamicColors.applyToActivitiesIfAvailable(this)
}
}

View File

@@ -0,0 +1,177 @@
/*
* Hikage - An Android responsive UI building tool.
* Copyright (C) 2019 HighCapable
* https://github.com/BetterAndroid/Hikage
*
* Apache License Version 2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is created by fankes on 2025/2/18.
*/
@file:Suppress("SetTextI18n", "PrivateResource")
package com.highcapable.hikage.demo.ui
import android.os.Bundle
import android.text.InputType
import android.widget.LinearLayout
import androidx.core.view.setPadding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.highcapable.betterandroid.ui.extension.view.textToString
import com.highcapable.betterandroid.ui.extension.view.toast
import com.highcapable.hikage.demo.R
import com.highcapable.hikage.demo.ui.base.BaseActivity
import com.highcapable.hikage.extension.setContentView
import com.highcapable.hikage.widget.android.widget.LinearLayout
import com.highcapable.hikage.widget.android.widget.TextView
import com.highcapable.hikage.widget.androidx.coordinatorlayout.widget.CoordinatorLayout
import com.highcapable.hikage.widget.com.google.android.material.appbar.MaterialToolbar
import com.highcapable.hikage.widget.com.google.android.material.button.MaterialButton
import com.highcapable.hikage.widget.com.google.android.material.card.MaterialCardView
import com.highcapable.hikage.widget.com.google.android.material.chip.ChipGroup
import com.highcapable.hikage.widget.com.google.android.material.materialswitch.MaterialSwitch
import com.highcapable.hikage.widget.com.google.android.material.textfield.TextInputEditText
import com.highcapable.hikage.widget.com.google.android.material.textfield.TextInputLayout
import com.highcapable.hikage.widget.com.highcapable.hikage.demo.ui.widget.CheckableChip
import android.R as Android_R
import com.google.android.material.R as Material_R
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView {
lateinit var usernameInput: TextInputEditText
lateinit var passwordInput: TextInputEditText
CoordinatorLayout(
lparams = LayoutParams(matchParent = true)
) {
MaterialToolbar(
lparams = LayoutParams(widthMatchParent = true),
init = {
title = stringResource(R.string.app_name)
}
)
LinearLayout(
lparams = LayoutParams(matchParent = true) {
topMargin = dimenResource(Material_R.dimen.m3_appbar_size_compact).toInt()
},
init = {
orientation = LinearLayout.VERTICAL
setPadding(16.dp)
}
) {
TextInputLayout(
lparams = LayoutParams(widthMatchParent = true),
init = {
hint = stringResource(R.string.text_username)
}
) {
usernameInput = TextInputEditText(
lparams = LayoutParams(widthMatchParent = true)
) {
isSingleLine = true
}
}
TextInputLayout(
lparams = LayoutParams(widthMatchParent = true) {
topMargin = 12.dp
},
init = {
hint = stringResource(R.string.text_password)
endIconMode = TextInputLayout.END_ICON_PASSWORD_TOGGLE
}
) {
passwordInput = TextInputEditText(
lparams = LayoutParams(widthMatchParent = true)
) {
isSingleLine = true
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
}
}
ChipGroup(
lparams = LayoutParams(widthMatchParent = true) {
topMargin = 16.dp
},
init = {
isSingleSelection = true
}
) {
repeat(2) { index ->
CheckableChip {
text = when (index) {
0 -> stringResource(R.string.text_gender_man)
else -> stringResource(R.string.text_gender_woman)
}
}
}
}
MaterialSwitch(
lparams = LayoutParams(widthMatchParent = true) {
topMargin = 16.dp
},
init = {
text = stringResource(R.string.text_enable_notification)
}
)
MaterialCardView(
lparams = LayoutParams(matchParent = true) {
topMargin = 16.dp
weight = 1f
}
) {
LinearLayout(
lparams = LayoutParams(matchParent = true),
init = {
orientation = LinearLayout.VERTICAL
setPadding(16.dp)
}
) {
TextView {
text = stringResource(R.string.text_welcome)
}
TextView(
lparams = LayoutParams {
topMargin = 8.dp
}
) {
text = stringResource(R.string.text_description)
}
}
}
MaterialButton(
lparams = LayoutParams(widthMatchParent = true) {
topMargin = 20.dp
}
) {
text = stringResource(R.string.text_submit)
setOnClickListener {
val username = usernameInput.textToString()
val password = passwordInput.textToString()
if (username.isNotEmpty() && password.isNotEmpty())
MaterialAlertDialogBuilder(this@MainActivity)
.setTitle(stringResource(R.string.login_info))
.setMessage(stringResource(R.string.login_info_description, username, password))
.setPositiveButton(stringResource(Android_R.string.ok), null)
.show()
else toast(stringResource(R.string.login_info_not_fill_tip))
}
}
}
}
}
}
}

View File

@@ -0,0 +1,36 @@
/*
* Hikage - An Android responsive UI building tool.
* Copyright (C) 2019 HighCapable
* https://github.com/BetterAndroid/Hikage
*
* Apache License Version 2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is created by fankes on 2025/3/12.
*/
package com.highcapable.hikage.demo.ui.base
import android.os.Bundle
import androidx.annotation.CallSuper
import com.highcapable.betterandroid.ui.component.activity.AppViewsActivity
import com.highcapable.pangutext.android.factory.PanguTextFactory2
abstract class BaseActivity : AppViewsActivity() {
@CallSuper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
PanguTextFactory2.inject(this)
}
}

View File

@@ -0,0 +1,59 @@
/*
* Hikage - An Android responsive UI building tool.
* Copyright (C) 2019 HighCapable
* https://github.com/BetterAndroid/Hikage
*
* Apache License Version 2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is created by fankes on 2025/3/12.
*/
@file:Suppress("SetTextI18n")
package com.highcapable.hikage.demo.ui.preview
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.widget.LinearLayout
import com.highcapable.hikage.core.base.Hikageable
import com.highcapable.hikage.core.preview.HikagePreview
import com.highcapable.hikage.widget.android.widget.Button
import com.highcapable.hikage.widget.android.widget.LinearLayout
import com.highcapable.hikage.widget.android.widget.TextView
class SamplePreview(context: Context, attrs: AttributeSet) : HikagePreview(context, attrs) {
override fun build() = Hikageable {
LinearLayout(
lparams = LayoutParams(matchParent = true),
init = {
orientation = LinearLayout.VERTICAL
gravity = Gravity.CENTER
}
) {
TextView {
text = "Hello, World!"
textSize = 20f
}
Button(
lparams = LayoutParams {
topMargin = 20.dp
}
) {
text = "Test Button"
}
}
}
}

View File

@@ -0,0 +1,41 @@
/*
* Hikage - An Android responsive UI building tool.
* Copyright (C) 2019 HighCapable
* https://github.com/BetterAndroid/Hikage
*
* Apache License Version 2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is created by fankes on 2025/4/20.
*/
@file:Suppress("PrivateResource")
package com.highcapable.hikage.demo.ui.widget
import android.content.Context
import android.util.AttributeSet
import com.google.android.material.R
import com.google.android.material.chip.Chip
import com.highcapable.betterandroid.ui.extension.component.base.getDrawableCompat
import com.highcapable.hikage.annotation.HikageView
@HikageView
class CheckableChip(context: Context, attrs: AttributeSet? = null) : Chip(context, attrs) {
init {
isCheckable = true
isCheckedIconVisible = true
checkedIcon = context.getDrawableCompat(R.drawable.ic_m3_chip_check)
}
}

View File

@@ -0,0 +1,41 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="512"
android:viewportHeight="512">
<group android:scaleX="0.52"
android:scaleY="0.52"
android:translateX="122.88"
android:translateY="122.88">
<path
android:pathData="M128,0L384,0A128,128 0,0 1,512 128L512,384A128,128 0,0 1,384 512L128,512A128,128 0,0 1,0 384L0,128A128,128 0,0 1,128 0z"
android:fillColor="#4EA16B"/>
<path
android:pathData="M124,220L155,220A24,24 0,0 1,179 244L179,275A24,24 0,0 1,155 299L124,299A24,24 0,0 1,100 275L100,244A24,24 0,0 1,124 220z"
android:fillColor="#ffffff"
android:fillAlpha="0.9"/>
<path
android:pathData="M139.5,315L139.5,315A39.5,39.5 0,0 1,179 354.5L179,354.5A39.5,39.5 0,0 1,139.5 394L139.5,394A39.5,39.5 0,0 1,100 354.5L100,354.5A39.5,39.5 0,0 1,139.5 315z"
android:fillColor="#ffffff"
android:fillAlpha="0.9"/>
<path
android:pathData="M126,118L386,118A30,30 0,0 1,416 148L416,174A30,30 0,0 1,386 204L126,204A30,30 0,0 1,96 174L96,148A30,30 0,0 1,126 118z"
android:fillColor="#ffffff"/>
<path
android:pathData="M250.83,235.58C249.61,235.74 248.43,236.13 247.36,236.75C246.28,237.36 245.33,238.18 244.57,239.15C243.81,240.13 243.25,241.25 242.93,242.44C242.6,243.64 242.52,244.88 242.68,246.11C242.84,247.34 243.24,248.52 243.86,249.6L260.34,278.47C232.52,295.06 214,324.38 214,357.7C214,359.81 214.07,361.92 214.22,364C214.8,372.17 221.61,378.5 229.81,378.5H396.19C404.5,378.5 411.29,372.02 411.79,363.85C411.93,361.82 412,359.76 412,357.7C412,324.38 393.48,295.06 365.66,278.47L382.14,249.6C382.76,248.52 383.16,247.34 383.32,246.11C383.48,244.88 383.4,243.64 383.07,242.44C382.75,241.25 382.19,240.13 381.43,239.15C380.67,238.18 379.72,237.36 378.64,236.75C377.57,236.13 376.39,235.74 375.17,235.58C373.95,235.42 372.71,235.5 371.52,235.83C370.33,236.15 369.21,236.71 368.24,237.47C367.27,238.23 366.45,239.17 365.85,240.24L348.65,270.38C337.58,266.32 325.56,264.1 313,264.1C300.44,264.1 288.42,266.32 277.35,270.38L260.15,240.24C259.55,239.17 258.73,238.23 257.76,237.47C256.79,236.71 255.67,236.15 254.48,235.83C253.29,235.5 252.05,235.42 250.83,235.58ZM286.6,328.45C286.6,334.22 281.92,338.9 276.15,338.9C270.38,338.9 265.7,334.22 265.7,328.45C265.7,322.68 270.38,318 276.15,318C281.92,318 286.6,322.68 286.6,328.45ZM349.85,338.9C355.62,338.9 360.3,334.22 360.3,328.45C360.3,322.68 355.62,318 349.85,318C344.08,318 339.4,322.68 339.4,328.45C339.4,334.22 344.08,338.9 349.85,338.9Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M149.85,146.13C148.68,144.96 146.78,144.96 145.61,146.13L132.88,158.86C132.29,159.45 132,160.22 132,160.99C132,161.76 132.29,162.54 132.88,163.13L145.61,175.86C146.78,177.03 148.68,177.03 149.85,175.86C151.02,174.68 151.02,172.79 149.85,171.61L139.23,160.99L149.85,150.37C151.02,149.2 151.02,147.3 149.85,146.13Z"
android:fillColor="#4EA16B"/>
<path
android:pathData="M138.76,160.99C138.76,159.34 140.1,157.99 141.76,157.99H183.76C185.41,157.99 186.76,159.34 186.76,160.99C186.76,162.65 185.41,163.99 183.76,163.99H141.76C140.1,163.99 138.76,162.65 138.76,160.99Z"
android:fillColor="#4EA16B"/>
<path
android:pathData="M362.15,146.13C363.32,144.96 365.22,144.96 366.39,146.13L379.12,158.86C379.71,159.45 380,160.22 380,160.99C380,161.76 379.71,162.54 379.12,163.13L366.39,175.86C365.22,177.03 363.32,177.03 362.15,175.86C360.98,174.68 360.98,172.79 362.15,171.61L372.77,160.99L362.15,150.37C360.98,149.2 360.98,147.3 362.15,146.13Z"
android:fillColor="#4EA16B"/>
<path
android:pathData="M373.24,160.99C373.24,159.34 371.9,157.99 370.24,157.99H328.24C326.59,157.99 325.24,159.34 325.24,160.99C325.24,162.65 326.59,163.99 328.24,163.99H370.24C371.9,163.99 373.24,162.65 373.24,160.99Z"
android:fillColor="#4EA16B"/>
</group>
</vector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -0,0 +1,4 @@
<resources>
<!-- Base application theme. -->
<style name="Base.Theme.DefaultAppTheme" parent="Theme.Material3.DayNight.NoActionBar" />
</resources>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hikage 演示</string>
<string name="text_username">用户名</string>
<string name="text_password">密码</string>
<string name="text_gender_man"></string>
<string name="text_gender_woman"></string>
<string name="text_enable_notification">启用通知</string>
<string name="text_description">如你所见,所有布局都通过代码动态创建,你可以在任何地方对布局进行自定义。</string>
<string name="text_submit">提交</string>
<string name="login_info">登录信息</string>
<string name="login_info_description">用户名:%1$s\n密码%1$s</string>
<string name="login_info_not_fill_tip">请填写所有内容</string>
<string name="text_welcome">欢迎使用 Hikage</string>
</resources>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="theme">#FF639F70</color>
<color name="background_day">#FFF5F5F5</color>
<color name="background_night">#FF2D2D2D</color>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#4EA16B</color>
</resources>

View File

@@ -0,0 +1,14 @@
<resources>
<string name="app_name">Hikage Demo</string>
<string name="text_username">Username</string>
<string name="text_password">Password</string>
<string name="text_gender_man">Man</string>
<string name="text_gender_woman">Woman</string>
<string name="text_enable_notification">Enable Notification</string>
<string name="text_description">As you can see, all layouts are created dynamically through code, and you can customize the layout anywhere.</string>
<string name="text_submit">Submit</string>
<string name="login_info">Login Info</string>
<string name="login_info_description">Username: %1$s\nPassword: %1$s</string>
<string name="login_info_not_fill_tip">Please fill in all fields</string>
<string name="text_welcome">Welcome to use Hikage!</string>
</resources>

View File

@@ -0,0 +1,6 @@
<resources>
<!-- Base application theme. -->
<style name="Base.Theme.DefaultAppTheme" parent="Theme.Material3.DayNight.NoActionBar" />
<style name="Theme.DefaultAppTheme" parent="Base.Theme.DefaultAppTheme" />
</resources>

View File

@@ -0,0 +1,17 @@
package com.highcapable.hikage.demo
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}