Git Product home page Git Product logo

shobhitpuri / custom-google-signin-button Goto Github PK

View Code? Open in Web Editor NEW
78.0 2.0 25.0 433 KB

A custom SignInButton for Android that supports 'android:text' attribute, currently not supported by Google's original 'SignInButton'. This library also allows to set button theme to dark or light and is based on Google guidelines.

Home Page: http://go.shobhitpuri.com/googlesignin

License: MIT License

Java 100.00%
android android-library android-button google-signin google-oauth2 custom-button google-plus-login google-login android-ui android-libraries

custom-google-signin-button's People

Contributors

hahn avatar imprakharshukla avatar shobhitpuri avatar vkotovv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

custom-google-signin-button's Issues

Translation

Hi and thanks for your lib.

How can I have access to translations of the signin text ?

Caused by android.content.res.Resources$NotFoundException

Hello guys,
I have issue with out framework. Could you please check stackstrace and say what i'm doing wrong

package app.autobook.ui.login;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;

import com.google.android.gms.common.api.ApiException;

import com.google.android.gms.tasks.Task;
import com.shobhitpuri.custombuttons.GoogleSignInButton;

import java.util.HashMap;
import java.util.Map;

import app.autobook.R;
import app.autobook.common.KeyboardHelper;
import app.autobook.common.Loading;
import app.autobook.common.NotificationHelper;
import app.autobook.common.StateData;
import app.autobook.common.Statistics;
import app.autobook.entity.rest.Message;
import app.autobook.ui.login.model.LoginViewModel;
import timber.log.Timber;

public class AuthFragment extends Fragment {
    private View rootView;
    private EditText usernameInput;
    private EditText passwordInput;
    private LoginViewModel loginViewModel;
    private Button loginBtn;
    private GoogleSignInButton googleSignInBtn;
    public static final int RC_SIGN_IN = 0;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Timber.d( "onCreateView");
        rootView =  inflater.inflate(R.layout.fragment_login_auth, container, false);
        loginBtn = rootView.findViewById(R.id.btn_login);
        loginViewModel = new ViewModelProvider(requireActivity()).get(LoginViewModel.class);
        googleSignInBtn = rootView.findViewById(R.id.google_sign_in_btn);

        return rootView;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Timber.d("onViewCreated");

        loginViewModel.getAuthenticationState().observe(getViewLifecycleOwner(), authenticationState -> {
            if (authenticationState.getStatus().equals(StateData.DataStatus.LOADING)){
                Loading.show(requireActivity());
            }else{
                Loading.hide(requireActivity());
                googleSignInBtn.setEnabled(true);
            }

            if (authenticationState.getStatus().equals(StateData.DataStatus.SUCCESS)){
                Statistics.logEvent("AUTH: "+authenticationState.getData());
                if(authenticationState.getData()!=null && authenticationState.getData().equals(LoginViewModel.AuthenticationState.AUTHENTICATED)){
                    Navigation.findNavController(view).navigate(R.id.workspaceFragment);
                }else{
                    NotificationHelper.showSnackbar(authenticationState.getData().toString(), view);
                }
            }else if (authenticationState.getStatus().equals(StateData.DataStatus.ERROR)){
                NotificationHelper.errorScreen(view,authenticationState,"getStatus()",this.getClass());
            }
        });

