sivaprasad kuna
12/22/2025, 2:54 PMpackage com.example.jrmapp2
import android.accounts.Account
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.Spinner
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.credentials.CredentialManager
import androidx.credentials.GetCredentialRequest
import com.google.android.libraries.identity.googleid.GetGoogleIdOption
import androidx.credentials.exceptions.GetCredentialException
import androidx.credentials.exceptions.NoCredentialException
import com.google.android.libraries.identity.googleid.GetSignInWithGoogleOption
import androidx.lifecycle.lifecycleScope
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.drive.Drive
import com.google.api.services.drive.DriveScopes
import com.google.api.services.drive.model.File as DriveFile
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.ByteArrayOutputStream
class MainActivity : AppCompatActivity() {
private lateinit var driveService: Drive
private lateinit var spinner: Spinner
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
// Initialize UI components
spinner = findViewById(R.id.spinner)
val closeButton: Button = findViewById(R.id.closeButton)
val openButton: Button = findViewById(R.id.openButton)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
startGoogleSignIn()
closeButton.setOnClickListener { finish() }
openButton.setOnClickListener {
val intent = Intent(this, MainActivity2::class.java)
startActivity(intent)
}
}
private fun startGoogleSignIn() {
val credentialManager = CredentialManager.create(applicationContext)
// Replace with your actual Web Client ID from Google Cloud Console
val googleIdOption = GetGoogleIdOption.Builder()
.setServerClientId("515018532-pjgll997ds3r60mbg.apps.googleusercontent.com")
.setFilterByAuthorizedAccounts(false)
.build()
val request = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
lifecycleScope.launch {
try {
val result = credentialManager.getCredential(this@MainActivity,request)
val googleCred = GoogleIdTokenCredential.createFrom(result.credential.data)
// Get user account
val email = googleCred.id ?: "" // Using .id as the primary identifier
val account = Account(email, "com.google")
// --- START: ADDED CODE ---
// Display a success message to the user
withContext(Dispatchers.Main) {
Toast.makeText(
applicationContext,
"Successfully signed in as $email",
Toast.LENGTH_SHORT
).show()
}
// --- END: ADDED CODE -
// Initialize the Drive Service
driveService = getDriveService(this@MainActivity, account)
// Fetch files from a specific folder (replace 'root' or a specific ID)
fetchDriveFiles("1BYFxtbF9O1QEMpmzg-PcqU")
} catch (e: Exception) {
Log.e("Credential", "Sign-in failed", e)
}
}
}
private fun getDriveService(context: Context, account: Account): Drive {
val credential = GoogleAccountCredential.usingOAuth2(
//context, listOf(DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_METADATA_READONLY)
context, listOf(DriveScopes.DRIVE_READONLY) // Changed from DRIVE_FILE
)
credential.selectedAccount = account
return Drive.Builder(NetHttpTransport(), GsonFactory.getDefaultInstance(), credential)
.setApplicationName("JRM app2")
.build()
}
private fun fetchDriveFiles(folderId: String) {
lifecycleScope.launch(Dispatchers.IO) {
try {
val query = "'$folderId' in parents and trashed = false"
val result = driveService.files().list()
.setQ(query)
.setFields("files(id, name)")
.execute()
val files = result.files ?: emptyList()
withContext(Dispatchers.Main) {
updateSpinner(files)
}
} catch (e: Exception) {
Log.e("Drive", "Error fetching files", e)
}
}
}
private fun updateSpinner(fileList: List<DriveFile>) {
val fileNames = fileList.map { it.name ?: "Unknown File" }
val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, fileNames)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val selectedFileId = fileList[position].id
openDriveFile(selectedFileId)
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
}
private fun openDriveFile(fileId: String) {
lifecycleScope.launch(Dispatchers.IO) {
try {
val outputStream = ByteArrayOutputStream()
driveService.files().get(fileId).executeMediaAndDownloadTo(outputStream)
Log.d("Drive", "File downloaded, size: ${outputStream.size()}")
// Further processing of outputStream here
} catch (e: Exception) {
Log.e("Drive", "Error downloading file", e)
}
}
}
}