diff --git a/build.gradle b/build.gradle index f5a9444c..d4bf36e7 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.1' } } @@ -16,6 +16,6 @@ allprojects { } ext { - compileSdkVersion = 28 - targetSdkVersion = 28 + compileSdkVersion = 29 + targetSdkVersion = 29 } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 81cad747..946d06f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/stetho-js-rhino/README.md b/stetho-js-rhino/README.md index c2c07608..2b3ef9ab 100644 --- a/stetho-js-rhino/README.md +++ b/stetho-js-rhino/README.md @@ -7,7 +7,7 @@ This [Stetho](https://facebook.github.io/stetho) plugin adds a JavaScript consol ### Download Download [the latest JARs](https://github.com/facebook/stetho/releases/latest) or grab via Gradle: ```groovy -compile 'com.facebook.stetho:stetho-js-rhino:1.4.2' +implementation 'com.facebook.stetho:stetho-js-rhino:1.4.2' ``` or Maven: ```xml diff --git a/stetho-js-rhino/build.gradle b/stetho-js-rhino/build.gradle index 7a4d3c40..f5912415 100644 --- a/stetho-js-rhino/build.gradle +++ b/stetho-js-rhino/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 9 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" @@ -19,9 +19,9 @@ android { dependencies { implementation project(':stetho') - implementation 'com.google.code.findbugs:jsr305:2.0.1' + implementation 'com.google.code.findbugs:jsr305:2.0.3' implementation 'org.mozilla:rhino:1.7.6' - implementation 'com.android.support:support-annotations:28.0.0' + implementation 'androidx.annotation:annotation:1.1.0' testImplementation 'junit:junit:4.12' } diff --git a/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsFormat.java b/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsFormat.java index 83a82ff5..0321efab 100644 --- a/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsFormat.java +++ b/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsFormat.java @@ -7,12 +7,12 @@ package com.facebook.stetho.rhino; -import android.support.annotation.NonNull; - import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import androidx.annotation.NonNull; + /** *

Formatter that tries to mimic

console.log()
's format as close as possible.

