Достижения 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 и там же показывать доску ачивок все работает как надо.