From ae7a06cfa3e634d1e3d2e44ddb13a3424b7754e3 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Tue, 16 Aug 2022 23:20:43 +0200 Subject: [PATCH] Fix getSerializable/Extra deprecations See #225 --- .../remote_capture/CaptureService.java | 3 +- .../com/emanuelef/remote_capture/Utils.java | 30 +++++++++++++++++++ .../activities/EditFilterActivity.java | 3 +- .../activities/EditListActivity.java | 4 +-- .../activities/MainActivity.java | 26 +++++++++------- .../activities/StatsActivity.java | 3 +- .../fragments/ConnectionPayload.java | 3 +- .../fragments/ConnectionsFragment.java | 6 ++-- .../fragments/EditListFragment.java | 2 +- .../fragments/StatusFragment.java | 3 +- .../remote_capture/model/CaptureSettings.java | 16 +++++----- 11 files changed, 70 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java index 4132a7f6..548d28a5 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java +++ b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java @@ -234,7 +234,7 @@ public class CaptureService extends VpnService implements Runnable { // NOTE: a null intent may be delivered due to START_STICKY // It can be simulated by starting the capture, putting PCAPdroid in the background and then running: // adb shell ps | grep remote_capture | awk '{print $2}' | xargs adb shell run-as com.emanuelef.remote_capture.debug kill - CaptureSettings settings = (CaptureSettings) ((intent == null) ? null : intent.getSerializableExtra("settings")); + CaptureSettings settings = ((intent == null) ? null : Utils.getSerializableExtra(intent, "settings", CaptureSettings.class)); if(settings == null) { // Use the settings from mPrefs @@ -813,6 +813,7 @@ public class CaptureService extends VpnService implements Runnable { /* Stops the running Service. The SERVICE_STATUS_STOPPED notification is sent asynchronously * when mCaptureThread terminates. */ + @SuppressWarnings("deprecation") public static void stopService() { CaptureService captureService = INSTANCE; Log.d(TAG, "stopService called (instance? " + (captureService != null) + ")"); diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java index 5ab37a53..44e0a32f 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java +++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java @@ -54,6 +54,7 @@ import android.net.Uri; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; +import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Looper; @@ -75,6 +76,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.SearchView; @@ -99,6 +101,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Serializable; import java.math.BigInteger; import java.net.Inet4Address; import java.net.InetAddress; @@ -1072,6 +1075,7 @@ public class Utils { return false; } + @SuppressWarnings("deprecation") public static BuildType getVerifiedBuild(Context ctx, String package_name) { try { Signature[] signatures; @@ -1372,4 +1376,30 @@ public class Utils { public static String getUserAgent() { return "PCAPdroid v" + BuildConfig.VERSION_NAME; } + + @SuppressWarnings({"unchecked", "deprecation"}) + public static @Nullable T getSerializableExtra(Intent intent, String key, Class clazz) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + return intent.getSerializableExtra(key, clazz); + else { + try { + return (T)intent.getSerializableExtra(key); + } catch (ClassCastException unused) { + return null; + } + } + } + + @SuppressWarnings({"unchecked", "deprecation"}) + public static @Nullable T getSerializable(Bundle bundle, String key, Class clazz) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + return bundle.getSerializable(key, clazz); + else { + try { + return (T)bundle.getSerializable(key); + } catch (ClassCastException unused) { + return null; + } + } + } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java index c01bbb44..d7e840a5 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java @@ -39,6 +39,7 @@ import com.emanuelef.remote_capture.CaptureService; import com.emanuelef.remote_capture.ConnectionsRegister; import com.emanuelef.remote_capture.PCAPdroid; import com.emanuelef.remote_capture.R; +import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.model.ConnectionDescriptor.Status; import com.emanuelef.remote_capture.model.ConnectionDescriptor.DecryptionStatus; import com.emanuelef.remote_capture.model.ConnectionDescriptor.FilteringStatus; @@ -79,7 +80,7 @@ public class EditFilterActivity extends BaseActivity implements MenuProvider { Intent intent = getIntent(); if(intent != null) { - FilterDescriptor desc = (FilterDescriptor)intent.getSerializableExtra(FILTER_DESCRIPTOR); + FilterDescriptor desc = Utils.getSerializableExtra(intent, FILTER_DESCRIPTOR, FilterDescriptor.class); if(desc != null) mFilter = desc; } diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/EditListActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/EditListActivity.java index b6a5c5a4..90b1f42a 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/EditListActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/EditListActivity.java @@ -22,7 +22,7 @@ package com.emanuelef.remote_capture.activities; import android.os.Bundle; import com.emanuelef.remote_capture.R; -import com.emanuelef.remote_capture.fragments.EditListFragment; +import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.model.ListInfo; import com.emanuelef.remote_capture.model.MatchList; @@ -37,7 +37,7 @@ public class EditListActivity extends BaseActivity { super.onCreate(savedInstanceState); assert(getIntent() != null); - ListInfo.Type ltype = (ListInfo.Type) getIntent().getSerializableExtra(LIST_TYPE_EXTRA); + ListInfo.Type ltype = Utils.getSerializableExtra(getIntent(), LIST_TYPE_EXTRA, ListInfo.Type.class); assert(ltype != null); mListInfo = new ListInfo(ltype); diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java index 0347897a..b3d11709 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java @@ -368,20 +368,26 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig private void peerInfoResult(final ActivityResult result) { if((result.getResultCode() == RESULT_OK) && (result.getData() != null)) { Intent data = result.getData(); - Serializable skus_extra = data.getSerializableExtra("skus"); - if(skus_extra instanceof HashSet) { - HashSet skus = (HashSet) skus_extra; - Log.d(TAG, "Found peer app info"); - for(String sku: skus) { - Log.d(TAG, "Peer sku: " + sku); - mIab.addPeerSku(sku); + try { + @SuppressWarnings("unchecked") + HashSet skus = Utils.getSerializableExtra(data, "skus", HashSet.class); + + if(skus != null) { + Log.d(TAG, "Found peer app info"); + + for(String sku: skus) { + Log.d(TAG, "Peer sku: " + sku); + mIab.addPeerSku(sku); + } + + // success + return; } - - return; - } + } catch (ClassCastException ignored) {} } + // fail Log.d(TAG, "Invalid peer app result"); } diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java index d77c0060..23e37e58 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java @@ -118,7 +118,8 @@ public class StatsActivity extends BaseActivity implements MenuProvider { } private void updateStats(Intent intent) { - CaptureStats stats = (CaptureStats) intent.getSerializableExtra("value"); + CaptureStats stats = Utils.getSerializableExtra(intent, "value", CaptureStats.class); + assert(stats != null); mBytesSent.setText(Utils.formatBytes(stats.bytes_sent)); mBytesRcvd.setText(Utils.formatBytes(stats.bytes_rcvd)); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java index 6b0b6c15..4f8c6674 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java @@ -98,7 +98,8 @@ public class ConnectionPayload extends Fragment implements ConnectionDetailsActi PayloadChunk.ChunkType mode; assert args != null; ConnectionsRegister reg = CaptureService.requireConnsRegister(); - mode = (PayloadChunk.ChunkType) args.getSerializable("mode"); + mode = Utils.getSerializable(args, "mode", PayloadChunk.ChunkType.class); + assert(mode != null); mConn = reg.getConnById(args.getInt("conn_id")); if(mConn == null) { diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java index 88ce566e..ca3d361d 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java @@ -233,7 +233,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener Intent intent = requireActivity().getIntent(); if(intent != null) { - FilterDescriptor filter = (FilterDescriptor) intent.getSerializableExtra(FILTER_EXTRA); + FilterDescriptor filter = Utils.getSerializableExtra(intent, FILTER_EXTRA, FilterDescriptor.class); if(filter != null) { mAdapter.mFilter = filter; fromIntent = true; @@ -252,7 +252,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener search = savedInstanceState.getString("search"); if(!fromIntent && savedInstanceState.containsKey("filter_desc")) - mAdapter.mFilter = (FilterDescriptor) savedInstanceState.getSerializable("filter_desc"); + mAdapter.mFilter = Utils.getSerializable(savedInstanceState, "filter_desc", FilterDescriptor.class); } refreshActiveFilter(); @@ -801,7 +801,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener private void filterResult(final ActivityResult result) { if(result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { - FilterDescriptor descriptor = (FilterDescriptor)result.getData().getSerializableExtra(EditFilterActivity.FILTER_DESCRIPTOR); + FilterDescriptor descriptor = Utils.getSerializableExtra(result.getData(), EditFilterActivity.FILTER_DESCRIPTOR, FilterDescriptor.class); if(descriptor != null) { mAdapter.mFilter = descriptor; mAdapter.refreshFilteredConnections(); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java index b1141ebe..2de7dee7 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java @@ -100,7 +100,7 @@ public class EditListFragment extends Fragment implements MatchList.ListChangeLi mEmptyText = view.findViewById(R.id.list_empty); assert getArguments() != null; - mListInfo = new ListInfo((ListInfo.Type)getArguments().getSerializable(LIST_TYPE_ARG)); + mListInfo = new ListInfo(Utils.getSerializable(getArguments(), LIST_TYPE_ARG, ListInfo.Type.class)); mList = mListInfo.getList(); mList.addListChangeListener(this); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java index 9fc3fec8..f082bd44 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java @@ -283,7 +283,8 @@ public class StatusFragment extends Fragment implements AppStateListener, MenuPr } private void processStatsUpdateIntent(Intent intent) { - CaptureStats stats = (CaptureStats) intent.getSerializableExtra("value"); + CaptureStats stats = Utils.getSerializableExtra(intent, "value", CaptureStats.class); + assert(stats != null); Log.d("MainReceiver", "Got StatsUpdate: bytes_sent=" + stats.pkts_sent + ", bytes_rcvd=" + stats.bytes_rcvd + ", pkts_sent=" + stats.pkts_sent + ", pkts_rcvd=" + stats.pkts_rcvd); diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java b/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java index 8543fb74..f49ffae9 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java @@ -79,20 +79,20 @@ public class CaptureSettings implements Serializable { // get a integer value from the bundle. The value may be represented as an int or as a string. private static int getInt(Intent intent, String key, int def_value) { Bundle bundle = intent.getExtras(); - Object o = bundle.get(key); - if(o != null) - return Integer.parseInt(o.toString()); - return def_value; + String s = bundle.getString(key); + if(s != null) + return Integer.parseInt(s); + return bundle.getInt(key, def_value); } // get a boolean value from the bundle. The value may be represented as a bool or as a string. private static boolean getBool(Intent intent, String key, boolean def_value) { Bundle bundle = intent.getExtras(); - Object o = bundle.get(key); - if(o != null) - return Boolean.parseBoolean(o.toString()); - return def_value; + String s = bundle.getString(key); + if(s != null) + return Boolean.parseBoolean(s); + return bundle.getBoolean(key, def_value); } }