shobhitpuri / custom-google-signin-button

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.
http://go.shobhitpuri.com/googlesignin
MIT License
78 stars 25 forks source link

Caused by android.content.res.Resources$NotFoundException #19

Open tepkuh opened 3 years ago

tepkuh commented 3 years ago

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)