From a218600761efe18e75da498b945c781613d27f43 Mon Sep 17 00:00:00 2001 From: AlbYoda Date: Tue, 11 Mar 2025 17:52:14 +0100 Subject: [PATCH] OAuth flow almost fully implemented (thanks to AppAuth). Persistence of AuthState is still to do. --- app/build.gradle.kts | 12 ++ app/src/main/AndroidManifest.xml | 37 ++++- .../com/bbc/denadrive/HomeNotAuthActivity.kt | 128 ++++++++++++++++++ .../java/com/bbc/denadrive/MainActivity.kt | 65 ++++++++- .../main/java/com/bbc/denadrive/MyNavGraph.kt | 3 +- .../java/com/bbc/denadrive/TestActivity.kt | 86 ++++++++++++ .../main/java/com/bbc/denadrive/TestBah.kt | 87 ++++++++++++ .../com/bbc/denadrive/home/DebugScreens.kt | 33 ++--- .../denadrive/oauth/AppAuthImplementation.kt | 11 ++ .../denadrive/oauth/AuthStatePersistence.kt | 2 + .../bbc/denadrive/oauth/OAuthConfiguration.kt | 19 --- app/src/main/res/values/strings.xml | 4 + gradle/libs.versions.toml | 19 +-- settings.gradle.kts | 1 - 14 files changed, 441 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/bbc/denadrive/HomeNotAuthActivity.kt create mode 100644 app/src/main/java/com/bbc/denadrive/TestActivity.kt create mode 100644 app/src/main/java/com/bbc/denadrive/TestBah.kt create mode 100644 app/src/main/java/com/bbc/denadrive/oauth/AppAuthImplementation.kt create mode 100644 app/src/main/java/com/bbc/denadrive/oauth/AuthStatePersistence.kt delete mode 100644 app/src/main/java/com/bbc/denadrive/oauth/OAuthConfiguration.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6d5a56b..a78e517 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,6 +16,7 @@ android { versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + manifestPlaceholders["appAuthRedirectScheme"] = "com.bbc.denadrive" } buildTypes { @@ -37,6 +38,9 @@ android { buildFeatures { compose = true } + packaging { + resources.excludes.add("META-INF-DEPENDENCIES") + } } dependencies { @@ -59,6 +63,14 @@ dependencies { implementation(libs.androidx.navigation.compose) + implementation(libs.okhttp) + implementation(libs.retrofit) + implementation(libs.converter.gson) + implementation(libs.appauth) + implementation(libs.androidx.security.crypto) + + + // implementation(libs.google.api.client.android) // implementation(libs.google.api.services.drive) // implementation(libs.google.oauth.client.jetty) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e309530..1857486 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ - + + + + + + + + + - - + + - - + + + + + + + + + + + + + diff --git a/app/src/main/java/com/bbc/denadrive/HomeNotAuthActivity.kt b/app/src/main/java/com/bbc/denadrive/HomeNotAuthActivity.kt new file mode 100644 index 0000000..5060902 --- /dev/null +++ b/app/src/main/java/com/bbc/denadrive/HomeNotAuthActivity.kt @@ -0,0 +1,128 @@ +package com.bbc.denadrive + +import android.app.PendingIntent +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.net.toUri +import com.bbc.denadrive.oauth.retrieveAuthServConf +import com.bbc.denadrive.ui.theme.DeNaDriveTheme +import net.openid.appauth.AuthorizationRequest +import net.openid.appauth.AuthorizationService +import net.openid.appauth.ResponseTypeValues + +class HomeNotAuthActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enableEdgeToEdge() + setContent { + DeNaDriveTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + val logo = painterResource(id = R.drawable.vecchiaicona_) + LogoWithCaptionAndButton ( + logo = logo, + caption = "Android", + buttonText = "PressMe", + modifier = Modifier.padding(innerPadding) + ) { handleAuthStuff() } + } + } + } + } + + private fun handleAuthStuff() { + val serviceConfig = retrieveAuthServConf() +// val authState = AuthState(serviceConfig) + val authRequestBuilder = AuthorizationRequest.Builder( + serviceConfig, + "722393551256-pum20gbvb1es723kt3ek9lmtrdimr0os.apps.googleusercontent.com", + ResponseTypeValues.CODE, + "com.bbc.denadrive:/oauth2redirect".toUri() + ) + val authRequest = authRequestBuilder + .setScope("https://www.googleapis.com/auth/drive") + .build() + + val authService = AuthorizationService(this) + authService.performAuthorizationRequest( + authRequest, + PendingIntent.getActivity(this, 0, Intent(this, MainActivity::class.java), + PendingIntent.FLAG_MUTABLE), + PendingIntent.getActivity(this, 0, Intent(this, HomeNotAuthActivity::class.java), + PendingIntent.FLAG_MUTABLE) + ) + } +} + +@Composable +fun Greeting4(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview4() { + DeNaDriveTheme { + Greeting4("Android") + } +} + +@Composable +fun LogoWithCaptionAndButton( + logo: Painter, // This will be your SVG logo + caption: String, + buttonText: String, + modifier: Modifier, + onButtonClick: () -> Unit +) { + Column( + modifier = modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + // Logo + Image( + painter = logo, + contentDescription = "Logo", + modifier = Modifier.size(100.dp) // Adjust size as needed + ) + + Spacer(modifier = Modifier.height(16.dp)) // Space between logo and caption + + // Caption + Text(text = caption) + + Spacer(modifier = Modifier.height(16.dp)) // Space between caption and button + + // Button + Button(onClick = onButtonClick) { + Text(text = buttonText) + } + } +} diff --git a/app/src/main/java/com/bbc/denadrive/MainActivity.kt b/app/src/main/java/com/bbc/denadrive/MainActivity.kt index 8adc934..ef5a777 100644 --- a/app/src/main/java/com/bbc/denadrive/MainActivity.kt +++ b/app/src/main/java/com/bbc/denadrive/MainActivity.kt @@ -1,26 +1,36 @@ package com.bbc.denadrive +import android.app.PendingIntent +import android.content.Intent import android.os.Bundle +import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.core.net.toUri import androidx.navigation.compose.rememberNavController +import com.bbc.denadrive.home.ScaffoldWithSidebar +import com.bbc.denadrive.oauth.retrieveAuthServConf import com.bbc.denadrive.ui.theme.DeNaDriveTheme +import net.openid.appauth.AuthorizationException +import net.openid.appauth.AuthorizationRequest +import net.openid.appauth.AuthorizationResponse +import net.openid.appauth.AuthorizationService +import net.openid.appauth.ResponseTypeValues class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { +override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) +// handleAuthStuff() + setContent { val navController = rememberNavController() - NavigationGraph(navController) + ScaffoldWithSidebar(navController) { } +// NavigationGraph(navController) } // enableEdgeToEdge() // setContent { @@ -34,6 +44,49 @@ class MainActivity : ComponentActivity() { // } // } } + + + private fun handleAuthStuff() { + val serviceConfig = retrieveAuthServConf() +// val authState = AuthState(serviceConfig) + val authRequestBuilder = AuthorizationRequest.Builder( + serviceConfig, + "722393551256-pum20gbvb1es723kt3ek9lmtrdimr0os.apps.googleusercontent.com", + ResponseTypeValues.CODE, + "com.bbc.denadrive:/oauth2redirect".toUri() + ) + val authRequest = authRequestBuilder + .setScope("https://www.googleapis.com/auth/drive") + .build() + + val authService = AuthorizationService(this) + authService.performAuthorizationRequest( + authRequest, + PendingIntent.getActivity(this, 0, Intent(this, TestActivity::class.java), + PendingIntent.FLAG_MUTABLE), + PendingIntent.getActivity(this, 0, Intent(this, TestBah::class.java), + PendingIntent.FLAG_MUTABLE) + ) + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + val resp = AuthorizationResponse.fromIntent(intent) + val ex = AuthorizationException.fromIntent(intent) + if (resp != null) { + Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show() + } + else { + if (ex != null) { + Toast.makeText(this, "NOPE ${ex.error}", Toast.LENGTH_SHORT).show() + } + } + + setContent { + val navController = rememberNavController() + ScaffoldWithSidebar(navController) { } + } + } } @Composable diff --git a/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt b/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt index 47b7dc9..171a3e9 100644 --- a/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt +++ b/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt @@ -6,7 +6,6 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.bbc.denadrive.home.DetailsScreen import com.bbc.denadrive.home.HomeScreen -import com.bbc.denadrive.home.ScaffoldWithSidebar import com.bbc.denadrive.home.MyListVisualizer @Composable @@ -24,6 +23,6 @@ fun NavigationGraph(navController: NavHostController) { DetailsScreen(itemId, navController) } - composable("prova") { ScaffoldWithSidebar { lista -> MyListVisualizer(lista) } } + composable("prova") { MyListVisualizer() } } } diff --git a/app/src/main/java/com/bbc/denadrive/TestActivity.kt b/app/src/main/java/com/bbc/denadrive/TestActivity.kt new file mode 100644 index 0000000..501d129 --- /dev/null +++ b/app/src/main/java/com/bbc/denadrive/TestActivity.kt @@ -0,0 +1,86 @@ +package com.bbc.denadrive + +import android.app.PendingIntent +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.core.net.toUri +import com.bbc.denadrive.oauth.retrieveAuthServConf +import com.bbc.denadrive.ui.theme.DeNaDriveTheme +import net.openid.appauth.AuthorizationException +import net.openid.appauth.AuthorizationRequest +import net.openid.appauth.AuthorizationResponse +import net.openid.appauth.AuthorizationService +import net.openid.appauth.ResponseTypeValues + +class TestActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val resp = AuthorizationResponse.fromIntent(intent) + val ex = AuthorizationException.fromIntent(intent) + if (resp != null) { + Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show() + } + else { + if (ex != null) { + Toast.makeText(this, "NOPE ${ex.error}", Toast.LENGTH_SHORT).show() + } + } + + enableEdgeToEdge() + setContent { + DeNaDriveTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting2( + name = "Android2", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + + enableEdgeToEdge() + setContent { + DeNaDriveTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting2( + name = "Android45", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } + +} + +@Composable +fun Greeting2(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview2() { + DeNaDriveTheme { + Greeting2("Android") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bbc/denadrive/TestBah.kt b/app/src/main/java/com/bbc/denadrive/TestBah.kt new file mode 100644 index 0000000..9958ad9 --- /dev/null +++ b/app/src/main/java/com/bbc/denadrive/TestBah.kt @@ -0,0 +1,87 @@ +package com.bbc.denadrive + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.bbc.denadrive.ui.theme.DeNaDriveTheme +import net.openid.appauth.AuthorizationException +import net.openid.appauth.AuthorizationResponse + +class TestBah : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val resp = AuthorizationResponse.fromIntent(intent) + val ex = AuthorizationException.fromIntent(intent) + if (resp != null) { + Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show() + } + else { + if (ex != null) { + Toast.makeText(this, "NOPE ${ex.error}", Toast.LENGTH_SHORT).show() + } + } + + enableEdgeToEdge() + setContent { + DeNaDriveTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting3( + name = "Android4", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + val resp = AuthorizationResponse.fromIntent(intent) + val ex = AuthorizationException.fromIntent(intent) + if (resp != null) { + Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show() + } + else { + if (ex != null) { + Toast.makeText(this, "NOPE ${ex.error}", Toast.LENGTH_SHORT).show() + } + } + setContent { + DeNaDriveTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting3( + name = "Android12", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } +} + +@Composable +fun Greeting3(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview3() { + DeNaDriveTheme { + Greeting3("Android") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt b/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt index 99ef1f8..5503a02 100644 --- a/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt +++ b/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt @@ -6,18 +6,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.navigation.NavHostController -//import androidx.compose.foundation.background -//import androidx.compose.foundation.clickable -//import androidx.compose.foundation.layout.* -//import androidx.compose.material3.* -//import androidx.compose.runtime.* -//import androidx.compose.ui.Alignment -//import androidx.compose.ui.Modifier -//import androidx.compose.ui.graphics.Color -//import androidx.compose.ui.unit.dp -//import androidx.compose.ui.unit.sp - -//import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -35,10 +23,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import kotlinx.coroutines.launch import androidx.compose.foundation.lazy.items - -//import androidx.compose.material3.icons.Icons -//import androidx.compose.material3.icons.filled.Menu -//import androidx.compose.material3.icons.filled.MoreVert +import com.bbc.denadrive.NavigationGraph @Composable fun HomeScreen(navController: NavHostController) { @@ -56,14 +41,14 @@ fun DetailsScreen(itemId: String?, navController: NavHostController) { @OptIn(ExperimentalMaterial3Api::class) @Composable fun ScaffoldWithSidebar( - toBeDisplayed: @Composable (List) -> Unit + navController: NavHostController, + doIt: () -> Unit, +// toBeDisplayed: @Composable () -> Unit ) { // State to control the drawer val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() - val lista = listOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",) - // ModalNavigationDrawer ModalNavigationDrawer( drawerState = drawerState, @@ -99,7 +84,7 @@ fun ScaffoldWithSidebar( } }, actions = { - IconButton(onClick = { /* Handle settings click */ }) { + IconButton(onClick = { doIt() }) { // Icon for the settings (three vertical dots) Icon(Icons.Filled.MoreVert, contentDescription = "Settings") } @@ -114,7 +99,8 @@ fun ScaffoldWithSidebar( .padding(16.dp), contentAlignment = Alignment.Center ) { - toBeDisplayed(lista) + NavigationGraph(navController) +// toBeDisplayed() // Text("Main Content", fontSize = 24.sp) } } @@ -158,9 +144,8 @@ fun RectangularButton( } @Composable -fun MyListVisualizer ( - lista: List -) { +fun MyListVisualizer () { + val lista = listOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") LazyColumn { items(lista) { messaggio -> Text(text=messaggio, fontSize = 30.sp) } } diff --git a/app/src/main/java/com/bbc/denadrive/oauth/AppAuthImplementation.kt b/app/src/main/java/com/bbc/denadrive/oauth/AppAuthImplementation.kt new file mode 100644 index 0000000..5d82e96 --- /dev/null +++ b/app/src/main/java/com/bbc/denadrive/oauth/AppAuthImplementation.kt @@ -0,0 +1,11 @@ +package com.bbc.denadrive.oauth + +import androidx.core.net.toUri +import net.openid.appauth.AuthorizationServiceConfiguration + +fun retrieveAuthServConf(): AuthorizationServiceConfiguration { + return AuthorizationServiceConfiguration( + "https://accounts.google.com/o/oauth2/v2/auth".toUri(), + "https://oauth2.googleapis.com/token".toUri() + ) +} diff --git a/app/src/main/java/com/bbc/denadrive/oauth/AuthStatePersistence.kt b/app/src/main/java/com/bbc/denadrive/oauth/AuthStatePersistence.kt new file mode 100644 index 0000000..80b0e7d --- /dev/null +++ b/app/src/main/java/com/bbc/denadrive/oauth/AuthStatePersistence.kt @@ -0,0 +1,2 @@ +package com.bbc.denadrive.oauth + diff --git a/app/src/main/java/com/bbc/denadrive/oauth/OAuthConfiguration.kt b/app/src/main/java/com/bbc/denadrive/oauth/OAuthConfiguration.kt deleted file mode 100644 index 1584654..0000000 --- a/app/src/main/java/com/bbc/denadrive/oauth/OAuthConfiguration.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.bbc.denadrive.oauth - -data class OAuthConfiguration( - val clientId: String, - val scopes: List, - val authorizationEndpoint: String, - val tokenEndpoint: String, - val redirectUri: String, -) - -//private fun createOAuthConfiguration(): OAuthConfiguration { -// return OAuthConfiguration( -// clientId = "722393551256-0v563ati4pc9rjc9p948sg418trqq998.apps.googleusercontent.com", -// scopes = listOf("https://mail.google.com/"), -// authorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth", -// tokenEndpoint = "https://oauth2.googleapis.com/token", -// redirectUri = "${BuildConfig.APPLICATION_ID}:/oauth2redirect", -// ) -//} \ 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 8eebf56..7a4ba83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,7 @@ DeNa Drive + TestActivity + TestBah + Speremm + HomeNotAuthActivity \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e781c00..c35a82c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,7 @@ [versions] agp = "8.9.0" -googleApiClientAndroid = "1.32.1" -googleApiServicesDrive = "v3-rev20210830-1.32.1" -googleOauthClientJetty = "1.32.1" +appauth = "0.11.1" +converterGson = "2.9.0" kotlin = "2.0.21" coreKtx = "1.15.0" junit = "4.13.2" @@ -10,16 +9,17 @@ junitVersion = "1.2.1" espressoCore = "3.6.1" lifecycleRuntimeKtx = "2.8.7" activityCompose = "1.10.1" -composeBom = "2024.09.00" +composeBom = "2025.02.00" navigationCompose = "2.8.8" -playServicesAuth = "21.3.0" +okhttp = "4.9.1" +securityCrypto = "1.1.0-alpha06" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" } -google-api-client-android = { module = "com.google.api-client:google-api-client-android", version.ref = "googleApiClientAndroid" } -google-api-services-drive = { module = "com.google.apis:google-api-services-drive", version.ref = "googleApiServicesDrive" } -google-oauth-client-jetty = { module = "com.google.oauth-client:google-oauth-client-jetty", version.ref = "googleOauthClientJetty" } +androidx-security-crypto = { module = "androidx.security:security-crypto", version.ref = "securityCrypto" } +appauth = { module = "net.openid:appauth", version.ref = "appauth" } +converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" } 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" } @@ -33,7 +33,8 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin 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 = { group = "androidx.compose.material3", name = "material3" } -play-services-auth = { module = "com.google.android.gms:play-services-auth", version.ref = "playServicesAuth" } +okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "converterGson" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/settings.gradle.kts b/settings.gradle.kts index dec944c..1755468 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,7 +5,6 @@ pluginManagement { includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.google.*") includeGroupByRegex("androidx.*") - includeGroupByRegex(".*drive.*") } } mavenCentral()