From f561e2bd80eaa5f21007d5851ecb643ceee8cf99 Mon Sep 17 00:00:00 2001 From: Scott Peterson Date: Wed, 22 Oct 2025 12:11:35 -0400 Subject: [PATCH 1/2] Fix deprecated API usages throughout the app This commit addresses deprecated method calls identified in issue #159, updating them to use modern Android APIs compatible with the current minSdk (API 23+). ## Files Changed: **CustomTabsUtil.java** - Replaced deprecated `setToolbarColor(int)` with `setDefaultColorSchemeParams(CustomTabColorSchemeParams)` - Modern approach supports color schemes for light/dark mode - Smoketest: Open About screen, tap any web link buttons (About Us, Why Calling, Privacy, Dashboard). Chrome Custom Tabs should open with app's primary color in toolbar. **GridItemDecoration.java** - Replaced deprecated `getViewAdapterPosition()` with `getBindingAdapterPosition()` - Smoketest: Navigate to RepCallActivity, verify grid spacing displays correctly on outcome buttons. **IssueActivity.java** - Replaced deprecated `startActivityForResult()` with modern Activity Result API - Added `ActivityResultLauncher` and moved result handling to callback - Removed deprecated `onActivityResult()` method - Smoketest: Select an issue, tap on a representative row to launch RepCallActivity, navigate back and verify result handling works (especially server error state). **IssuesAdapter.java** - Replaced 3 instances of deprecated `getResources().getColor()` with `ContextCompat.getColor()` - Affects button icon tinting in empty state views - Smoketest: Trigger empty states (no internet for refresh button, no location for location button, no search match for search button). Verify colored icons display correctly. **NotifyBroadcastReceiver.java** - Replaced 3 deprecated `Notification.Action.Builder(int, CharSequence, PendingIntent)` constructors with modern `Icon.createWithResource()` approach - Replaced deprecated `getResources().getColor()` with `ContextCompat.getColor()` - Smoketest: Enable reminders in settings, wait for/trigger notification. Verify notification appears with Snooze, Settings, and Dismiss buttons with correct icons and primary color accent. **StatsActivity.java** - Replaced 9 instances of deprecated `getResources().getColor()` with `ContextCompat.getColor()` - Affects pie chart colors, line graph colors, grid colors, and text colors - Smoketest: Open Stats screen, verify pie chart displays with correct outcome colors (green/orange/gray) and line graph shows white grid lines with colored series. **MainActivity.java** - Replaced deprecated `getResources().getColor()` with `ContextCompat.getColor()` - Affects snackbar action button color - Smoketest: Enter a location/zip that splits congressional districts, verify snackbar appears with "UPDATE" button in accent light color. ## Notes: - OkHttpStack.java contains many deprecation warnings but is dead code (commented out in FiveCallsApi.java due to Samsung Galaxy device failures). Left untouched as it's never instantiated. - Optimized imports across modified files. Addresses #159 --- .../controller/MainActivityErrorTest.java | 28 +++------ .../a5calls/adapter/IssuesAdapter.java | 7 ++- .../a5calls/controller/IssueActivity.java | 60 ++++++++++--------- .../a5calls/controller/LocationActivity.java | 21 ++++--- .../a5calls/controller/MainActivity.java | 3 +- .../NotificationSettingsDialog.java | 6 +- .../controller/NotifyBroadcastReceiver.java | 10 ++-- .../a5calls/controller/RepCallActivity.java | 37 +++++------- .../a5calls/controller/StatsActivity.java | 19 +++--- .../a5calls/controller/TutorialActivity.java | 20 +++---- .../android/a5calls/model/Contact.java | 1 - .../android/a5calls/net/FiveCallsApi.java | 1 - .../android/a5calls/util/CustomTabsUtil.java | 6 +- .../a5calls/view/GridItemDecoration.java | 2 +- .../a5calls/android/a5calls/FakeJSONData.java | 1 - .../a5calls/model/DatabaseHelperTest.java | 14 ++--- .../android/a5calls/model/IssueTest.java | 11 ++-- 17 files changed, 119 insertions(+), 128 deletions(-) diff --git a/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/controller/MainActivityErrorTest.java b/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/controller/MainActivityErrorTest.java index f6a9b8e7..2396a371 100644 --- a/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/controller/MainActivityErrorTest.java +++ b/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/controller/MainActivityErrorTest.java @@ -1,20 +1,21 @@ package org.a5calls.android.a5calls.controller; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static org.hamcrest.Matchers.allOf; + import android.view.View; + import androidx.recyclerview.widget.RecyclerView; import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import com.android.volley.RequestQueue; -import com.android.volley.toolbox.BasicNetwork; import com.android.volley.toolbox.HttpResponse; -import org.a5calls.android.a5calls.AppSingleton; import org.a5calls.android.a5calls.R; -import org.a5calls.android.a5calls.model.AccountManager; -import org.a5calls.android.a5calls.net.FakeRequestQueue; -import org.a5calls.android.a5calls.net.FiveCallsApi; -import org.a5calls.android.a5calls.net.MockHttpStack; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; @@ -24,17 +25,6 @@ import java.io.IOException; import java.util.ArrayList; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withClassName; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.startsWith; - /** * Integration test for MainActivity that tests error handling. */ 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 f83d6086..78d6a634 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 @@ -26,6 +26,7 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; public class IssuesAdapter extends RecyclerView.Adapter { @@ -457,7 +458,7 @@ public EmptyRequestViewHolder(View itemView) { refreshButton = (Button) itemView.findViewById(R.id.refresh_btn); // Tinting the compound drawable only works API 23+, so do this manually. refreshButton.getCompoundDrawablesRelative()[0].mutate().setColorFilter( - refreshButton.getResources().getColor(R.color.colorAccent), + ContextCompat.getColor(itemView.getContext(), R.color.colorAccent), PorterDuff.Mode.MULTIPLY); } } @@ -470,7 +471,7 @@ public EmptyAddressViewHolder(View itemView) { locationButton = (Button) itemView.findViewById(R.id.location_btn); // Tinting the compound drawable only works API 23+, so do this manually. locationButton.getCompoundDrawablesRelative()[0].mutate().setColorFilter( - locationButton.getResources().getColor(R.color.colorAccent), + ContextCompat.getColor(itemView.getContext(), R.color.colorAccent), PorterDuff.Mode.MULTIPLY); } } @@ -483,7 +484,7 @@ public EmptySearchViewHolder(View itemView) { searchButton = (Button) itemView.findViewById(R.id.search_btn); // Tinting the compound drawable only works API 23+, so do this manually. searchButton.getCompoundDrawablesRelative()[0].mutate().setColorFilter( - searchButton.getResources().getColor(R.color.colorAccent), + ContextCompat.getColor(itemView.getContext(), R.color.colorAccent), PorterDuff.Mode.MULTIPLY); } } 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 3b274c7a..8462346c 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 @@ -5,26 +5,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; - -import androidx.activity.OnBackPressedCallback; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowCompat; -import androidx.core.graphics.Insets; -import androidx.core.view.WindowInsetsCompat; - -import com.bumptech.glide.load.resource.bitmap.CircleCrop; -import com.google.android.gms.tasks.Task; -import com.google.android.material.bottomsheet.BottomSheetBehavior; - -import androidx.annotation.VisibleForTesting; -import androidx.appcompat.app.AlertDialog; -import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.fragment.app.Fragment; -import androidx.core.widget.NestedScrollView; -import androidx.appcompat.app.AppCompatActivity; import android.text.Html; import android.text.TextUtils; import android.text.method.LinkMovementMethod; @@ -37,7 +17,27 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.widget.NestedScrollView; +import androidx.fragment.app.Fragment; + import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.google.android.gms.tasks.Task; +import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.snackbar.Snackbar; import com.google.android.play.core.review.ReviewInfo; import com.google.android.play.core.review.ReviewManager; @@ -96,6 +96,7 @@ public class IssueActivity extends AppCompatActivity implements FiveCallsApi.Scr private boolean mIsAnimating = false; private ActivityIssueBinding binding; + private ActivityResultLauncher mRepCallLauncher; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -103,6 +104,15 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { WindowCompat.setDecorFitsSystemWindows(getWindow(), false); binding = ActivityIssueBinding.inflate(getLayoutInflater()); + // Register activity result launcher for RepCallActivity + mRepCallLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_SERVER_ERROR) { + mShowServerError = true; + } + }); + mIssue = getIntent().getParcelableExtra(KEY_ISSUE); if (mIssue == null) { // TODO handle this better? Is it even possible to get here? @@ -517,7 +527,7 @@ public void onClick(View view) { intent.putExtra(RepCallActivity.KEY_LOCATION_NAME, getIntent().getStringExtra(RepCallActivity.KEY_LOCATION_NAME)); intent.putExtra(RepCallActivity.KEY_ACTIVE_CONTACT_INDEX, index); - startActivityForResult(intent, REP_CALL_REQUEST_CODE); + mRepCallLauncher.launch(intent); } }); } else { @@ -569,14 +579,6 @@ private void maybeShowIssueDone() { } } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_SERVER_ERROR) { - mShowServerError = true; - } - } - private void showIssueDetails() { new AlertDialog.Builder(IssueActivity.this) .setTitle(R.string.details_btn) diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/LocationActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/LocationActivity.java index 17425f11..91da12e3 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/LocationActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/LocationActivity.java @@ -1,30 +1,31 @@ package org.a5calls.android.a5calls.controller; +import static org.a5calls.android.a5calls.controller.IssueActivity.KEY_IS_DISTRICT_SPLIT; + import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; -import android.graphics.Rect; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; -import androidx.core.app.ActivityCompat; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsCompat; -import android.text.TextUtils; -import android.view.KeyEvent; -import android.view.MenuItem; -import android.view.View; -import android.view.inputmethod.EditorInfo; -import android.widget.TextView; - import org.a5calls.android.a5calls.FiveCallsApplication; import org.a5calls.android.a5calls.R; import org.a5calls.android.a5calls.databinding.ActivityLocationBinding; @@ -32,8 +33,6 @@ import java.util.Objects; -import static org.a5calls.android.a5calls.controller.IssueActivity.KEY_IS_DISTRICT_SPLIT; - public class LocationActivity extends AppCompatActivity { private static final String TAG = "LocationActivity"; 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 7b6d4ce4..b77ce437 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 @@ -11,6 +11,7 @@ import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowCompat; @@ -505,7 +506,7 @@ public void onContactsReceived(String locationName, String districtId, mSnackbar = Snackbar.make(binding.drawerLayout, R.string.split_district_warning, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.update, view -> launchLocationActivity()); - mSnackbar.setActionTextColor(getResources().getColor( + mSnackbar.setActionTextColor(ContextCompat.getColor(MainActivity.this, R.color.colorAccentLight)); mSnackbar.addCallback(new BaseTransientBottomBar.BaseCallback<>() { @Override diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotificationSettingsDialog.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotificationSettingsDialog.java index f2c2f261..3c262c32 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotificationSettingsDialog.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotificationSettingsDialog.java @@ -1,16 +1,12 @@ package org.a5calls.android.a5calls.controller; -import android.Manifest; import android.app.Dialog; import android.content.DialogInterface; -import android.content.pm.PackageManager; import android.os.Bundle; -import android.util.Log; import androidx.annotation.NonNull; -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.DialogFragment; import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; import com.onesignal.Continue; import com.onesignal.OneSignal; diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotifyBroadcastReceiver.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotifyBroadcastReceiver.java index df8d9b03..0abf97b8 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotifyBroadcastReceiver.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/NotifyBroadcastReceiver.java @@ -10,6 +10,8 @@ import android.text.TextUtils; import android.util.Log; +import androidx.core.content.ContextCompat; + import org.a5calls.android.a5calls.FiveCallsApplication; import org.a5calls.android.a5calls.R; import org.a5calls.android.a5calls.model.AccountManager; @@ -82,14 +84,14 @@ public void onReceive(Context context, Intent intent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { builder.setChannelId(CHANNEL_ID); // O and above require Notification Channels. } - builder.setColor(context.getResources().getColor(R.color.colorPrimary)); + builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary)); // Set up a snooze action, which when clicked notifies this same broadcast receiver Intent snoozeIntent = new Intent(context, NotifyBroadcastReceiver.class) .setAction(ACTION_DO_SNOOZE); PendingIntent pendingSnooze = PendingIntent.getBroadcast(context, SNOOZE_REQUEST_CODE, snoozeIntent, PendingIntent.FLAG_IMMUTABLE); Notification.Action snoozeAction = new Notification.Action.Builder( - R.drawable.ic_snooze_white_24dp, + android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_snooze_white_24dp), context.getResources().getString(R.string.snooze), pendingSnooze) .build(); @@ -101,7 +103,7 @@ public void onReceive(Context context, Intent intent) { PendingIntent pendingSettings = PendingIntent.getActivity(context, GO_TO_SETTINGS_REQUEST_CODE, settingsIntent, PendingIntent.FLAG_IMMUTABLE); Notification.Action settingsAction = new Notification.Action.Builder( - R.drawable.ic_settings_black_24dp, + android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_settings_black_24dp), context.getResources().getString(R.string.settings), pendingSettings) .build(); @@ -112,7 +114,7 @@ public void onReceive(Context context, Intent intent) { PendingIntent pendingCancel = PendingIntent.getBroadcast(context, CANCEL_REQUEST_CODE, cancelIntent, PendingIntent.FLAG_IMMUTABLE); Notification.Action cancelAction = new Notification.Action.Builder( - R.drawable.ic_close_white_24dp, + android.graphics.drawable.Icon.createWithResource(context, R.drawable.ic_close_white_24dp), context.getResources().getString(R.string.dismiss), pendingCancel) .build(); diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java index 125048b3..46d5c6a0 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java @@ -1,26 +1,11 @@ package org.a5calls.android.a5calls.controller; +import static org.a5calls.android.a5calls.controller.IssueActivity.KEY_ISSUE; + import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; - -import androidx.annotation.Nullable; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsCompat; - -import com.bumptech.glide.load.resource.bitmap.CircleCrop; -import com.google.android.material.snackbar.Snackbar; - -import androidx.annotation.VisibleForTesting; -import androidx.core.app.NavUtils; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.GridLayoutManager; - import android.text.TextUtils; import android.text.util.Linkify; import android.util.DisplayMetrics; @@ -31,7 +16,20 @@ import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.NavUtils; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.GridLayoutManager; + import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.google.android.material.snackbar.Snackbar; import org.a5calls.android.a5calls.AppSingleton; import org.a5calls.android.a5calls.FiveCallsApplication; @@ -45,15 +43,12 @@ import org.a5calls.android.a5calls.model.Issue; import org.a5calls.android.a5calls.model.Outcome; import org.a5calls.android.a5calls.net.FiveCallsApi; -import org.a5calls.android.a5calls.util.AnalyticsManager; -import org.a5calls.android.a5calls.util.ScriptReplacements; import org.a5calls.android.a5calls.util.MarkdownUtil; +import org.a5calls.android.a5calls.util.ScriptReplacements; import org.a5calls.android.a5calls.view.GridItemDecoration; import java.util.List; -import static org.a5calls.android.a5calls.controller.IssueActivity.KEY_ISSUE; - /** * Activity which handles showing a script for a rep and logging calls. */ diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/StatsActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/StatsActivity.java index 9f62eef7..0e20e259 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/StatsActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/StatsActivity.java @@ -44,6 +44,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.core.graphics.Insets; import androidx.core.util.Pair; @@ -203,15 +204,15 @@ private void createPieChart(List contacts, List voicemails, List entries = new ArrayList<>(); if (!contacts.isEmpty()) { entries.add(new PieEntry(contacts.size(), getResources().getString(R.string.contact_n))); - colorsList.add(getResources().getColor(R.color.contacted_color)); + colorsList.add(ContextCompat.getColor(this, R.color.contacted_color)); } if (!voicemails.isEmpty()) { entries.add(new PieEntry(voicemails.size(), getResources().getString(R.string.voicemail_n))); - colorsList.add(getResources().getColor(R.color.voicemail_color)); + colorsList.add(ContextCompat.getColor(this, R.color.voicemail_color)); } if (!unavailables.isEmpty()) { entries.add(new PieEntry(unavailables.size(), getResources().getString(R.string.unavailable_n))); - colorsList.add(getResources().getColor(R.color.unavailable_color)); + colorsList.add(ContextCompat.getColor(this, R.color.unavailable_color)); } PieDataSet dataSet = new PieDataSet(entries, getResources().getString(R.string.menu_stats)); @@ -223,7 +224,7 @@ private void createPieChart(List contacts, List voicemails, List contacts, List voicemails, List contacts, List voicemails, R.integer.horizontal_labels_count)); binding.lineChart.getGridLabelRenderer().setNumVerticalLabels(5); binding.lineChart.getGridLabelRenderer().setGridColor( - getResources().getColor(android.R.color.white)); + ContextCompat.getColor(this, android.R.color.white)); binding.lineChart.getGridLabelRenderer().setHumanRounding(false, true); binding.lineChart.getViewport().setMinX(firstTimestamp - 10); binding.lineChart.getViewport().setMaxX(System.currentTimeMillis() + 10); @@ -291,7 +292,7 @@ private void createLineGraph(List contacts, List voicemails, binding.lineChart.getLegendRenderer().setVisible(true); binding.lineChart.getLegendRenderer().setBackgroundColor( - getResources().getColor(android.R.color.transparent)); + ContextCompat.getColor(this, android.R.color.transparent)); binding.lineChart.getLegendRenderer().setFixedPosition(0, 0); /* @@ -316,7 +317,7 @@ private LineGraphSeries makeSeries(List timestamps, long firstT // Styling LineGraphSeries series = new LineGraphSeries<>(points); - series.setColor(getResources().getColor(colorId)); + series.setColor(ContextCompat.getColor(this, colorId)); series.setThickness(getResources().getDimensionPixelSize(R.dimen.graph_line_width)); return series; } diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/TutorialActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/TutorialActivity.java index 87f705f8..c1076e0f 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/TutorialActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/TutorialActivity.java @@ -10,16 +10,6 @@ import android.widget.Button; import android.widget.TextView; -import org.a5calls.android.a5calls.AppSingleton; -import org.a5calls.android.a5calls.FiveCallsApplication; -import org.a5calls.android.a5calls.R; -import org.a5calls.android.a5calls.databinding.ActivityTutorialBinding; -import org.a5calls.android.a5calls.model.AccountManager; -import org.a5calls.android.a5calls.net.FiveCallsApi; - -import java.text.NumberFormat; -import java.util.Locale; - import androidx.activity.OnBackPressedCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.Nullable; @@ -33,6 +23,16 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; +import org.a5calls.android.a5calls.AppSingleton; +import org.a5calls.android.a5calls.FiveCallsApplication; +import org.a5calls.android.a5calls.R; +import org.a5calls.android.a5calls.databinding.ActivityTutorialBinding; +import org.a5calls.android.a5calls.model.AccountManager; +import org.a5calls.android.a5calls.net.FiveCallsApi; + +import java.text.NumberFormat; +import java.util.Locale; + /** * Tutorial / splash screen activity */ diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/model/Contact.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/model/Contact.java index 2568d10b..d50a1f00 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/model/Contact.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/model/Contact.java @@ -4,7 +4,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; -import android.view.View; import org.a5calls.android.a5calls.R; diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java index 44242789..4d03d3f0 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java @@ -2,7 +2,6 @@ import android.content.Context; import android.net.Uri; -import android.os.Build; import android.text.TextUtils; import android.util.Log; diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/util/CustomTabsUtil.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/util/CustomTabsUtil.java index c0b569bc..cdba7bc4 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/util/CustomTabsUtil.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/util/CustomTabsUtil.java @@ -3,6 +3,7 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.net.Uri; +import androidx.browser.customtabs.CustomTabColorSchemeParams; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.content.ContextCompat; import android.widget.Toast; @@ -16,9 +17,12 @@ public class CustomTabsUtil { * @param uri The URL to navigate to */ public static void launchUrl(Context context, Uri uri) { - CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder() + CustomTabColorSchemeParams colorSchemeParams = new CustomTabColorSchemeParams.Builder() .setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary)) .build(); + CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder() + .setDefaultColorSchemeParams(colorSchemeParams) + .build(); try { customTabsIntent.launchUrl(context, uri); diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/view/GridItemDecoration.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/view/GridItemDecoration.java index c03b0739..3fbf35fd 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/view/GridItemDecoration.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/view/GridItemDecoration.java @@ -16,7 +16,7 @@ public GridItemDecoration(int gridSpacingPx, int gridSize) { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { - int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewAdapterPosition(); + int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getBindingAdapterPosition(); if (itemPosition < gridSize) { outRect.top = 0; diff --git a/5calls/app/src/test/java/org/a5calls/android/a5calls/FakeJSONData.java b/5calls/app/src/test/java/org/a5calls/android/a5calls/FakeJSONData.java index 75fa7772..4ad3d140 100644 --- a/5calls/app/src/test/java/org/a5calls/android/a5calls/FakeJSONData.java +++ b/5calls/app/src/test/java/org/a5calls/android/a5calls/FakeJSONData.java @@ -2,7 +2,6 @@ import org.json.JSONArray; import org.json.JSONException; -import org.json.JSONObject; public class FakeJSONData { // A snapshot of real issue data, used for testing. diff --git a/5calls/app/src/test/java/org/a5calls/android/a5calls/model/DatabaseHelperTest.java b/5calls/app/src/test/java/org/a5calls/android/a5calls/model/DatabaseHelperTest.java index 2d4e62c6..0fb8aaf0 100644 --- a/5calls/app/src/test/java/org/a5calls/android/a5calls/model/DatabaseHelperTest.java +++ b/5calls/app/src/test/java/org/a5calls/android/a5calls/model/DatabaseHelperTest.java @@ -1,6 +1,12 @@ package org.a5calls.android.a5calls.model; -import android.os.Parcel; +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import androidx.core.util.Pair; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.After; import org.junit.Before; @@ -11,12 +17,6 @@ import java.util.Calendar; import java.util.List; -import androidx.core.util.Pair; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import static androidx.test.core.app.ApplicationProvider.getApplicationContext; -import static org.junit.Assert.*; - /** * Unit tests for DatabaseHelper. */ diff --git a/5calls/app/src/test/java/org/a5calls/android/a5calls/model/IssueTest.java b/5calls/app/src/test/java/org/a5calls/android/a5calls/model/IssueTest.java index 383d3362..d22b0e63 100644 --- a/5calls/app/src/test/java/org/a5calls/android/a5calls/model/IssueTest.java +++ b/5calls/app/src/test/java/org/a5calls/android/a5calls/model/IssueTest.java @@ -1,24 +1,27 @@ package org.a5calls.android.a5calls.model; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import android.os.Bundle; +import androidx.test.ext.junit.runners.AndroidJUnit4; + import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import org.a5calls.android.a5calls.FakeJSONData; import org.json.JSONArray; -import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; - import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) public class IssueTest { From ed14a2a7f2b086ce89c7fa518f038444036bd29e Mon Sep 17 00:00:00 2001 From: Scott Peterson Date: Thu, 23 Oct 2025 15:50:53 -0400 Subject: [PATCH 2/2] Removed now unused REP_CALL_REQUEST_CODE --- .../org/a5calls/android/a5calls/controller/IssueActivity.java | 2 -- 1 file changed, 2 deletions(-) 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 8462346c..f025d934 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 @@ -79,8 +79,6 @@ public class IssueActivity extends AppCompatActivity implements FiveCallsApi.Scr public static final int RESULT_OK = 1; public static final int RESULT_SERVER_ERROR = 2; - private static final int REP_CALL_REQUEST_CODE = 1; - private static final String DONATE_URL = "https://secure.actblue.com/donate/5calls-donate?refcode=android&refcode2="; private static final int MIN_CALLS_TO_SHOW_CALL_STATS = 10;