Plan
Free
Country
United States
Device
Android 14
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<activity
android:name=".ui.login.LoginActivity"
android:exported="true"
android:label="@string/title_activity_login">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
package com.example.myapplication.ui.login;
import android.app.Activity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.myapplication.R;
import com.example.myapplication.ui.login.LoginViewModel;
import com.example.myapplication.ui.login.LoginViewModelFactory;
import com.example.myapplication.databinding.ActivityLoginBinding;
import com.spotify.sdk.android.auth.AuthorizationClient;
import com.spotify.sdk.android.auth.AuthorizationRequest;
import com.spotify.sdk.android.auth.AuthorizationResponse;
public class LoginActivity extends AppCompatActivity
{
private LoginViewModel loginViewModel;
private ActivityLoginBinding binding;
//1st part of Logging In - Did not finish the Fingerprint so do not know if works
/**
* Request code will be used to verify if result comes from
* the login activity. Can be set to any integer.
*/
private static final int REQUEST_CODE = 1337;
private static final String REDIRECT_URI = "";
private static final String CLIENT_ID = "";
private void startSpotifyLogin()
{
try {
AuthorizationRequest.Builder builder =
new AuthorizationRequest.Builder(CLIENT_ID,
AuthorizationResponse.Type.TOKEN, REDIRECT_URI);
builder.setScopes(new String[]{"user-read-private", "playlist-read"});
AuthorizationRequest request = builder.build();
AuthorizationClient.openLoginActivity(this, REQUEST_CODE, request);
Log.d("Did it work","Yes");
} catch (Exception e){
e.getMessage();
Log.d("Did it work","No");
}
}
/**
* override onActivityResult
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
// Check if result comes from the correct activity
if (requestCode == REQUEST_CODE) {
AuthorizationResponse response = AuthorizationClient.getResponse(resultCode, intent);
Log.d("authentication","processing");
switch (response.getType()) {
// Response was successful and contains auth token
case TOKEN:
// Handle successful response
String accessToken = response.getAccessToken();
// Perform any necessary action with the access token, e.g., fetch user data
intent = new Intent(this, com.spotify.sdk.android.auth.LoginActivity.class);
intent.putExtra("access_token", accessToken);
startActivity(intent);
Toast.makeText(this, "Login successful!", Toast.LENGTH_SHORT).show();
Log.d("authentication","worked");
break;
// Auth flow returned an error
case ERROR:
// Handle error response
Log.d("authentication","did not worked");
Toast.makeText(this, "Login failed: " + response.getError(), Toast.LENGTH_SHORT).show();
break;
// Most likely auth flow was cancelled
default:
// Handle other cases
Log.d("authentication","function is running");
break;
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityLoginBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
loginViewModel = new ViewModelProvider(this, new LoginViewModelFactory())
.get(LoginViewModel.class);
final EditText usernameEditText = binding.username;
final EditText passwordEditText = binding.password;
final Button loginButton = binding.login;
final ProgressBar loadingProgressBar = binding.loading;
loginViewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() {
@Override
public void onChanged(@Nullable LoginFormState loginFormState) {
if (loginFormState == null) {
return;
}
loginButton.setEnabled(loginFormState.isDataValid());
if (loginFormState.getUsernameError() != null) {
usernameEditText.setError(getString(loginFormState.getUsernameError()));
}
if (loginFormState.getPasswordError() != null) {
passwordEditText.setError(getString(loginFormState.getPasswordError()));
}
}
});
loginViewModel.getLoginResult().observe(this, new Observer<LoginResult>() {
@Override
public void onChanged(@Nullable LoginResult loginResult) {
if (loginResult == null) {
return;
}
loadingProgressBar.setVisibility(View.GONE);
if (loginResult.getError() != null) {
showLoginFailed(loginResult.getError());
}
if (loginResult.getSuccess() != null) {
updateUiWithUser(loginResult.getSuccess());
}
setResult(Activity.RESULT_OK);
//Complete and destroy login activity once successful
finish();
}
});
TextWatcher afterTextChangedListener = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// ignore
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// ignore
}
@Override
public void afterTextChanged(Editable s) {
loginViewModel.loginDataChanged(usernameEditText.getText().toString(),
passwordEditText.getText().toString());
}
};
usernameEditText.addTextChangedListener(afterTextChangedListener);
passwordEditText.addTextChangedListener(afterTextChangedListener);
passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
loginViewModel.login(usernameEditText.getText().toString(),
passwordEditText.getText().toString());
}
return false;
}
});
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSpotifyLogin();
}
});
}
private void updateUiWithUser(LoggedInUserView model) {
String welcome = getString(R.string.welcome) + model.getDisplayName();
// TODO : initiate successful logged in experience
Toast.makeText(getApplicationContext(), welcome, Toast.LENGTH_LONG).show();
}
private void showLoginFailed(@StringRes Integer errorString) {
Toast.makeText(getApplicationContext(), errorString, Toast.LENGTH_SHORT).show();
}
}
My Question or Issue :
So my problem lies within actually clicking on the login button and connecting that button to my desired dashboard. When my Android studio runs, everything works perfectly when I click on the button, but when it transfers to the actual website it messes up. It just gives me a blank screen and nothing else. I tried everything and made sure that my redirect URI was connected to the dashboard and it was. I tried the log.d function in Android Studio and it worked, and I tried making sure that the redirect URI was working. Every time though, I would just get the same blank screen when I click on my login button. Some of the things that I did not add were adding the fingerprint and the package and I did not try the openToBrowser method instead. Any recommendations would be greatly appreciated because I was working on this yesterday for like 3 hours and nothing was working.