From 75e77d16657bb4b1c8f105b5eed41dc6e48e0c9c Mon Sep 17 00:00:00 2001 From: Katie Dektar Date: Sat, 15 Nov 2025 19:55:03 -0800 Subject: [PATCH 01/15] Allow deep linking to bypass set location screen. Next: * Let users skip the location screen the first time they see it, or don't automatically show it after the tutorial, and * Show a prompt in MainActivity to set location if not yet set --- .../a5calls/adapter/IssuesAdapter.java | 1 + .../a5calls/controller/IssueActivity.java | 26 ++++++++---- .../a5calls/controller/MainActivity.java | 41 ++++++++++++------- .../src/main/res/layout/activity_issue.xml | 36 ++++++++++++++++ 5calls/app/src/main/res/values/strings.xml | 6 +++ 5 files changed, 88 insertions(+), 22 deletions(-) diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/adapter/IssuesAdapter.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/adapter/IssuesAdapter.java index 96bc1b7f..c7782c73 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/adapter/IssuesAdapter.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/adapter/IssuesAdapter.java @@ -321,6 +321,7 @@ public void onClick(View v) { if (mAddressErrorType != NO_ERROR) { // If there was an address error, clear the number of calls to make. vh.numCalls.setText(""); + vh.numCalls.setVisibility(View.GONE); vh.previousCallStats.setVisibility(View.GONE); return; } diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/IssueActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/IssueActivity.java index 61158c16..1df89574 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/IssueActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/IssueActivity.java @@ -287,13 +287,24 @@ protected void onResume() { return; } if (mIssue.contacts == null) { - // Probably an address error. - binding.noCallsLeft.setVisibility(View.VISIBLE); + if (AccountManager.Instance.hasLocation(this)) { + // An address error. + binding.noCallsLeft.setVisibility(View.VISIBLE); + binding.updateLocationButton.setOnClickListener(view -> { + Intent intent = new Intent(IssueActivity.this, LocationActivity.class); + intent.putExtra(LocationActivity.ALLOW_HOME_UP_KEY, true); + startActivity(intent); + }); + } else { + // Hasn't set an address yet. + binding.noAddressSet.setVisibility(View.VISIBLE); + binding.setLocationButton.setOnClickListener(view -> { + Intent intent = new Intent(IssueActivity.this, LocationActivity.class); + intent.putExtra(LocationActivity.ALLOW_HOME_UP_KEY, true); + startActivity(intent); + }); + } binding.issueDone.getRoot().setVisibility(View.GONE); - binding.updateLocationButton.setOnClickListener(view -> { - Intent intent = new Intent(IssueActivity.this, LocationActivity.class); - startActivity(intent); - }); return; } @@ -307,7 +318,7 @@ protected void onResume() { senateCount++; } } - if (senateCount == 1) { + if (senateCount <= 1) { mIssue.contacts.add(Contact.createPlaceholder( "placeholderSenate", getResources().getString(R.string.vacant_seat_rep_name), @@ -343,6 +354,7 @@ protected void onResume() { @Override public void onClick(View view) { Intent intent = new Intent(IssueActivity.this, LocationActivity.class); + intent.putExtra(LocationActivity.ALLOW_HOME_UP_KEY, true); startActivity(intent); } }); diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/MainActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/MainActivity.java index f965e084..2e23e08c 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/MainActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/MainActivity.java @@ -123,14 +123,14 @@ protected void onCreate(Bundle savedInstanceState) { return; } - // Confirm the user has set a location. - if (!accountManager.hasLocation(this)) { - // No location set, go to LocationActivity! - Intent intent = new Intent(this, LocationActivity.class); - startActivity(intent); - finish(); - return; - } +// // Confirm the user has set a location. +// if (!accountManager.hasLocation(this)) { +// // No location set, go to LocationActivity! +// Intent intent = new Intent(this, LocationActivity.class); +// startActivity(intent); +// finish(); +// return; +// } Intent intent = getIntent(); if (intent != null && intent.getExtras() != null && @@ -172,7 +172,10 @@ protected void onCreate(Bundle savedInstanceState) { setupDrawerContent(binding.navigationView); - if (!accountManager.isNewsletterPromptDone(this)) { + boolean hasLocation = accountManager.hasLocation(this); + if (!hasLocation) { + // TODO: Set up a prompt to set location. + } else if (!accountManager.isNewsletterPromptDone(this)) { binding.newsletterSignupView.setVisibility(View.VISIBLE); binding.newsletterView.newsletterDeclineButton.setOnClickListener(new View.OnClickListener() { @Override @@ -322,8 +325,11 @@ public void onGlobalLayout() { mAddress = accountManager.getAddress(this); mLatitude = accountManager.getLat(this); mLongitude = accountManager.getLng(this); - - if (accountManager.isNewsletterPromptDone(this) || + boolean hasLocation = accountManager.hasLocation(this); + if (!hasLocation) { + binding.newsletterSignupView.setVisibility(View.GONE); + // TODO: show "set your location" prompt. + } else if (accountManager.isNewsletterPromptDone(this) || accountManager.isNewsletterSignUpCompleted(this)) { binding.newsletterSignupView.setVisibility(View.GONE); } @@ -470,8 +476,9 @@ public void onIssuesReceived(List issues) { mIssuesAdapter.setAllIssues(issues, IssuesAdapter.NO_ERROR); mIssuesAdapter.setFilterAndSearch(mFilterText, mSearchText); binding.swipeContainer.setRefreshing(false); - // Only handle deep link if we have both issues and contacts loaded - if (mIssuesAdapter.hasContacts()) { + // Only handle deep link if we have both issues and contacts loaded, + // or if there's no location set. + if (mIssuesAdapter.hasContacts() || !accountManager.hasLocation(getApplicationContext())) { maybeHandlePendingDeepLink(); } } @@ -672,6 +679,8 @@ public void refreshIssues() { String location = getLocationString(); if (!TextUtils.isEmpty(location)) { api.getContacts(location); + } else { + mIssuesAdapter.setAddressError(IssuesAdapter.ERROR_ADDRESS); } } api.getIssues(); @@ -803,8 +812,10 @@ private void maybeHandlePendingDeepLink() { return; } - // Wait for both issues and contacts to be loaded before handling deep link - if (mIssuesAdapter.getAllIssues().isEmpty() || !mIssuesAdapter.hasContacts()) { + // Wait for both issues and contacts to be loaded before handling deep link, + // or just issues if we hav eno location. + if (mIssuesAdapter.getAllIssues().isEmpty() || + (!mIssuesAdapter.hasContacts() && accountManager.hasLocation(getApplicationContext()))) { return; } diff --git a/5calls/app/src/main/res/layout/activity_issue.xml b/5calls/app/src/main/res/layout/activity_issue.xml index f323c244..54308746 100644 --- a/5calls/app/src/main/res/layout/activity_issue.xml +++ b/5calls/app/src/main/res/layout/activity_issue.xml @@ -145,6 +145,42 @@ + + + + + + +