Достижения achievement не загружаются с первого раза android game services

Ситуация такая: есть 3 activity: MainActivity, PlayActivity и LeaderboardActivity.

Задумано, что программа (далее игра) запускается на Main, на ней подключается к play играм (корректно), обновляет ачивки на сервере из файла. В Play проводится весь экшен, при победе также обновлет ачивки, в Leaderboard статистика локальная и кнопки с запросами в Play игры ачивок и таблицы лидеров. Всю работу с ачивка планирую делать в отдельном классе Achievements.

Тестирую на реальном устройстве напрямую из android studio. Запрос в play игры таблицы leaderboard работает полностью корректно, а запрос ачивок вызывает вопросы. Далее на примерах.

Сама проблема: При запуске игры и подключении к play играм переходим на LeaderboardActivity, жмем showAch и у нас отображается все адекватно. Скриншот правильно отображение

Далее выходим на MainActivity, переходим в PlayActivity выполняется кусок кода при победе (смотреть ниже), возвращаемся по цепочке в main, потом в leaderboard жмем showAch и отображается какая-то фигня Скриншот. Фигня

НО! Стоит нажать закрыть ачивки и снова вызвать showAch как все отображается адекватно как на первом скриншоте.

Код mainActivity, связанный с play играми.

private Achievements achievements;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //ачивки
    achievements = new Achievements();
}

@Override 
public void onClick(View v) {

    switch (v.getId()) {

        case R.id.connectBtn:

            Intent signInIntent = achievements.startConnectPlayServices(connectBtn, getApplicationContext());
            if (signInIntent != null) {
                startActivityForResult(signInIntent, RC_SIGN_IN);
            }
            break;} } 




 @Override
protected void onResume() {
    super.onResume();

    GoogleSignInAccount googleSignInAccount = GoogleSignIn.getLastSignedInAccount(this);
    if (googleSignInAccount != null) {
        connectBtn.setImageResource(R.drawable.ic_online);
    } else {
        connectBtn.setImageResource(R.drawable.ic_offline);
    }

}

Код класса Achievements

public class Achievements {


private SharedPreferences sPrefs;
private GoogleSignInAccount googleSignInAccount;


public final String ACH_1_2_3      = "achievement_1_2_3";



Achievements() {
    //context = cont;
    //activity = act;
}

public Intent startConnectPlayServices(ImageButton connectBtn, Context context) {
    googleSignInAccount = GoogleSignIn.getLastSignedInAccount(context);
    if (googleSignInAccount != null) {
        //вход выполнен
        GoogleSignInClient signInClient = GoogleSignIn.getClient(context,
                GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
        signInClient.signOut();
        connectBtn.setImageResource(R.drawable.ic_offline);
        return null;
    } else {
        //вход не выполнен
        GoogleSignInClient signInClient = GoogleSignIn.getClient(context,
                GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
        Intent intent = signInClient.getSignInIntent();

        return intent;


    }


}

public void checkWinAchievements(Context context, AchievementsClient mAchievementClient) {

    googleSignInAccount = GoogleSignIn.getLastSignedInAccount(context);
    if (googleSignInAccount != null) {
        //отправляем в гугл данные об открытых ачивках

        sendAchievementsToServer(context, mAchievementClient);
    }
}

public void sendAchievementsToServer(Context context, AchievementsClient mAchievementClient) {
    sPrefs = context.getSharedPreferences(String.valueOf(R.string.shared_pref_name), MODE_PRIVATE);
    SharedPreferences.Editor sPrefEditor = sPrefs.edit();



    //<!-- achievement 1-2-3 -->
    if (sPrefs.getInt(ACH_1_2_3, 0) > 0 ) {
        mAchievementClient.unlock(context.getString(R.string.achievement_1));
    }
    if (sPrefs.getInt(ACH_1_2_3, 0) > 0 ) {
        mAchievementClient.setSteps(context.getString(R.string.achievement_2), sPrefs.getInt(ACH_1_2_3, 0));
        mAchievementClient.setSteps(context.getString(R.string.achievement_3), sPrefs.getInt(ACH_1_2_3, 0));
    }
}
}

Фрагмент кода из PlayActivity

private void updateAchievementLocal() {
    sPrefs = getSharedPreferences(String.valueOf(R.string.shared_pref_name), MODE_PRIVATE);
    SharedPreferences.Editor sPrefEditor = sPrefs.edit();


    //Записываем победы ACH_1_2_3
    sPrefEditor.putInt("achievement_1_2_3", sPrefs.getInt("achievement_1_2_3", 0) + 1);

    //тест
    sPrefEditor.putInt("achievement_22", sPrefs.getInt("achievement_22", 0) + 1);
    sPrefEditor.putInt("achievement_19_20_21", sPrefs.getInt("achievement_19_20_21", 0) + 10);

    sPrefEditor.apply();
    Achievements achievements = new Achievements();
    GoogleSignInAccount alreadyGoogleSignInAccount = GoogleSignIn.getLastSignedInAccount(getApplicationContext());
    if (alreadyGoogleSignInAccount != null) {
        AchievementsClient aClient = Games.getAchievementsClient(PlayActivity.this, alreadyGoogleSignInAccount);
        achievements.checkWinAchievements(this, aClient);
    }
}

Фрагмент из LeaderboardActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_leaderboards);

    achievements = new Achievements();


    showLbBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sound.playSoundClick();
            GoogleSignInAccount alreadyGoogleSignInAccount = GoogleSignIn.getLastSignedInAccount(LeaderboardsActivity.this);
            if (alreadyGoogleSignInAccount != null) {
                Games.getLeaderboardsClient(LeaderboardsActivity.this, alreadyGoogleSignInAccount)
                        .getLeaderboardIntent(getString(R.string.leaderboard_id))
                        .addOnSuccessListener(new OnSuccessListener<Intent>() {
                            @Override
                            public void onSuccess(Intent intent) {
                                startActivityForResult(intent, RC_LEADERBOARD_UI);
                            }
                        });
            } else {
                Toast.makeText(LeaderboardsActivity.this, getString(R.string.mess_offline), Toast.LENGTH_LONG).show();
            }
        }
    });


    showAchBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sound.playSoundClick();
            GoogleSignInAccount alreadyGoogleSignInAccount = GoogleSignIn.getLastSignedInAccount(getApplicationContext());
            if (alreadyGoogleSignInAccount != null) {
                AchievementsClient aClient = Games.getAchievementsClient(LeaderboardsActivity.this, alreadyGoogleSignInAccount);
                achievements.checkWinAchievements(getApplicationContext(), aClient);
                aClient
                    .getAchievementsIntent()
                    .addOnSuccessListener(new OnSuccessListener<Intent>() {
                        @Override
                        public void onSuccess(Intent intent) {
                            startActivityForResult(intent, RC_ACHIEVEMENT_UI);
                        }
                    });
            } else {
                Toast.makeText(LeaderboardsActivity.this, getString(R.string.mess_offline), Toast.LENGTH_LONG).show();
            }
        }
    });

}

Найденная странность номер 1: Если влепить в самое начало клика ShowAchBtn Toast, то доска ачивок адекватно НЕ грузится вообще, ни с какого раза.

Странность 2: Если вызывать setStep\unlock в mainActivity и там же показывать доску ачивок все работает как надо.


Ответы (0 шт):