* @@ -64,6 +64,7 @@ public char charAt(int index) { return array[start + index]; } + @NonNull @Override public CharSequence subSequence(int start, int end) { return new ArrayCharSequence(array, this.start + start, this.start + end); @@ -124,7 +125,7 @@ public CharSequence subSequence(int start, int end) { } // Analyze the format. We don't have named captures in android yet so we will inspect - // the groups. They are each optional but we can find out which one is whic easily. + // the groups. They are each optional but we can find out which one is which easily. // Remember that we want to parse: %[argument_index$][flags][width][.precision]conversion // // - `index` ends with '$' diff --git a/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeRepl.java b/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeRepl.java index 4dbe33dc..b8512ee7 100644 --- a/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeRepl.java +++ b/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeRepl.java @@ -7,12 +7,15 @@ package com.facebook.stetho.rhino; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; + import com.facebook.stetho.inspector.console.RuntimeRepl; + import org.mozilla.javascript.Context; import org.mozilla.javascript.ScriptableObject; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + class JsRuntimeRepl implements RuntimeRepl { private final @NonNull ScriptableObject mJsScope; @@ -22,7 +25,8 @@ class JsRuntimeRepl implements RuntimeRepl { } @Override - public @Nullable Object evaluate(@NonNull String expression) throws Throwable { + public @Nullable + Object evaluate(@NonNull String expression) throws Throwable { Object result; final Context jsContext = enterJsContext(); try { diff --git a/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeReplFactoryBuilder.java b/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeReplFactoryBuilder.java index 655677f6..5af647d4 100644 --- a/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeReplFactoryBuilder.java +++ b/stetho-js-rhino/src/main/java/com/facebook/stetho/rhino/JsRuntimeReplFactoryBuilder.java @@ -7,13 +7,14 @@ package com.facebook.stetho.rhino; -import android.support.annotation.NonNull; import android.util.Log; + import com.facebook.stetho.common.LogUtil; import com.facebook.stetho.inspector.console.CLog; import com.facebook.stetho.inspector.console.RuntimeRepl; import com.facebook.stetho.inspector.console.RuntimeReplFactory; import com.facebook.stetho.inspector.protocol.module.Console; + import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.ImporterTopLevel; @@ -26,6 +27,8 @@ import java.util.Map; import java.util.Set; +import androidx.annotation.NonNull; + /** *

Builder used to setup the javascript runtime to be used by stetho.

* diff --git a/stetho-okhttp/build.gradle b/stetho-okhttp/build.gradle index 87050b99..1e635eca 100644 --- a/stetho-okhttp/build.gradle +++ b/stetho-okhttp/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 9 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" @@ -21,7 +21,7 @@ android { dependencies { implementation project(':stetho') - implementation 'com.google.code.findbugs:jsr305:2.0.1' + implementation 'com.google.code.findbugs:jsr305:2.0.3' implementation 'com.squareup.okhttp:okhttp:2.7.2' testImplementation 'junit:junit:4.12' @@ -29,12 +29,12 @@ dependencies { exclude module: 'commons-logging' exclude module: 'httpclient' } - testImplementation 'org.powermock:powermock-api-mockito:1.6.1' - testImplementation 'org.powermock:powermock-module-junit4:1.6.1' + testImplementation 'org.powermock:powermock-api-mockito:1.6.6' + testImplementation 'org.powermock:powermock-module-junit4:1.6.6' // Needed for Robolectric and PowerMock to be combined in a single test. - testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1' - testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1' + testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.6' + testImplementation 'org.powermock:powermock-classloading-xstream:1.6.6' testImplementation 'com.squareup.okhttp:mockwebserver:2.7.2' } diff --git a/stetho-okhttp3/build.gradle b/stetho-okhttp3/build.gradle index f9ab526c..653e073b 100644 --- a/stetho-okhttp3/build.gradle +++ b/stetho-okhttp3/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 9 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" @@ -21,7 +21,7 @@ android { dependencies { implementation project(':stetho') - implementation 'com.google.code.findbugs:jsr305:2.0.1' + implementation 'com.google.code.findbugs:jsr305:2.0.3' implementation 'com.squareup.okhttp3:okhttp:3.4.2' testImplementation 'junit:junit:4.12' @@ -29,12 +29,12 @@ dependencies { exclude module: 'commons-logging' exclude module: 'httpclient' } - testImplementation 'org.powermock:powermock-api-mockito:1.6.1' - testImplementation 'org.powermock:powermock-module-junit4:1.6.1' + testImplementation 'org.powermock:powermock-api-mockito:1.6.6' + testImplementation 'org.powermock:powermock-module-junit4:1.6.6' // Needed for Robolectric and PowerMock to be combined in a single test. - testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1' - testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1' + testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.6' + testImplementation 'org.powermock:powermock-classloading-xstream:1.6.6' testImplementation 'com.squareup.okhttp3:mockwebserver:3.4.2' } diff --git a/stetho-sample/build.gradle b/stetho-sample/build.gradle index 25a3f966..5056ae45 100644 --- a/stetho-sample/build.gradle +++ b/stetho-sample/build.gradle @@ -10,7 +10,7 @@ android { defaultConfig { applicationId "com.facebook.stetho.sample" - minSdkVersion 11 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" @@ -43,8 +43,8 @@ dependencies { // way to express this is: // // dependencies { - // debugCompile 'com.facebook.stetho:stetho:' - // compile 'com.facebook.stetho:stetho-urlconnection:' + // debugImplementation 'com.facebook.stetho:stetho:' + // implementation 'com.facebook.stetho:stetho-urlconnection:' // } // // For Stetho developers, to verify locally that things are working @@ -54,8 +54,8 @@ dependencies { // ./gradlew installArchives // // Then uncomment the Maven style dependency and comment the project one: - //releaseCompile "com.facebook.stetho:stetho-urlconnection:${VERSION_NAME}" + //releaseImplementation "com.facebook.stetho:stetho-urlconnection:${VERSION_NAME}" releaseImplementation project(':stetho-urlconnection') - implementation 'com.google.code.findbugs:jsr305:2.0.1' + implementation 'com.google.code.findbugs:jsr305:2.0.3' } diff --git a/stetho-sample/src/debug/java/com/facebook/stetho/sample/SampleDebugApplication.java b/stetho-sample/src/debug/java/com/facebook/stetho/sample/SampleDebugApplication.java index 0b7bb422..b0c8c9bc 100644 --- a/stetho-sample/src/debug/java/com/facebook/stetho/sample/SampleDebugApplication.java +++ b/stetho-sample/src/debug/java/com/facebook/stetho/sample/SampleDebugApplication.java @@ -7,12 +7,11 @@ package com.facebook.stetho.sample; -import android.annotation.TargetApi; import android.content.Context; -import android.os.Build; import android.os.SystemClock; import android.provider.CalendarContract; import android.util.Log; + import com.facebook.stetho.DumperPluginsProvider; import com.facebook.stetho.InspectorModulesProvider; import com.facebook.stetho.Stetho; @@ -66,7 +65,6 @@ public Iterable get() { .finish(); } - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) private ContentProviderDatabaseDriver createContentProviderDatabaseDriver(Context context) { ContentProviderSchema calendarsSchema = new ContentProviderSchema.Builder() .table(new Table.Builder() diff --git a/stetho-sample/src/main/java/com/facebook/stetho/sample/APODActivity.java b/stetho-sample/src/main/java/com/facebook/stetho/sample/APODActivity.java index 57f6551a..23f289c9 100644 --- a/stetho-sample/src/main/java/com/facebook/stetho/sample/APODActivity.java +++ b/stetho-sample/src/main/java/com/facebook/stetho/sample/APODActivity.java @@ -7,8 +7,6 @@ package com.facebook.stetho.sample; -import java.io.IOException; - import android.app.ListActivity; import android.app.LoaderManager; import android.content.Context; @@ -29,6 +27,8 @@ import android.widget.ImageView; import android.widget.TextView; +import java.io.IOException; + /** * Simple demonstration of fetching and caching a specific RSS feed showing the * "Astronomy Picture of the Day" feed from NASA. This demonstrates both the database access @@ -164,9 +164,9 @@ private static class ViewHolder { int position; public ViewHolder(View v) { - image = (ImageView)v.findViewById(R.id.image); - title = (TextView)v.findViewById(R.id.title); - description = (TextView)v.findViewById(R.id.description); + image = v.findViewById(R.id.image); + title = v.findViewById(R.id.title); + description = v.findViewById(R.id.description); } } diff --git a/stetho-sample/src/main/java/com/facebook/stetho/sample/APODContentProvider.java b/stetho-sample/src/main/java/com/facebook/stetho/sample/APODContentProvider.java index 51d18b08..2b13a0f9 100644 --- a/stetho-sample/src/main/java/com/facebook/stetho/sample/APODContentProvider.java +++ b/stetho-sample/src/main/java/com/facebook/stetho/sample/APODContentProvider.java @@ -7,8 +7,6 @@ package com.facebook.stetho.sample; -import java.util.ArrayList; - import android.content.ContentProvider; import android.content.ContentProviderOperation; import android.content.ContentProviderResult; @@ -20,6 +18,10 @@ import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; +import java.util.ArrayList; + +import javax.annotation.Nonnull; + public class APODContentProvider extends ContentProvider { private APODSQLiteOpenHelper mOpenHelper; @@ -31,7 +33,7 @@ public boolean onCreate() { @Override public Cursor query( - Uri uri, + @Nonnull Uri uri, String[] projection, String selection, String[] selectionArgs, @@ -51,7 +53,7 @@ public Cursor query( } @Override - public String getType(Uri uri) { + public String getType(@Nonnull Uri uri) { return null; } @@ -64,7 +66,7 @@ public Uri insert(Uri uri, ContentValues values) { } @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { + public int delete(@Nonnull Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); int count = db.delete(APODContract.TABLE_NAME, selection, selectionArgs); notifyChange(); @@ -72,15 +74,16 @@ public int delete(Uri uri, String selection, String[] selectionArgs) { } @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + public int update(@Nonnull Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); int count = db.update(APODContract.TABLE_NAME, values, selection, selectionArgs); notifyChange(); return count; } + @Nonnull @Override - public ContentProviderResult[] applyBatch(ArrayList operations) + public ContentProviderResult[] applyBatch(@Nonnull ArrayList operations) throws OperationApplicationException { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); db.beginTransaction(); diff --git a/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCChatActivity.java b/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCChatActivity.java index 5834031b..cf1c897e 100644 --- a/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCChatActivity.java +++ b/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCChatActivity.java @@ -58,11 +58,11 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.irc_chat_activity); - mConsoleDisplay = (ListView) findViewById(R.id.console_display); + mConsoleDisplay = findViewById(R.id.console_display); mConsoleRowAdapter = new IRCConsoleRowAdapter(this); mConsoleDisplay.setAdapter(mConsoleRowAdapter); - mConsoleInput = (TextView) findViewById(R.id.console_input); + mConsoleInput = findViewById(R.id.console_input); mConsoleInput.setOnEditorActionListener(mOnConsoleInputEditorAction); findViewById(R.id.console_send).setOnClickListener(mConsoleSendClicked); diff --git a/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCConnectActivity.java b/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCConnectActivity.java index 8b209a83..342773cf 100644 --- a/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCConnectActivity.java +++ b/stetho-sample/src/main/java/com/facebook/stetho/sample/IRCConnectActivity.java @@ -39,12 +39,12 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.irc_connect_activity); - mIRCPriorError = (TextView) findViewById(R.id.irc_prior_error); - mIRCServer = (EditText) findViewById(R.id.irc_server); + mIRCPriorError = findViewById(R.id.irc_prior_error); + mIRCServer = findViewById(R.id.irc_server); if (TextUtils.isEmpty(mIRCServer.getText())) { mIRCServer.setText(DEFAULT_HOST); } - mIRCNickname = (EditText) findViewById(R.id.irc_nickname); + mIRCNickname = findViewById(R.id.irc_nickname); if (TextUtils.isEmpty(mIRCNickname.getText())) { mIRCNickname.setText("stetho" + (new Random().nextInt(9999) + 1)); } diff --git a/stetho-timber/build.gradle b/stetho-timber/build.gradle index eb43d25e..911c8940 100644 --- a/stetho-timber/build.gradle +++ b/stetho-timber/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 11 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" diff --git a/stetho-urlconnection/build.gradle b/stetho-urlconnection/build.gradle index bc3941d4..05bfdc7d 100644 --- a/stetho-urlconnection/build.gradle +++ b/stetho-urlconnection/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 9 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" @@ -13,7 +13,7 @@ android { dependencies { implementation project(':stetho') - implementation 'com.google.code.findbugs:jsr305:2.0.1' + implementation 'com.google.code.findbugs:jsr305:2.0.3' } apply from: rootProject.file('release.gradle') diff --git a/stetho/build.gradle b/stetho/build.gradle index 329ea9d8..d75550b0 100644 --- a/stetho/build.gradle +++ b/stetho/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { - minSdkVersion 9 + minSdkVersion 14 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" @@ -15,18 +15,20 @@ android { dependencies { implementation 'commons-cli:commons-cli:1.2' - implementation 'com.google.code.findbugs:jsr305:2.0.1' - implementation 'com.android.support:support-annotations:28.0.0' + implementation 'com.google.code.findbugs:jsr305:2.0.3' + implementation 'androidx.annotation:annotation:1.1.0' - implementation 'com.android.support:appcompat-v7:23.0.1' // optional + // Optional: reflection is used to test whether Fragment (and the transient AndroidX Core) are actually present. + // TODO: either make the optional dependencies actually optional via `compileOnly` or remove the runtime checks + implementation 'androidx.fragment:fragment:1.0.0' testImplementation 'junit:junit:4.12' testImplementation('org.robolectric:robolectric:2.4') { exclude module: 'commons-logging' exclude module: 'httpclient' } - testImplementation 'org.powermock:powermock-api-mockito:1.6.1' - testImplementation 'org.powermock:powermock-module-junit4:1.6.1' + testImplementation 'org.powermock:powermock-api-mockito:1.6.6' + testImplementation 'org.powermock:powermock-module-junit4:1.6.6' } apply from: rootProject.file('release.gradle') diff --git a/stetho/gradle.properties b/stetho/gradle.properties index a181a7be..19ffafd2 100644 --- a/stetho/gradle.properties +++ b/stetho/gradle.properties @@ -1,4 +1,3 @@ POM_NAME=Stetho POM_ARTIFACT_ID=stetho -POM_OPTIONAL_DEPS=com.android.support:appcompat-v7 POM_PACKAGING=aar diff --git a/stetho/src/main/java/com/facebook/stetho/Stetho.java b/stetho/src/main/java/com/facebook/stetho/Stetho.java index 4f31d203..a161f4bd 100644 --- a/stetho/src/main/java/com/facebook/stetho/Stetho.java +++ b/stetho/src/main/java/com/facebook/stetho/Stetho.java @@ -10,8 +10,7 @@ import android.app.Application; import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; -import com.facebook.stetho.common.LogUtil; + import com.facebook.stetho.common.Util; import com.facebook.stetho.dumpapp.DumpappHttpSocketLikeHandler; import com.facebook.stetho.dumpapp.DumpappSocketLikeHandler; @@ -33,7 +32,6 @@ import com.facebook.stetho.inspector.elements.Document; import com.facebook.stetho.inspector.elements.DocumentProviderFactory; import com.facebook.stetho.inspector.elements.android.ActivityTracker; -import com.facebook.stetho.inspector.elements.android.AndroidDocumentConstants; import com.facebook.stetho.inspector.elements.android.AndroidDocumentProviderFactory; import com.facebook.stetho.inspector.protocol.ChromeDevtoolsDomain; import com.facebook.stetho.inspector.protocol.module.CSS; @@ -41,7 +39,6 @@ import com.facebook.stetho.inspector.protocol.module.DOM; import com.facebook.stetho.inspector.protocol.module.DOMStorage; import com.facebook.stetho.inspector.protocol.module.Database; -import com.facebook.stetho.inspector.protocol.module.DatabaseConstants; import com.facebook.stetho.inspector.protocol.module.DatabaseDriver2; import com.facebook.stetho.inspector.protocol.module.Debugger; import com.facebook.stetho.inspector.protocol.module.HeapProfiler; @@ -55,19 +52,20 @@ import com.facebook.stetho.server.AddressNameHelper; import com.facebook.stetho.server.LazySocketHandler; import com.facebook.stetho.server.LocalSocketServer; -import com.facebook.stetho.server.ServerManager; import com.facebook.stetho.server.ProtocolDetectingSocketHandler; +import com.facebook.stetho.server.ServerManager; import com.facebook.stetho.server.SocketHandler; import com.facebook.stetho.server.SocketHandlerFactory; -import javax.annotation.Nullable; - import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + /** * Initialization and configuration entry point for the Stetho debugging system. Simple usage with * default plugins and features enabled: @@ -122,13 +120,7 @@ protected Iterable getInspectorModules() { public static void initialize(final Initializer initializer) { // Hook activity tracking so that after Stetho is attached we can figure out what // activities are present. - boolean isTrackingActivities = ActivityTracker.get().beginTrackingIfPossible( - (Application)initializer.mContext.getApplicationContext()); - if (!isTrackingActivities) { - LogUtil.w("Automatic activity tracking not available on this API level, caller must invoke " + - "ActivityTracker methods manually!"); - } - + ActivityTracker.get().beginTracking((Application)initializer.mContext.getApplicationContext()); initializer.start(); } @@ -369,11 +361,9 @@ public Iterable finish() { provideIfDesired(new Console()); provideIfDesired(new Debugger()); DocumentProviderFactory documentModel = resolveDocumentProvider(); - if (documentModel != null) { - Document document = new Document(documentModel); - provideIfDesired(new DOM(document)); - provideIfDesired(new CSS(document)); - } + Document document = new Document(documentModel); + provideIfDesired(new DOM(document)); + provideIfDesired(new CSS(document)); provideIfDesired(new DOMStorage(mContext)); provideIfDesired(new HeapProfiler()); provideIfDesired(new Inspector()); @@ -386,39 +376,34 @@ public Iterable finish() { mRuntimeRepl : new RhinoDetectingRuntimeReplFactory(mContext))); provideIfDesired(new Worker()); - if (Build.VERSION.SDK_INT >= DatabaseConstants.MIN_API_LEVEL) { - Database database = new Database(); - boolean hasSqliteDatabaseDriver = false; - if (mDatabaseDrivers != null) { - for (DatabaseDriver2 databaseDriver : mDatabaseDrivers) { - database.add(databaseDriver); - if (databaseDriver instanceof SqliteDatabaseDriver) { - hasSqliteDatabaseDriver = true; - } + Database database = new Database(); + boolean hasSqliteDatabaseDriver = false; + if (mDatabaseDrivers != null) { + for (DatabaseDriver2 databaseDriver : mDatabaseDrivers) { + database.add(databaseDriver); + if (databaseDriver instanceof SqliteDatabaseDriver) { + hasSqliteDatabaseDriver = true; } } - if (!hasSqliteDatabaseDriver && !mExcludeSqliteDatabaseDriver) { - database.add( - new SqliteDatabaseDriver(mContext, - mDatabaseFilesProvider != null ? - mDatabaseFilesProvider : - new DefaultDatabaseFilesProvider(mContext), - new DefaultDatabaseConnectionProvider())); - } - provideIfDesired(database); } + if (!hasSqliteDatabaseDriver && !mExcludeSqliteDatabaseDriver) { + database.add( + new SqliteDatabaseDriver(mContext, + mDatabaseFilesProvider != null ? + mDatabaseFilesProvider : + new DefaultDatabaseFilesProvider(mContext), + new DefaultDatabaseConnectionProvider())); + } + provideIfDesired(database); return mDelegate.finish(); } - @Nullable + @Nonnull private DocumentProviderFactory resolveDocumentProvider() { if (mDocumentProvider != null) { return mDocumentProvider; } - if (Build.VERSION.SDK_INT >= AndroidDocumentConstants.MIN_API_LEVEL) { - return new AndroidDocumentProviderFactory(mContext, Collections.emptyList()); - } - return null; + return new AndroidDocumentProviderFactory(mContext, Collections.emptyList()); } } diff --git a/stetho/src/main/java/com/facebook/stetho/common/ReflectionUtil.java b/stetho/src/main/java/com/facebook/stetho/common/ReflectionUtil.java index 75e5cfb0..cc31ba11 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/ReflectionUtil.java +++ b/stetho/src/main/java/com/facebook/stetho/common/ReflectionUtil.java @@ -8,8 +8,6 @@ package com.facebook.stetho.common; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import javax.annotation.Nullable; @@ -17,15 +15,6 @@ public final class ReflectionUtil { private ReflectionUtil() { } - @Nullable - public static Class tryGetClassForName(String className) { - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } - @Nullable public static Field tryGetDeclaredField(Class theClass, String fieldName) { try { diff --git a/stetho/src/main/java/com/facebook/stetho/common/android/AccessibilityUtil.java b/stetho/src/main/java/com/facebook/stetho/common/android/AccessibilityUtil.java index ef86afe2..35bc8eff 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/android/AccessibilityUtil.java +++ b/stetho/src/main/java/com/facebook/stetho/common/android/AccessibilityUtil.java @@ -7,9 +7,6 @@ package com.facebook.stetho.common.android; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -21,6 +18,10 @@ import java.util.List; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; + /** * This class provides utility methods for determining certain accessibility properties of * {@link View}s and {@link AccessibilityNodeInfoCompat}s. It is porting some of the checks from @@ -241,9 +242,6 @@ public static boolean hasFocusableAncestor( AccessibilityNodeInfoCompat parentNode = AccessibilityNodeInfoCompat.obtain(); try { ViewCompat.onInitializeAccessibilityNodeInfo((View) parentView, parentNode); - if (parentNode == null) { - return false; - } if (isAccessibilityFocusable(parentNode, (View) parentView)) { return true; diff --git a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompat.java b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompat.java index a80ac86f..8ae662bb 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompat.java +++ b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompat.java @@ -8,15 +8,17 @@ package com.facebook.stetho.common.android; import android.app.Activity; -import android.os.Build; + import com.facebook.stetho.common.ReflectionUtil; -import com.facebook.stetho.common.Util; -import javax.annotation.Nullable; -import javax.annotation.concurrent.NotThreadSafe; import java.lang.reflect.Field; import java.util.List; +import javax.annotation.Nullable; +import javax.annotation.concurrent.NotThreadSafe; + +import androidx.annotation.NonNull; + /** * Compatibility abstraction which allows us to generalize access to both the * support library's fragments and the built-in framework version. Note: both versions @@ -43,14 +45,19 @@ public abstract class FragmentCompat< private static final boolean sHasSupportFragment; static { - sHasSupportFragment = ReflectionUtil.tryGetClassForName( - "android.support.v4.app.Fragment") != null; + boolean hasSupportFragment = false; + try { + androidx.fragment.app.Fragment.class.getClass(); + hasSupportFragment = true; + } catch (NoClassDefFoundError ignore) { + // AndroidX Fragment is not in classpath. + } + sHasSupportFragment = hasSupportFragment; } - @Nullable + @NonNull public static FragmentCompat getFrameworkInstance() { - if (sFrameworkInstance == null && - Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (sFrameworkInstance == null) { sFrameworkInstance = new FragmentCompatFramework(); } return sFrameworkInstance; @@ -58,8 +65,7 @@ public static FragmentCompat getFrameworkInstance() { @Nullable public static FragmentCompat getSupportLibInstance() { - if (sSupportInstance == null && - sHasSupportFragment) { + if (sSupportInstance == null && sHasSupportFragment) { sSupportInstance = new FragmentCompatSupportLib(); } return sSupportInstance; diff --git a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatFramework.java b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatFramework.java index 797b1cc9..b7c84c23 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatFramework.java +++ b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatFramework.java @@ -19,7 +19,6 @@ import javax.annotation.Nullable; -@TargetApi(Build.VERSION_CODES.HONEYCOMB) final class FragmentCompatFramework extends FragmentCompat { private static final FragmentAccessorFrameworkHoneycomb sFragmentAccessor; diff --git a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatSupportLib.java b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatSupportLib.java index 589ddda3..979ebebc 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatSupportLib.java +++ b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatSupportLib.java @@ -9,14 +9,15 @@ import android.app.Dialog; import android.content.res.Resources; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; import android.view.View; import javax.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; + final class FragmentCompatSupportLib extends FragmentCompat { private static final FragmentAccessorSupportLib sFragmentAccessor = diff --git a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatUtil.java b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatUtil.java index ea16b3af..574d05ce 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatUtil.java +++ b/stetho/src/main/java/com/facebook/stetho/common/android/FragmentCompatUtil.java @@ -26,12 +26,7 @@ public static boolean isDialogFragment(Object fragment) { } FragmentCompat framework = FragmentCompat.getFrameworkInstance(); - if (framework != null && - framework.getDialogFragmentClass().isInstance(fragment)) { - return true; - } - - return false; + return framework.getDialogFragmentClass().isInstance(fragment); } @Nullable @@ -57,19 +52,11 @@ private static Object findFragmentForViewInActivity(Activity activity, View view } } - // Try the actual Android runtime version if we are on a sufficiently high API level for it to - // exist. Note that technically we can have both the support library and the framework + // Use the actual Android runtime version. Note that technically we can have both the support library and the framework // version in the same object instance due to FragmentActivity extending Activity (which has // fragment support in the system). FragmentCompat framework = FragmentCompat.getFrameworkInstance(); - if (framework != null) { - Object fragment = findFragmentForViewInActivity(framework, activity, view); - if (fragment != null) { - return fragment; - } - } - - return null; + return findFragmentForViewInActivity(framework, activity, view); } private static Object findFragmentForViewInActivity( diff --git a/stetho/src/main/java/com/facebook/stetho/common/android/ViewGroupUtil.java b/stetho/src/main/java/com/facebook/stetho/common/android/ViewGroupUtil.java index aeb9efd3..77f246ac 100644 --- a/stetho/src/main/java/com/facebook/stetho/common/android/ViewGroupUtil.java +++ b/stetho/src/main/java/com/facebook/stetho/common/android/ViewGroupUtil.java @@ -10,12 +10,6 @@ import android.view.View; import android.view.ViewGroup; -import com.facebook.stetho.common.ReflectionUtil; - -import java.lang.reflect.Field; - -import javax.annotation.Nullable; - public final class ViewGroupUtil { private ViewGroupUtil() { } diff --git a/stetho/src/main/java/com/facebook/stetho/dumpapp/Framer.java b/stetho/src/main/java/com/facebook/stetho/dumpapp/Framer.java index d366c2ee..921990d9 100644 --- a/stetho/src/main/java/com/facebook/stetho/dumpapp/Framer.java +++ b/stetho/src/main/java/com/facebook/stetho/dumpapp/Framer.java @@ -9,10 +9,7 @@ import com.facebook.stetho.common.LogUtil; -import javax.annotation.Nullable; - import java.io.BufferedOutputStream; -import java.io.Closeable; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -21,6 +18,11 @@ import java.io.PrintStream; import java.nio.charset.Charset; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import androidx.annotation.NonNull; + /** * Implements framing protocol that allows us to implement a command-line protocol via * sockets complete with stdin/stdout/stderr, exit codes, and input arguments. @@ -145,12 +147,12 @@ public int read() throws IOException { } @Override - public int read(byte[] buffer) throws IOException { + public int read(@NonNull byte[] buffer) throws IOException { return read(buffer, 0, buffer.length); } @Override - public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { + public int read(@NonNull byte[] buffer, int byteOffset, int byteCount) throws IOException { mClosedHelper.throwIfClosed(); synchronized (Framer.this) { @@ -207,7 +209,7 @@ public FramingOutputStream(byte prefix) { } @Override - public void write(byte[] buffer, int offset, int length) throws IOException { + public void write(@Nonnull byte[] buffer, int offset, int length) throws IOException { mClosedHelper.throwIfClosed(); if (length > 0) { try { @@ -231,7 +233,7 @@ public void write(int oneByte) throws IOException { } @Override - public void write(byte[] buffer) throws IOException { + public void write(@Nonnull byte[] buffer) throws IOException { write(buffer, 0, buffer.length); } diff --git a/stetho/src/main/java/com/facebook/stetho/dumpapp/plugins/SharedPreferencesDumperPlugin.java b/stetho/src/main/java/com/facebook/stetho/dumpapp/plugins/SharedPreferencesDumperPlugin.java index 791dd04d..027649aa 100644 --- a/stetho/src/main/java/com/facebook/stetho/dumpapp/plugins/SharedPreferencesDumperPlugin.java +++ b/stetho/src/main/java/com/facebook/stetho/dumpapp/plugins/SharedPreferencesDumperPlugin.java @@ -8,18 +8,15 @@ package com.facebook.stetho.dumpapp.plugins; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; import android.text.TextUtils; + import com.facebook.stetho.dumpapp.DumpUsageException; import com.facebook.stetho.dumpapp.DumperContext; import com.facebook.stetho.dumpapp.DumperPlugin; import com.facebook.stetho.inspector.domstorage.SharedPreferencesHelper; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.File; import java.io.PrintStream; import java.util.HashSet; @@ -27,6 +24,9 @@ import java.util.List; import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + public class SharedPreferencesDumperPlugin implements DumperPlugin { private static final String XML_SUFFIX = ".xml"; @@ -118,7 +118,6 @@ private static String nextArgValue(Iterator iter) throws DumpUsageExcept return nextArg(iter, "Expected "); } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) private static void putStringSet( SharedPreferences.Editor editor, String key, diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/database/SQLiteDatabaseCompat.java b/stetho/src/main/java/com/facebook/stetho/inspector/database/SQLiteDatabaseCompat.java index 5634083f..6b80cefe 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/database/SQLiteDatabaseCompat.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/database/SQLiteDatabaseCompat.java @@ -10,7 +10,8 @@ import android.annotation.TargetApi; import android.database.sqlite.SQLiteDatabase; import android.os.Build; -import android.support.annotation.IntDef; + +import androidx.annotation.IntDef; /** * Compatibility layer which supports opening databases with WAL and foreign key support @@ -31,10 +32,8 @@ public abstract class SQLiteDatabaseCompat { static { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { sInstance = new JellyBeanAndBeyondImpl(); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - sInstance = new HoneycombImpl(); } else { - sInstance = new NoopImpl(); + sInstance = new HoneycombImpl(); } } @@ -82,15 +81,4 @@ public void enableFeatures(@SQLiteOpenOptions int openOptions, SQLiteDatabase db } } } - - private static class NoopImpl extends SQLiteDatabaseCompat { - @Override - public int provideOpenFlags(@SQLiteOpenOptions int openOptions) { - return 0; - } - - @Override - public void enableFeatures(@SQLiteOpenOptions int openOptions, SQLiteDatabase db) { - } - } } diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/database/SqliteDatabaseDriver.java b/stetho/src/main/java/com/facebook/stetho/inspector/database/SqliteDatabaseDriver.java index 7dec2b8f..27638924 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/database/SqliteDatabaseDriver.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/database/SqliteDatabaseDriver.java @@ -7,7 +7,6 @@ package com.facebook.stetho.inspector.database; -import android.annotation.TargetApi; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; @@ -16,7 +15,6 @@ import com.facebook.stetho.common.Util; import com.facebook.stetho.inspector.protocol.module.Database; -import com.facebook.stetho.inspector.protocol.module.DatabaseConstants; import com.facebook.stetho.inspector.protocol.module.DatabaseDescriptor; import com.facebook.stetho.inspector.protocol.module.DatabaseDriver2; @@ -182,7 +180,6 @@ private static String getFirstWord(String s) { return firstSpace >= 0 ? s.substring(0, firstSpace) : s; } - @TargetApi(DatabaseConstants.MIN_API_LEVEL) private T executeUpdateDelete( SQLiteDatabase database, String query, diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AccessibilityNodeInfoWrapper.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AccessibilityNodeInfoWrapper.java index 95c45aad..a6288cdb 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AccessibilityNodeInfoWrapper.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AccessibilityNodeInfoWrapper.java @@ -7,10 +7,6 @@ package com.facebook.stetho.inspector.elements.android; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -19,6 +15,11 @@ import com.facebook.stetho.common.android.AccessibilityUtil; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; + public final class AccessibilityNodeInfoWrapper { public AccessibilityNodeInfoWrapper() { diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ActivityTracker.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ActivityTracker.java index 158b3b60..057f874f 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ActivityTracker.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ActivityTracker.java @@ -7,17 +7,12 @@ package com.facebook.stetho.inspector.elements.android; -import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; -import android.os.Build; import android.os.Bundle; import android.os.Looper; -import com.facebook.stetho.common.Util; -import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; -import javax.annotation.concurrent.NotThreadSafe; +import com.facebook.stetho.common.Util; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -25,15 +20,14 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; +import javax.annotation.concurrent.NotThreadSafe; + /** * Tracks which {@link Activity} instances have been created and not yet destroyed in creation - * order for use by Stetho features. Note that automatic tracking is not available for - * all versions of Android but it is possible to manually track activities using the {@link #add} - * and {@link #remove} methods exposed below. Be aware that this is an easy opportunity to - * cause serious memory leaks in your application however. Use with caution. - *

- * Most callers can and should ignore this class, though it is necessary if you are implementing - * Activity tracking pre-ICS. + * order for use by Stetho features. */ @NotThreadSafe public final class ActivityTracker { @@ -66,22 +60,14 @@ public void unregisterListener(Listener listener) { } /** - * Start automatic tracking if we are running on ICS+. - * - * @return Automatic tracking has been started. No need to manually invoke {@link #add} or - * {@link #remove} methods. + * Start automatic tracking. */ - public boolean beginTrackingIfPossible(Application application) { + public void beginTracking(Application application) { if (mAutomaticTracker == null) { - AutomaticTracker automaticTracker = - AutomaticTracker.newInstanceIfPossible(application, this /* tracker */); - if (automaticTracker != null) { - automaticTracker.register(); - mAutomaticTracker = automaticTracker; - return true; - } + AutomaticTracker automaticTracker = new AutomaticTracker(application, this /* tracker */); + automaticTracker.register(); + mAutomaticTracker = automaticTracker; } - return false; } public boolean endTracking() { @@ -146,76 +132,59 @@ public interface Listener { public void onActivityRemoved(Activity activity); } - private static abstract class AutomaticTracker { - @Nullable - public static AutomaticTracker newInstanceIfPossible( - Application application, - ActivityTracker tracker) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return new AutomaticTrackerICSAndBeyond(application, tracker); - } else { - return null; - } + private static class AutomaticTracker { + private final Application mApplication; + private final ActivityTracker mTracker; + + public AutomaticTracker(Application application, ActivityTracker tracker) { + mApplication = application; + mTracker = tracker; } - public abstract void register(); - public abstract void unregister(); + public void register() { + mApplication.registerActivityLifecycleCallbacks(mLifecycleCallbacks); + } - @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) - private static class AutomaticTrackerICSAndBeyond extends AutomaticTracker { - private final Application mApplication; - private final ActivityTracker mTracker; + public void unregister() { + mApplication.unregisterActivityLifecycleCallbacks(mLifecycleCallbacks); + } - public AutomaticTrackerICSAndBeyond(Application application, ActivityTracker tracker) { - mApplication = application; - mTracker = tracker; + private final Application.ActivityLifecycleCallbacks mLifecycleCallbacks = + new Application.ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(@Nonnull Activity activity, Bundle savedInstanceState) { + mTracker.add(activity); } - public void register() { - mApplication.registerActivityLifecycleCallbacks(mLifecycleCallbacks); - } + @Override + public void onActivityStarted(@Nonnull Activity activity) { - public void unregister() { - mApplication.unregisterActivityLifecycleCallbacks(mLifecycleCallbacks); } - private final Application.ActivityLifecycleCallbacks mLifecycleCallbacks = - new Application.ActivityLifecycleCallbacks() { - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - mTracker.add(activity); - } - - @Override - public void onActivityStarted(Activity activity) { - - } - - @Override - public void onActivityResumed(Activity activity) { + @Override + public void onActivityResumed(@Nonnull Activity activity) { - } + } - @Override - public void onActivityPaused(Activity activity) { + @Override + public void onActivityPaused(@Nonnull Activity activity) { - } + } - @Override - public void onActivityStopped(Activity activity) { + @Override + public void onActivityStopped(@Nonnull Activity activity) { - } + } - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + @Override + public void onActivitySaveInstanceState(@Nonnull Activity activity, @Nonnull Bundle outState) { - } + } - @Override - public void onActivityDestroyed(Activity activity) { - mTracker.remove(activity); - } - }; - } + @Override + public void onActivityDestroyed(@Nonnull Activity activity) { + mTracker.remove(activity); + } + }; } } diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AndroidDocumentConstants.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AndroidDocumentConstants.java deleted file mode 100644 index 04767157..00000000 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/AndroidDocumentConstants.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.stetho.inspector.elements.android; - -import android.os.Build; - -public interface AndroidDocumentConstants { - /** - * Minimum API version required to make effective use of AndroidDocumentProvider. This can be - * moved back significantly through manual APIs to discover {@link android.app.Activity} - * instances. - */ - int MIN_API_LEVEL = Build.VERSION_CODES.ICE_CREAM_SANDWICH; -} diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ViewDescriptor.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ViewDescriptor.java index a2de76e0..0f39dec2 100755 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ViewDescriptor.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ViewDescriptor.java @@ -13,7 +13,6 @@ import com.facebook.stetho.common.ExceptionUtil; import com.facebook.stetho.common.LogUtil; -import com.facebook.stetho.common.ReflectionUtil; import com.facebook.stetho.common.StringUtil; import com.facebook.stetho.common.android.ResourcesUtil; import com.facebook.stetho.inspector.elements.AbstractChainedDescriptor; @@ -23,9 +22,6 @@ import com.facebook.stetho.inspector.elements.StyleRuleNameAccumulator; import com.facebook.stetho.inspector.helper.IntegerFormatter; -import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; - import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -37,6 +33,9 @@ import java.util.Map; import java.util.regex.Pattern; +import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; + final class ViewDescriptor extends AbstractChainedDescriptor implements HighlightableDescriptor { private static final String ID_NAME = "id"; @@ -50,8 +49,14 @@ final class ViewDescriptor extends AbstractChainedDescriptor private static final boolean sHasSupportNodeInfo; static { - sHasSupportNodeInfo = ReflectionUtil.tryGetClassForName( - "android.support.v4.view.accessibility.AccessibilityNodeInfoCompat") != null; + boolean hasSupportNodeInfo = false; + try { + androidx.core.view.accessibility.AccessibilityNodeInfoCompat.class.getClass(); + hasSupportNodeInfo = true; + } catch (NoClassDefFoundError ignore) { + // AndroidX Fragment is not in classpath. + } + sHasSupportNodeInfo = hasSupportNodeInfo; } /** diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV16Impl.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV16Impl.java index 078c175f..951e8182 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV16Impl.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV16Impl.java @@ -8,7 +8,6 @@ package com.facebook.stetho.inspector.elements.android.window; import android.content.Context; -import android.support.annotation.NonNull; import android.view.View; import android.view.WindowManager; @@ -17,6 +16,8 @@ import java.util.Collections; import java.util.List; +import androidx.annotation.NonNull; + class WindowRootViewCompactV16Impl extends WindowRootViewCompat { private Context mContext; diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV18Impl.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV18Impl.java index ae2a830b..39e091f7 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV18Impl.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV18Impl.java @@ -7,7 +7,6 @@ package com.facebook.stetho.inspector.elements.android.window; -import android.support.annotation.NonNull; import android.view.View; import java.lang.reflect.Field; @@ -17,6 +16,8 @@ import java.util.Collections; import java.util.List; +import androidx.annotation.NonNull; + class WindowRootViewCompactV18Impl extends WindowRootViewCompat { private Field mViewsField; diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV19Impl.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV19Impl.java index 0b06aedd..ec1b1b4d 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV19Impl.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompactV19Impl.java @@ -7,7 +7,6 @@ package com.facebook.stetho.inspector.elements.android.window; -import android.support.annotation.NonNull; import android.view.View; import java.lang.reflect.Field; @@ -16,6 +15,8 @@ import java.util.Collections; import java.util.List; +import androidx.annotation.NonNull; + class WindowRootViewCompactV19Impl extends WindowRootViewCompat { private List mRootViews; diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompat.java b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompat.java index 0493e5ce..72edd500 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompat.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/elements/android/window/WindowRootViewCompat.java @@ -9,13 +9,14 @@ import android.content.Context; import android.os.Build; -import android.support.annotation.NonNull; import android.view.View; import com.facebook.stetho.common.Util; import java.util.List; +import androidx.annotation.NonNull; + /** * get the root view of all windows *

diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/helper/IntegerFormatter.java b/stetho/src/main/java/com/facebook/stetho/inspector/helper/IntegerFormatter.java index 60f39867..1c20ff78 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/helper/IntegerFormatter.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/helper/IntegerFormatter.java @@ -9,9 +9,10 @@ import android.annotation.TargetApi; import android.os.Build; -import android.support.annotation.Nullable; import android.view.ViewDebug; +import androidx.annotation.Nullable; + public class IntegerFormatter { private static IntegerFormatter cachedFormatter; diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/network/CountingOutputStream.java b/stetho/src/main/java/com/facebook/stetho/inspector/network/CountingOutputStream.java index 3266bf61..32abcde4 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/network/CountingOutputStream.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/network/CountingOutputStream.java @@ -11,6 +11,8 @@ import java.io.IOException; import java.io.OutputStream; +import androidx.annotation.NonNull; + class CountingOutputStream extends FilterOutputStream { private long mCount; @@ -29,12 +31,12 @@ public void write(int oneByte) throws IOException { } @Override - public void write(byte[] buffer) throws IOException { + public void write(@NonNull byte[] buffer) throws IOException { write(buffer, 0, buffer.length); } @Override - public void write(byte[] buffer, int offset, int length) throws IOException { + public void write(@NonNull byte[] buffer, int offset, int length) throws IOException { out.write(buffer, offset, length); mCount += length; } diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/network/DecompressionHelper.java b/stetho/src/main/java/com/facebook/stetho/inspector/network/DecompressionHelper.java index 45d0a1e4..83193a32 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/network/DecompressionHelper.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/network/DecompressionHelper.java @@ -10,12 +10,13 @@ import com.facebook.stetho.inspector.console.CLog; import com.facebook.stetho.inspector.protocol.module.Console; -import javax.annotation.Nullable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.InflaterOutputStream; +import javax.annotation.Nullable; + // @VisibleForTest public class DecompressionHelper { static final String GZIP_ENCODING = "gzip"; @@ -39,7 +40,7 @@ public static InputStream teeInputWithDecompression( decompressedCounter = new CountingOutputStream(decompressedOutput); if (gzipEncoding) { output = GunzippingOutputStream.create(decompressedCounter); - } else if (deflateEncoding) { + } else { output = new InflaterOutputStream(decompressedCounter); } } else { diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/network/ResponseHandlingInputStream.java b/stetho/src/main/java/com/facebook/stetho/inspector/network/ResponseHandlingInputStream.java index 1da3a291..7abb7880 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/network/ResponseHandlingInputStream.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/network/ResponseHandlingInputStream.java @@ -11,14 +11,15 @@ import com.facebook.stetho.inspector.helper.ChromePeerManager; import com.facebook.stetho.inspector.protocol.module.Console; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; + /** * {@link InputStream} that caches the data as the data is read, and writes them to the given * {@link OutputStream}. This also guarantees that we will attempt to reach EOF on the @@ -105,12 +106,12 @@ public int read() throws IOException { } @Override - public int read(byte[] b) throws IOException { + public int read(@Nonnull byte[] b) throws IOException { return this.read(b, 0, b.length); } @Override - public int read(byte[] b, int off, int len) throws IOException { + public int read(@Nonnull byte[] b, int off, int len) throws IOException { try { int result = checkEOF(in.read(b, off, len)); if (result != -1) { diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DOMStorage.java b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DOMStorage.java index 19845c25..246d6596 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DOMStorage.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DOMStorage.java @@ -7,10 +7,9 @@ package com.facebook.stetho.inspector.protocol.module; -import android.annotation.TargetApi; import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; + import com.facebook.stetho.inspector.console.CLog; import com.facebook.stetho.inspector.domstorage.DOMStoragePeerManager; import com.facebook.stetho.inspector.domstorage.SharedPreferencesHelper; @@ -21,6 +20,7 @@ import com.facebook.stetho.inspector.protocol.ChromeDevtoolsMethod; import com.facebook.stetho.json.ObjectMapper; import com.facebook.stetho.json.annotation.JsonProperty; + import org.json.JSONException; import org.json.JSONObject; @@ -160,17 +160,12 @@ private static void assignByType( } else if (value instanceof String) { editor.putString(key, (String)value); } else if (value instanceof Set) { - putStringSet(editor, key, (Set)value); + editor.putStringSet(key, (Set)value); } else { throw new IllegalArgumentException("Unsupported type=" + value.getClass().getName()); } } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - private static void putStringSet(SharedPreferences.Editor editor, String key, Set value) { - editor.putStringSet(key, value); - } - public static class StorageId { @JsonProperty(required = true) public String securityOrigin; diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java index 5c201f85..f4639ac9 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java @@ -7,17 +7,9 @@ package com.facebook.stetho.inspector.protocol.module; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import android.annotation.TargetApi; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteException; -import android.os.Build; import android.util.SparseArray; import com.facebook.stetho.common.LogUtil; @@ -36,10 +28,15 @@ import org.json.JSONObject; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; -@TargetApi(Build.VERSION_CODES.HONEYCOMB) public class Database implements ChromeDevtoolsDomain { /** * The protocol doesn't offer an efficient means of pagination or anything like that so diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DatabaseConstants.java b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DatabaseConstants.java deleted file mode 100644 index cd7ec869..00000000 --- a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/DatabaseConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.stetho.inspector.protocol.module; - -import android.os.Build; - -public interface DatabaseConstants { - - /** - * Minimum API version required to use the {@link Database}. - */ - public static final int MIN_API_LEVEL = Build.VERSION_CODES.HONEYCOMB; -} diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Page.java b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Page.java index 33516bc7..17aca407 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Page.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Page.java @@ -8,7 +8,7 @@ package com.facebook.stetho.inspector.protocol.module; import android.content.Context; -import android.support.annotation.Nullable; + import com.facebook.stetho.common.ProcessUtil; import com.facebook.stetho.inspector.domstorage.SharedPreferencesHelper; import com.facebook.stetho.inspector.jsonrpc.JsonRpcPeer; @@ -19,6 +19,7 @@ import com.facebook.stetho.json.ObjectMapper; import com.facebook.stetho.json.annotation.JsonProperty; import com.facebook.stetho.json.annotation.JsonValue; + import org.json.JSONObject; import java.util.ArrayList; @@ -26,6 +27,8 @@ import java.util.Iterator; import java.util.List; +import androidx.annotation.Nullable; + public class Page implements ChromeDevtoolsDomain { public static final String BANNER = // Note: not using Android resources so we can maintain .jar distribution for now. "_____/\\\\\\\\\\\\\\\\\\\\\\_______________________________________________/\\\\\\_______________________\n" + diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Runtime.java b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Runtime.java index 1d483354..a049d5e6 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Runtime.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Runtime.java @@ -170,7 +170,7 @@ public JsonRpcResult getProperties(JsonRpcPeer peer, JSONObject params) throws J private static String getPropertyClassName(Object o) { String name = o.getClass().getSimpleName(); - if (name == null || name.length() == 0) { + if (name.isEmpty()) { // Looks better for anonymous classes. name = o.getClass().getName(); } diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/runtime/RhinoDetectingRuntimeReplFactory.java b/stetho/src/main/java/com/facebook/stetho/inspector/runtime/RhinoDetectingRuntimeReplFactory.java index 1df21dba..98564048 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/runtime/RhinoDetectingRuntimeReplFactory.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/runtime/RhinoDetectingRuntimeReplFactory.java @@ -8,7 +8,7 @@ package com.facebook.stetho.inspector.runtime; import android.content.Context; -import android.support.annotation.Nullable; + import com.facebook.stetho.common.LogUtil; import com.facebook.stetho.inspector.console.RuntimeRepl; import com.facebook.stetho.inspector.console.RuntimeReplFactory; @@ -16,6 +16,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import androidx.annotation.Nullable; + /** * Attempts to locate stetho-js-rhino in the classpath and use it if available. Otherwise falls * back to a no-op version which informs folks that they can include stetho-js-rhino for more diff --git a/stetho/src/main/java/com/facebook/stetho/server/CompositeInputStream.java b/stetho/src/main/java/com/facebook/stetho/server/CompositeInputStream.java index 79a1e413..bf96a5a2 100644 --- a/stetho/src/main/java/com/facebook/stetho/server/CompositeInputStream.java +++ b/stetho/src/main/java/com/facebook/stetho/server/CompositeInputStream.java @@ -7,12 +7,13 @@ package com.facebook.stetho.server; -import javax.annotation.concurrent.NotThreadSafe; +import com.facebook.stetho.common.LogUtil; import java.io.IOException; import java.io.InputStream; -import com.facebook.stetho.common.LogUtil; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.NotThreadSafe; @NotThreadSafe public class CompositeInputStream extends InputStream { @@ -70,12 +71,12 @@ public void reset() throws IOException { } @Override - public int read(byte[] buffer) throws IOException { + public int read(@Nonnull byte[] buffer) throws IOException { return read(buffer, 0, buffer.length); } @Override - public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { + public int read(@Nonnull byte[] buffer, int byteOffset, int byteCount) throws IOException { int n; while ((n = mStreams[mCurrentIndex].read(buffer, byteOffset, byteCount)) == -1) { if (!tryMoveToNextStream()) { diff --git a/stetho/src/main/java/com/facebook/stetho/server/http/HandlerRegistry.java b/stetho/src/main/java/com/facebook/stetho/server/http/HandlerRegistry.java index 484921af..24976b9c 100644 --- a/stetho/src/main/java/com/facebook/stetho/server/http/HandlerRegistry.java +++ b/stetho/src/main/java/com/facebook/stetho/server/http/HandlerRegistry.java @@ -7,10 +7,10 @@ package com.facebook.stetho.server.http; -import android.support.annotation.Nullable; - import java.util.ArrayList; +import androidx.annotation.Nullable; + public class HandlerRegistry { private final ArrayList mPathMatchers = new ArrayList<>(); private final ArrayList mHttpHandlers = new ArrayList<>(); diff --git a/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpMessage.java b/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpMessage.java index f359d89a..47450075 100644 --- a/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpMessage.java +++ b/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpMessage.java @@ -7,10 +7,10 @@ package com.facebook.stetho.server.http; -import android.support.annotation.Nullable; - import java.util.ArrayList; +import androidx.annotation.Nullable; + public class LightHttpMessage { public final ArrayList headerNames = new ArrayList<>(); public final ArrayList headerValues = new ArrayList<>(); diff --git a/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpServer.java b/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpServer.java index be02e0e2..06d91f9b 100644 --- a/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpServer.java +++ b/stetho/src/main/java/com/facebook/stetho/server/http/LightHttpServer.java @@ -7,9 +7,8 @@ package com.facebook.stetho.server.http; -import android.net.LocalSocket; import android.net.Uri; -import android.support.annotation.Nullable; + import com.facebook.stetho.server.LeakyBufferedInputStream; import com.facebook.stetho.server.SocketLike; @@ -22,6 +21,8 @@ import java.io.PrintWriter; import java.io.StringWriter; +import androidx.annotation.Nullable; + /** * Somewhat crude but very fast HTTP server designed exclusively to handle the * Chrome DevTools protocol, though sufficiently general to do other very basic things.