Android - People - Better navigation after logged in prevents log in screen to appear after pressing back

This commit is contained in:
Cristian Luis Duarte 2018-08-16 17:29:25 -03:00
parent a01b00b3d8
commit 99760e2b40
2 changed files with 64 additions and 13 deletions

View file

@ -7,6 +7,7 @@ import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView; import android.support.design.widget.NavigationView;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
@ -114,7 +115,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
loadLoginFragment(); loadLoginFragment();
break; break;
case "Home": case "Home":
loadHomeFragment(); loadHomeFragment(true);
break; break;
case "Privacy Policy": case "Privacy Policy":
loadPrivacyPolicyFragment(); loadPrivacyPolicyFragment();
@ -128,33 +129,57 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
} }
private void loadHomeFragment() { private void loadHomeFragment(boolean addToBackStack) {
Fragment fragment = HomeFragment.newInstance(); Fragment fragment = HomeFragment.newInstance();
loadFragment(fragment, getString(R.string.home), true); loadFragment(fragment, getString(R.string.home), getString(R.string.tagFragmentHome), addToBackStack);
} }
private void loadLoginFragment() { private void loadLoginFragment() {
Fragment fragment = LoginFragment.newInstance(); Fragment fragment = LoginFragment.newInstance();
loadFragment(fragment, getString(R.string.login), true); loadFragment(fragment, getString(R.string.login), getString(R.string.tagFragmentLogin), true);
} }
private void loadPrivacyPolicyFragment() { private void loadPrivacyPolicyFragment() {
Fragment fragment = PolicyFragment.newInstance(); Fragment fragment = PolicyFragment.newInstance();
loadFragment(fragment, getString(R.string.privacyPolicy), true); loadFragment(fragment, getString(R.string.privacyPolicy), getString(R.string.tagFragmentPolicy), true);
} }
private void loadPeopleFragment() { private void loadPeopleFragment() {
Fragment fragment = FriendsFragment.newInstance(); Fragment fragment = FriendsFragment.newInstance();
loadFragment(fragment, getString(R.string.people), true); loadFragment(fragment, getString(R.string.people), getString(R.string.tagFragmentPeople), true);
} }
private void loadFragment(Fragment fragment, String title, boolean addToBackStack) { private void loadFragment(Fragment fragment, String title, String tag, boolean addToBackStack) {
FragmentManager fragmentManager = getFragmentManager(); FragmentManager fragmentManager = getFragmentManager();
// check if it's the same fragment
String currentFragmentName = fragmentManager.getBackStackEntryCount() > 0
? fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName()
: "";
Log.d("[BACK]", "Before it's " + currentFragmentName + ", now adding " + title + " (before) backstackCount " + fragmentManager.getBackStackEntryCount());
// check if it's the same fragment than the one being shown
if (currentFragmentName.equals(title)) {
mDrawerLayout.closeDrawer(mNavigationView);
return;// cancel as we are already in that fragment
}
// go back until first transaction
int backStackEntryCount = fragmentManager.getBackStackEntryCount();
for (int i = 0; i < backStackEntryCount - 1; i++) {
fragmentManager.popBackStackImmediate();
}
// this case is when we wanted to go home.. rollback already did that!
// But asking for a new Home fragment makes it easier to have an updated list so we let it to continue
FragmentTransaction ft = fragmentManager.beginTransaction(); FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.content_frame, fragment, getString(R.string.tagFragmentPeople)); ft.replace(R.id.content_frame, fragment, tag);
if (addToBackStack) { if (addToBackStack) {
ft.addToBackStack(title); ft.addToBackStack(title);
@ -162,6 +187,14 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
ft.commit(); ft.commit();
setTitle(title); setTitle(title);
mDrawerLayout.closeDrawer(mNavigationView); mDrawerLayout.closeDrawer(mNavigationView);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
Log.d("[BACK]", "added " + title + " backstackCount " + fragmentManager.getBackStackEntryCount());
}
}, 100);
} }
@ -217,7 +250,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
public boolean onNavigationItemSelected(@NonNull MenuItem item) { public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()) { switch(item.getItemId()) {
case R.id.action_home: case R.id.action_home:
loadHomeFragment(); loadHomeFragment(false);
return true; return true;
case R.id.action_people: case R.id.action_people:
loadPeopleFragment(); loadPeopleFragment();
@ -239,6 +272,19 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
public void onLogoutClicked(View view) { public void onLogoutClicked(View view) {
nativeLogout(); nativeLogout();
updateLoginMenu(); updateLoginMenu();
exitLoggedInFragment();
}
private void exitLoggedInFragment() {
// If we are in a "logged in" fragment (like People), go back to home. This could be expanded to multiple fragments
FragmentManager fragmentManager = getFragmentManager();
String currentFragmentName = fragmentManager.getBackStackEntryCount() > 0
? fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName()
: "";
if (currentFragmentName.equals(getString(R.string.people))) {
loadHomeFragment(false);
}
} }
public void onSelectedDomain(String domainUrl) { public void onSelectedDomain(String domainUrl) {
@ -267,7 +313,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
@Override @Override
public void onLoginCompleted() { public void onLoginCompleted() {
loadHomeFragment(); loadHomeFragment(false);
updateLoginMenu(); updateLoginMenu();
if (backToScene) { if (backToScene) {
backToScene = false; backToScene = false;
@ -319,6 +365,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
public void onBackPressed() { public void onBackPressed() {
// if a fragment needs to internally manage back presses.. // if a fragment needs to internally manage back presses..
FragmentManager fm = getFragmentManager(); FragmentManager fm = getFragmentManager();
Log.d("[BACK]", "getBackStackEntryCount " + fm.getBackStackEntryCount());
Fragment friendsFragment = fm.findFragmentByTag(getString(R.string.tagFragmentPeople)); Fragment friendsFragment = fm.findFragmentByTag(getString(R.string.tagFragmentPeople));
if (friendsFragment != null && friendsFragment instanceof FriendsFragment) { if (friendsFragment != null && friendsFragment instanceof FriendsFragment) {
if (((FriendsFragment) friendsFragment).onBackPressed()) { if (((FriendsFragment) friendsFragment).onBackPressed()) {
@ -326,19 +373,20 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
} }
} }
int index = getFragmentManager().getBackStackEntryCount() - 1; int index = fm.getBackStackEntryCount() - 1;
if (index > 0) { if (index > 0) {
super.onBackPressed(); super.onBackPressed();
index--; index--;
if (index > -1) { if (index > -1) {
setTitle(getFragmentManager().getBackStackEntryAt(index).getName()); setTitle(fm.getBackStackEntryAt(index).getName());
} }
if (backToScene) { if (backToScene) {
backToScene = false; backToScene = false;
goToLastLocation(); goToLastLocation();
} }
} else { } else {
finishAffinity(); finishAffinity();
} }
} }

View file

@ -26,5 +26,8 @@
<string name="online">Online</string> <string name="online">Online</string>
<!-- tags --> <!-- tags -->
<string name="tagFragmentHome">tagFragmentHome</string>
<string name="tagFragmentLogin">tagFragmentLogin</string>
<string name="tagFragmentPolicy">tagFragmentPolicy</string>
<string name="tagFragmentPeople">tagFragmentPeople</string> <string name="tagFragmentPeople">tagFragmentPeople</string>
</resources> </resources>