diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java index 968f1074c..2c0fb243c 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java @@ -147,7 +147,15 @@ public class MainActivity extends BaseActivity binding.toolbarBinding.toolbar.setNavigationOnClickListener(view -> { onSupportNavigateUp(); }); + /* + "first_edit_depict" is a key for getting information about opening the depiction editor + screen for the first time after opening the app. + Getting true by the key means the depiction editor screen is opened for the first time + after opening the app. + Getting false by the key means the depiction editor screen is not opened for the first time + after opening the app. + */ applicationKvStore.putBoolean("first_edit_depict", true); if (applicationKvStore.getBoolean("login_skipped") == true) { setTitle(getString(R.string.navigation_item_explore)); @@ -158,6 +166,8 @@ public class MainActivity extends BaseActivity applicationKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", false); } if (savedInstanceState == null) { + //starting a fresh fragment. + // Open Last opened screen if it is Contributions or Nearby, otherwise Contributions if (applicationKvStore.getBoolean("last_opened_nearby")) { setTitle(getString(R.string.nearby_fragment)); showNearby(); @@ -176,6 +186,21 @@ public class MainActivity extends BaseActivity userName = sessionManager.getUserName(); } setUpPager(); + /** + * Ask the user for media location access just after login + * so that location in the EXIF metadata of the images shared by the user + * is retained on devices running Android 10 or above + */ +// if (VERSION.SDK_INT >= VERSION_CODES.Q) { +// ActivityCompat.requestPermissions(this, +// new String[]{Manifest.permission.ACCESS_MEDIA_LOCATION}, 0); +// PermissionUtils.checkPermissionsAndPerformAction( +// this, +// () -> {}, +// R.string.media_location_permission_denied, +// R.string.add_location_manually, +// permission.ACCESS_MEDIA_LOCATION); +// } checkAndResumeStuckUploads(); } } @@ -188,8 +213,10 @@ public class MainActivity extends BaseActivity binding.fragmentMainNavTabLayout.setOnNavigationItemSelectedListener( navListener = (item) -> { if (!item.getTitle().equals(getString(R.string.more))) { + // do not change title for more fragment setTitle(item.getTitle()); } + // set last_opened_nearby true if item is nearby screen else set false applicationKvStore.putBoolean("last_opened_nearby", item.getTitle().equals(getString(R.string.nearby_fragment))); final Fragment fragment = NavTab.of(item.getOrder()).newInstance(); @@ -201,6 +228,7 @@ public class MainActivity extends BaseActivity loadFragment(ExploreFragment.newInstance(), false); binding.fragmentMainNavTabLayout.setOnNavigationItemSelectedListener(item -> { if (!item.getTitle().equals(getString(R.string.more))) { + // do not change title for more fragment setTitle(item.getTitle()); } Fragment fragment = NavTabLoggedOut.of(item.getOrder()).newInstance(); @@ -209,33 +237,36 @@ public class MainActivity extends BaseActivity } private boolean loadFragment(Fragment fragment, boolean showBottom) { + //showBottom so that we do not show the bottom tray again when constructing + //from the saved instance state. if (fragment instanceof ContributionsFragment) { if (activeFragment == ActiveFragment.CONTRIBUTIONS) { + // scroll to top if already on the Contributions tab contributionsFragment.scrollToTop(); return true; } contributionsFragment = (ContributionsFragment) fragment; activeFragment = ActiveFragment.CONTRIBUTIONS; } else if (fragment instanceof NearbyParentFragment) { - if (activeFragment == ActiveFragment.NEARBY) { + if (activeFragment == ActiveFragment.NEARBY) {// Do nothing if same tab return true; } nearbyParentFragment = (NearbyParentFragment) fragment; activeFragment = ActiveFragment.NEARBY; } else if (fragment instanceof ExploreFragment) { - if (activeFragment == ActiveFragment.EXPLORE) { + if (activeFragment == ActiveFragment.EXPLORE) {// Do nothing if same tab return true; } exploreFragment = (ExploreFragment) fragment; activeFragment = ActiveFragment.EXPLORE; } else if (fragment instanceof BookmarkFragment) { - if (activeFragment == ActiveFragment.BOOKMARK) { + if (activeFragment == ActiveFragment.BOOKMARK) {// Do nothing if same tab return true; } bookmarkFragment = (BookmarkFragment) fragment; activeFragment = ActiveFragment.BOOKMARK; } else if (fragment == null && showBottom) { - if (applicationKvStore.getBoolean("login_skipped") == true) { + if (applicationKvStore.getBoolean("login_skipped") == true) {// If logged out, more sheet is different MoreBottomSheetLoggedOutFragment bottomSheet = new MoreBottomSheetLoggedOutFragment(); bottomSheet.show(getSupportFragmentManager(), "MoreBottomSheetLoggedOut"); } else { @@ -261,7 +292,12 @@ public class MainActivity extends BaseActivity public void showTabs() { binding.fragmentMainNavTabLayout.setVisibility(View.VISIBLE); } - + /** + * Adds number of uploads next to tab text "Contributions" then it will look like "Contributions + * (NUMBER)" + * + * @param uploadCount + */ public void setNumOfUploads(int uploadCount) { if (activeFragment == ActiveFragment.CONTRIBUTIONS) { setTitle(getResources().getString(R.string.contributions_fragment) + " " + ( @@ -272,7 +308,15 @@ public class MainActivity extends BaseActivity : getString(R.string.contributions_subtitle_zero))); } } - + /** + * Resume the uploads that got stuck because of the app being killed or the device being + * rebooted. + *
+ * When the app is terminated or the device is restarted, contributions remain in the
+ * 'STATE_IN_PROGRESS' state. This status persists and doesn't change during these events. So,
+ * retrieving contributions labeled as 'STATE_IN_PROGRESS' from the database will provide the
+ * list of uploads that appear as stuck on opening the app again
+ */
@SuppressLint("CheckResult")
private void checkAndResumeStuckUploads() {
List