Кастомная кнопка логина в Twitter SDK (Fabric kit)

в 7:57, , рубрики: android twitter, fabric sdk, twitter api, twitter sdk, twitter4j, Разработка под android, метки: ,

Эта статья предназначена для тех, кто уже разобрался с установкой и настройкой Twitter Login SDK (Fabric kit), но застрял на вопросе о том, как реализовать кастомный ui для кнопки логина. Вводную статью по Fabric можно найти по ссылке.

«Наконец-то я избавлюсь от этого громоздкого кода,» — думал я, выпиливая twitter4j и предвкушая, какими аккуратными станут классы авторизации благодаря Twitter SDK. Дело было в субботу утром. По моим расчетам, это должно было занять не больше часа. Вечером я проклял того утреннего дурака, который решил пожертвовать целым выходным днем ради небольшого рефакторинга.

Что же случилось? Прежде всего, не верьте, что плагин Fabric все сделает за вас. Скорее наоборот — вы еще с ним наплачетесь. Так что тем, кто решает задачу логина, советую параллельно посматривать вот сюда.

С виджетом TwitterLoginButton, который предоставляет sdk, все понятно, но что же делать тем, кого не устраивает стандартный дизайн? Долгие часы гугления не дали ровным счетом ничего. Полное отсутствие api references, java doc или исходного кода также не упростило задачу.

В конце концов я нашел такой костыль:

    private void loginToTwitter() {
        TwitterCore.getInstance().logIn(this, new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> twitterSessionResult) {
                Log.i(LOG_TAG, "success");
            }

            @Override
            public void failure(TwitterException e) {
                Log.i(LOG_TAG, "failure");
            }
        });
    }

И чтобы всё это работало (о ужас!):

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        (new TwitterLoginButton(this)).onActivityResult(requestCode, resultCode, data); 
    }

Через пару дней, вдоволь наплевавшись, я нашёл в себе силы для поиска нормального решения. Всё оказалось достаточно просто:

  private TwitterAuthClient client;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig));

        Button customLoginButton = (Button) findViewById(R.id.custom_twitter_login);
        customLoginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                client = new TwitterAuthClient();
                client.authorize(LoginActivity.this, new Callback<TwitterSession>() {
                    @Override
                    public void success(Result<TwitterSession> twitterSessionResult) {
                        Toast.makeText(LoginActivity.this, "success", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void failure(TwitterException e) {
                        Toast.makeText(LoginActivity.this, "failure", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        client.onActivityResult(requestCode, resultCode, data);
    }

Если у вас есть более свежая информация по документации sdk, пишите — я с удовольствием добавлю её в статью.

Исходный код на Github: github.com/Defuera/Social-network-login

Автор: Defuera

Источник

Поделиться