From 62f07e15d4b1f86fb8c4c61242cff2c0ab9b0a39 Mon Sep 17 00:00:00 2001 From: Lsong Date: Thu, 5 Sep 2024 16:08:15 +0800 Subject: [PATCH] update --- app/build.gradle | 46 ----- app/build.gradle.kts | 87 ++++++++++ app/src/main/AndroidManifest.xml | 5 +- .../main/java/org/lsong/launcher/Adapter.kt | 50 ------ .../main/java/org/lsong/launcher/AppBlock.kt | 9 - .../java/org/lsong/launcher/MainActivity.kt | 63 ++++--- .../java/org/lsong/launcher/MainScreen.kt | 163 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 39 ----- app/src/main/res/layout/item_app.xml | 34 ---- app/src/main/res/values/colors.xml | 7 - app/src/main/res/values/styles.xml | 17 -- app/src/main/res/values/themes.xml | 9 + build.gradle | 30 ---- gradle.properties | 15 +- gradle/libs.versions.toml | 37 ++++ gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 1 - settings.gradle.kts | 24 +++ 18 files changed, 361 insertions(+), 277 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 app/src/main/java/org/lsong/launcher/Adapter.kt delete mode 100644 app/src/main/java/org/lsong/launcher/AppBlock.kt create mode 100644 app/src/main/java/org/lsong/launcher/MainScreen.kt delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/item_app.xml delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml delete mode 100644 build.gradle create mode 100644 gradle/libs.versions.toml delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 29c964d..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,46 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' - -android { - namespace 'org.lsong.launcher' - - defaultConfig { - applicationId "org.lsong.launcher" - compileSdk 33 - minSdkVersion 33 - targetSdkVersion 33 - versionCode 4 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - - buildFeatures { - dataBinding true - viewBinding true - - } - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.core:core-ktx:1.2.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.recyclerview:recyclerview:1.1.0' -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..1b769ab --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,87 @@ +import java.io.FileInputStream +import java.util.Properties + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.compose.compiler) + alias(libs.plugins.kotlin.serialization) +} + +val keystorePropertiesFile = rootProject.file("key.properties") +val keystoreProperties = Properties() +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +android { + namespace = "org.lsong.launcher" + compileSdk = 34 + + defaultConfig { + applicationId = "org.lsong.launcher" + minSdk = 33 + targetSdk = 35 + versionCode = 5 + versionName = "1.2.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + + ndk { + abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86_64")) + } + } + + buildTypes { + release { + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + 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.kotlinx.collections.immutable) + implementation(libs.androidx.material.icons.extended) + + + 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 993afaa..95dacfc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,9 +13,10 @@ android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + > diff --git a/app/src/main/java/org/lsong/launcher/Adapter.kt b/app/src/main/java/org/lsong/launcher/Adapter.kt deleted file mode 100644 index 3aaf558..0000000 --- a/app/src/main/java/org/lsong/launcher/Adapter.kt +++ /dev/null @@ -1,50 +0,0 @@ -package org.lsong.launcher - -import android.content.Context -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import org.lsong.launcher.databinding.ItemAppBinding - -class Adapter( - private var context: Context -) : RecyclerView.Adapter() { - - lateinit var appBinding: ItemAppBinding - private var appList: List? = null - - inner class AppItemViewHolder( - val appBinding: ItemAppBinding - ) : RecyclerView.ViewHolder(appBinding.root) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppItemViewHolder { - val inflater = LayoutInflater.from(parent.context) - appBinding = ItemAppBinding.inflate(inflater, parent, false) - return AppItemViewHolder(appBinding) - } - - override fun getItemCount(): Int { - return appList?.size ?: 0 - } - - override fun onBindViewHolder(holder: AppItemViewHolder, position: Int) { - holder.appBinding.appIcon.setImageDrawable(appList?.get(position)?.icon) - holder.appBinding.appName.text = appList?.get(position)?.appName - holder.appBinding.root.setOnClickListener { - context.startActivity( - context.packageManager.getLaunchIntentForPackage( - appList?.get(position)?.packageName ?: "org.lsong.launcher" - ) - ) - } - } - - fun passAppList( - appsList: List - ) { - appList = appsList - notifyDataSetChanged() - } - -} - diff --git a/app/src/main/java/org/lsong/launcher/AppBlock.kt b/app/src/main/java/org/lsong/launcher/AppBlock.kt deleted file mode 100644 index f227735..0000000 --- a/app/src/main/java/org/lsong/launcher/AppBlock.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.lsong.launcher - -import android.graphics.drawable.Drawable - -data class AppBlock( - val appName: String, - val icon: Drawable, - val packageName: String -) \ No newline at end of file diff --git a/app/src/main/java/org/lsong/launcher/MainActivity.kt b/app/src/main/java/org/lsong/launcher/MainActivity.kt index 2fe20a8..5c7c488 100644 --- a/app/src/main/java/org/lsong/launcher/MainActivity.kt +++ b/app/src/main/java/org/lsong/launcher/MainActivity.kt @@ -2,46 +2,43 @@ package org.lsong.launcher import android.content.Intent import android.content.pm.PackageManager -import android.content.pm.PackageManager.ResolveInfoFlags import android.content.pm.ResolveInfo +import android.graphics.drawable.Drawable import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.StaggeredGridLayoutManager -import org.lsong.launcher.databinding.ActivityMainBinding +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +class MainActivity : ComponentActivity() { + private val appListManager by lazy { AppListManager(this) } -class MainActivity : AppCompatActivity() { - private lateinit var mainBinding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mainBinding = ActivityMainBinding.inflate(layoutInflater) - setContentView(mainBinding.root) - - // getInstalledApps - val appList = ArrayList() - - val intent = Intent(Intent.ACTION_MAIN, null) - intent.addCategory(Intent.CATEGORY_LAUNCHER) - - var flags = ResolveInfoFlags.of(PackageManager.MATCH_ALL.toLong()) - val activities = packageManager.queryIntentActivities(intent, flags) - for (resolveInfo in activities) { - if (resolveInfo.activityInfo.packageName == this.packageName) - continue - val app = AppBlock( - resolveInfo.loadLabel(packageManager).toString(), - resolveInfo.activityInfo.loadIcon(packageManager), - resolveInfo.activityInfo.packageName - ) - appList.add(app) + setContent { + MaterialTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = Color.Black.copy(alpha = 0.1f) + ) { + MainScreen(appListManager) + } + } } - mainBinding.appList.layoutManager = - StaggeredGridLayoutManager(1, LinearLayoutManager.VERTICAL) - mainBinding.appList.adapter = Adapter(this).also { - it.passAppList(appList.sortedWith { o1, o2 -> - o1?.appName?.compareTo(o2?.appName ?: "", true) ?: 0 - }) + } + + override fun onResume() { + super.onResume() + lifecycleScope.launch { + appListManager.refreshAppList() } } } diff --git a/app/src/main/java/org/lsong/launcher/MainScreen.kt b/app/src/main/java/org/lsong/launcher/MainScreen.kt new file mode 100644 index 0000000..76306aa --- /dev/null +++ b/app/src/main/java/org/lsong/launcher/MainScreen.kt @@ -0,0 +1,163 @@ +package org.lsong.launcher + +import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.graphics.drawable.Drawable +import android.text.format.DateFormat +import androidx.activity.ComponentActivity +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +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.graphics.Color +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.core.graphics.drawable.toBitmap +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import java.util.Calendar + + +@Composable +fun MainScreen(appListManager: AppListManager) { + val appList by appListManager.appList.collectAsState() + + LaunchedEffect(Unit) { + appListManager.refreshAppList() + } + + Column( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = 0.1f)) + .padding(32.dp, top = 64.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + ClockDisplay() + AppList(appList) + } +} + +@Composable +fun ClockDisplay() { + var currentTime by remember { mutableStateOf("") } + + LaunchedEffect(Unit) { + while (true) { + currentTime = DateFormat.format("h:mm a", Calendar.getInstance()).toString() + delay(60000) // Update every minute + } + } + + Text( + text = currentTime, + color = Color.White, + style = MaterialTheme.typography.displayMedium, + ) +} + +@Composable +fun AppList(appList: List) { + LazyColumn( + modifier = Modifier.fillMaxSize(), + contentPadding = PaddingValues(bottom = 64.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + items(appList, key = { it.packageName }) { app -> + AppItem(app = app) + } + } +} + +@Composable +fun AppItem(app: AppInfo) { + val context = LocalContext.current + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .clickable { + context.packageManager?.getLaunchIntentForPackage(app.packageName)?.let { + context.startActivity(it) + } + }, + ) { + Image( + bitmap = app.icon.toBitmap().asImageBitmap(), + contentDescription = "App Icon for ${app.name}", + modifier = Modifier.size(32.dp), + ) + Spacer(modifier = Modifier.width(16.dp)) + Text( + text = app.name, + color = Color.White, + style = MaterialTheme.typography.bodyLarge, + ) + } +} + +data class AppInfo( + val name: String, + val icon: Drawable, + val packageName: String, +) + +class AppListManager(private val context: ComponentActivity) { + private val _appList = MutableStateFlow>(emptyList()) + val appList = _appList.asStateFlow() + + fun refreshAppList() { + context.lifecycleScope.launch(Dispatchers.Default) { + _appList.value = getInstalledApps() + } + } + + private fun getInstalledApps(): List { + val packageManager = context.packageManager ?: return emptyList() + val intent = Intent(Intent.ACTION_MAIN, null).apply { + addCategory(Intent.CATEGORY_LAUNCHER) + } + val flags = PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL.toLong()) + return packageManager.queryIntentActivities(intent, flags) + .asSequence() + .filter { it.activityInfo.packageName != context.packageName } + .map { resolveInfo: ResolveInfo -> + AppInfo( + name = resolveInfo.loadLabel(packageManager).toString(), + icon = resolveInfo.activityInfo.loadIcon(packageManager), + packageName = resolveInfo.activityInfo.packageName + ) + } + .sortedBy { it.name.lowercase() } + .toList() + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 75bfa8e..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_app.xml b/app/src/main/res/layout/item_app.xml deleted file mode 100644 index d58eb2f..0000000 --- a/app/src/main/res/layout/item_app.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index dec0601..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - #6200EE - #3700B3 - #03DAC5 - #33000000 - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index 0da35f1..0000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..4acf0df --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 6ac9b97..0000000 --- a/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - kotlin_version = '1.8.22' - } - - - repositories { - google() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.1.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - jcenter() - - } - -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/gradle.properties b/gradle.properties index 9e73ebc..20e2a01 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,19 +6,18 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..931216b --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,37 @@ +[versions] +agp = "8.5.2" +kotlin = "2.0.0" +coreKtx = "1.13.1" +junit = "4.13.2" +junitVersion = "1.2.1" +espressoCore = "3.6.1" +kotlinxCollectionsImmutable = "0.3.7" +lifecycleRuntimeKtx = "2.8.5" +activityCompose = "1.9.2" +composeBom = "2024.09.00" + +[libraries] +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-material3 = { module = "androidx.compose.material3:material3" } +kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } +androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 877d5d3..9d96b41 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Aug 08 18:22:45 CST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index e7b4def..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..1e1f8e6 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "Fresh Launcher" +include(":app") + \ No newline at end of file