        loginViewModel.getTokenState().observe(getViewLifecycleOwner(), tokenState -> {
            if (tokenState.getStatus().equals(StateData.DataStatus.LOADING)){
                Loading.show(requireActivity());
            }else{
                Loading.hide(requireActivity());
                googleSignInBtn.setEnabled(true);
            }
            if (tokenState.getStatus().equals(StateData.DataStatus.SUCCESS)){
                Message message = tokenState.getData();
                Timber.i("token status code: '%s'", message.getCode());

                Map<String, String> property = new HashMap<>();
                property.put("code",  Integer.toString(message.getCode()));
                property.put("message",  message.getMessage().toString());

                if (message.getCode()==1){
                    Statistics.logEvent("AUTH: SUCCESS TOKEN");
                    NotificationHelper.showSnackbar("Авторизация проверена", view);
                }else if (message.getCode()==-10004 || message.getCode()==-10005){
                    property.put("code",  Integer.toString(message.getCode()));
                    Statistics.logEvent("AUTH: TOKEN ERROR", property);
                    NotificationHelper.showSnackbar("Google не подтвердил вашу авторизацию", view);
                }else if (message.getCode()==-10006){
                    Statistics.logEvent("AUTH: TOKEN ERROR", property);
                    NotificationHelper.showSnackbar("Авторизация устарела", view);
                }else if (message.getCode()==-10007){
                    Statistics.logEvent("AUTH: TOKEN ERROR", property);
                    NotificationHelper.showSnackbar("Почта не подтверждена", view);
                }else{
                    Statistics.logEvent("AUTH: TOKEN ERROR", property);
                    NotificationHelper.showSnackbar("Не известный код ответа: "+message.getCode(), view);
                }

            }else if (tokenState.getStatus().equals(StateData.DataStatus.ERROR)){
                NotificationHelper.errorScreen(view,tokenState,"getTokenState()",this.getClass());
            }
        });

        init(view);
    }

    private void init(View view) {
        usernameInput = view.findViewById(R.id.username);
        passwordInput = view.findViewById(R.id.password);
        usernameInput.setText(loginViewModel.getUsername());
        passwordInput.setText(loginViewModel.getPassword());

        //Обработка кнопки "Войти с Google"
        googleSignInBtn.setOnClickListener(v -> {
            Timber.i("OnClick: google_btn_login");
            Statistics.logEvent("AUTH: Google OnClick");
            googleSignInBtn.setEnabled(false);
            Intent signInIntent = loginViewModel.googleSignInClient.getSignInIntent();
            startActivityForResult(signInIntent, RC_SIGN_IN);
        });

        //Обработка кнопки "Войти"
        loginBtn.setOnClickListener(v -> {
            Timber.i("OnClick: btn_login");
            Statistics.logEvent("AUTH: Login OnClick");
            KeyboardHelper.hide(requireActivity());
            String username = usernameInput.getText().toString().toLowerCase().trim();
            String password = passwordInput.getText().toString().trim();
            loginViewModel.authenticate(username, password);
        });

        //Обработка кнопки "Забыли пароль"
        view.findViewById(R.id.btn_fogot).setOnClickListener(v -> {
            Timber.i("OnClick: btn_fogot");
            Statistics.logEvent("AUTH: Forget OnClick");
            Navigation.findNavController(v).navigate(R.id.forgetFragment);
        });

        //Обработка кнопки "Зарегистрироватся"
        view.findViewById(R.id.btn_registration).setOnClickListener(v -> {
            Timber.i("OnClick: btn_registration");
            Statistics.logEvent("AUTH: Registration OnClick");
            Navigation.findNavController(v).navigate(R.id.registrationFragment);
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                GoogleSignInAccount account = task.getResult(ApiException.class);
                loginViewModel.authenticateByToken(account);
            } catch (ApiException e) {
                googleSignInBtn.setEnabled(true);
                Statistics.logEvent("AUTH: Google canceled");
                Timber.e(e);
                //NotificationHelper.errorScreen(rootView,authenticationState,"getStatus()",this.getClass());
            }
        }
    }
}
Caused by android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f070068
       at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:255)
       at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:785)
       at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:631)
       at android.content.res.Resources.loadDrawable(Resources.java:897)
       at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:955)
       at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
       at android.content.res.XResources$XTypedArray.getDrawable(XResources.java:1374)
       at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:177)
       at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:122)
       at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
       at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
       at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
       at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:833)
       at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:631)
       at android.content.res.Resources.getDrawableForDensity(Resources.java:888)
       at android.content.res.XResources.getDrawableForDensity(XResources.java:874)
       at android.content.res.Resources.getDrawable(Resources.java:827)
       at android.content.res.XResources.getDrawable(XResources.java:796)
       at android.content.Context.getDrawable(Context.java:626)
       at android.view.View.setBackgroundResource(View.java:21451)
       at androidx.appcompat.widget.AppCompatButton.setBackgroundResource(AppCompatButton.java:88)
       at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonBackground(GoogleSignInButton.java:160)
       at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonParams(GoogleSignInButton.java:143)
       at com.shobhitpuri.custombuttons.GoogleSignInButton.init(GoogleSignInButton.java:100)
       at com.shobhitpuri.custombuttons.GoogleSignInButton.<init>(GoogleSignInButton.java:77)
       at java.lang.reflect.Constructor.newInstance0(Constructor.java)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
       at android.view.LayoutInflater.createView(LayoutInflater.java:647)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
       at EdHooker_.hook(:186)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
       at EdHooker_.hook(:156)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
       at app.autobook.ui.login.AuthFragment.onCreateView(AuthFragment.java:51)
       at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
       at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
       at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
       at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
       at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
       at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
       at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
       at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:6669)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

com.shobhitpuri.custombuttons.GoogleSignInButton cannot be cast to com.google.android.gms.common.SignInButton

I have followed instructions on the mainpage , imported the packages did adjustments to xml file.
Then I have do such things in my java file

view.findViewById(R.id.sign_in_button).setOnClickListener(this);
SignInButton signInButton = (SignInButton) view.findViewById(R.id.sign_in_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);
signInButton.setColorScheme(SignInButton.COLOR_LIGHT);
}

then it give me error by the time I wanna open the page contains this google login button

com.shobhitpuri.custombuttons.GoogleSignInButton cannot be cast to com.google.android.gms.common.SignInButton

Suport RTL

can you support RTL in your button google logo should be in the right of the button

drawable files are not accessible in Android 11. adding support for android 11?

Hi there, when deploying my app to production, i have seen this error in crashlytics happening to a user having an Android 11 Pixel 4 XL device. here is the error exception:

Caused by android.content.res.Resources$NotFoundException: File res/drawable/dark_theme_google_icon_selector.xml from drawable resource ID #0x7f080082
   at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:876)
   at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:659)
   at android.content.res.Resources.getDrawableForDensity(Resources.java:906)
   at android.content.res.Resources.getDrawable(Resources.java:845)
   at android.content.Context.getDrawable(Context.java:687)
   at android.view.View.setBackgroundResource(View.java:22717)
   at androidx.appcompat.widget.AppCompatButton.setBackgroundResource(AppCompatButton.java:84)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonBackground(GoogleSignInButton.java:160)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonParams(GoogleSignInButton.java:143)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.init(GoogleSignInButton.java:100)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.<init>(GoogleSignInButton.java:77)
   at java.lang.reflect.Constructor.newInstance0(Constructor.java)
   at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
   at android.view.LayoutInflater.createView(LayoutInflater.java:854)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:481)
   at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
   at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
   at com.chlegou.bitbot.activity.MainActivity.onCreate(MainActivity.java:92)
   at android.app.Activity.performCreate(Activity.java:7802)
   at android.app.Activity.performCreate(Activity.java:7791)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
   at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
   at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
   at android.os.Handler.dispatchMessage(Handler.java:107)
   at android.os.Looper.loop(Looper.java:214)
   at android.app.ActivityThread.main(ActivityThread.java:7356)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Please add support for Android 11 devices.

Thanks.

Text orientation(position)

I ran into the problem that if the width of the button is large, the text is not centered on the button, but centered if you count from the end of the logo to the end of the button. Is there any way to fix this? I hope, you understood me
P.S.
I want the text to be centered, like the facebook button
default

AndroidX support

Current version uses android.support.v7 classes of the Support Library.
It would be great to provide a version with AndroidX support, so the users of the library could remove usage of Jetifier from the build.

Failed to resolve

Failed to resolve: com.shobhitpuri.custombuttons:google-signin:1.1.0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.