Loading packages/SystemUI/checks/Android.bp +4 −0 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,10 @@ java_test_host { "tests/**/*.kt", "tests/**/*.kt", "tests/**/*.java", "tests/**/*.java", ], ], data: [ ":framework", ":androidx.annotation_annotation", ], static_libs: [ static_libs: [ "SystemUILintChecker", "SystemUILintChecker", "junit", "junit", Loading packages/SystemUI/checks/src/com/android/internal/systemui/lint/SoftwareBitmapDetector.kt +3 −3 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,8 @@ import org.jetbrains.uast.UReferenceExpression class SoftwareBitmapDetector : Detector(), SourceCodeScanner { class SoftwareBitmapDetector : Detector(), SourceCodeScanner { override fun getApplicableReferenceNames(): List<String> { override fun getApplicableReferenceNames(): List<String> { return mutableListOf("ALPHA_8", "RGB_565", "ARGB_8888", "RGBA_F16", "RGBA_1010102") return mutableListOf( "ALPHA_8", "RGB_565", "ARGB_4444", "ARGB_8888", "RGBA_F16", "RGBA_1010102") } } override fun visitReference( override fun visitReference( Loading @@ -40,13 +41,12 @@ class SoftwareBitmapDetector : Detector(), SourceCodeScanner { reference: UReferenceExpression, reference: UReferenceExpression, referenced: PsiElement referenced: PsiElement ) { ) { val evaluator = context.evaluator val evaluator = context.evaluator if (evaluator.isMemberInClass(referenced as? PsiField, "android.graphics.Bitmap.Config")) { if (evaluator.isMemberInClass(referenced as? PsiField, "android.graphics.Bitmap.Config")) { context.report( context.report( ISSUE, ISSUE, referenced, referenced, context.getNameLocation(referenced), context.getNameLocation(reference), "Replace software bitmap with `Config.HARDWARE`" "Replace software bitmap with `Config.HARDWARE`" ) ) } } Loading packages/SystemUI/checks/tests/com/android/internal/systemui/lint/AndroidStubs.kt +4 −210 Original line number Original line Diff line number Diff line Loading @@ -18,185 +18,22 @@ package com.android.internal.systemui.lint import com.android.annotations.NonNull import com.android.annotations.NonNull import com.android.tools.lint.checks.infrastructure.LintDetectorTest.java import com.android.tools.lint.checks.infrastructure.LintDetectorTest.java import com.android.tools.lint.checks.infrastructure.TestFiles.LibraryReferenceTestFile import java.io.File import org.intellij.lang.annotations.Language import org.intellij.lang.annotations.Language @Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage") @NonNull @NonNull private fun indentedJava(@NonNull @Language("JAVA") source: String) = java(source).indented() private fun indentedJava(@NonNull @Language("JAVA") source: String) = java(source).indented() internal val commonSettingsCode = """ public static float getFloat(ContentResolver cr, String name) { return 0.0f; } public static long getLong(ContentResolver cr, String name) { return 0L; } public static int getInt(ContentResolver cr, String name) { return 0; } public static String getString(ContentResolver cr, String name) { return ""; } public static float getFloat(ContentResolver cr, String name, float def) { return 0.0f; } public static long getLong(ContentResolver cr, String name, long def) { return 0L; } public static int getInt(ContentResolver cr, String name, int def) { return 0; } public static String getString(ContentResolver cr, String name, String def) { return ""; } public static boolean putFloat(ContentResolver cr, String name, float value) { return true; } public static boolean putLong(ContentResolver cr, String name, long value) { return true; } public static boolean putInt(ContentResolver cr, String name, int value) { return true; } public static boolean putFloat(ContentResolver cr, String name) { return true; } public static boolean putString(ContentResolver cr, String name, String value) { return true; } """ /* /* * This file contains stubs of framework APIs and System UI classes for testing purposes only. The * This file contains stubs of framework APIs and System UI classes for testing purposes only. The * stubs are not used in the lint detectors themselves. * stubs are not used in the lint detectors themselves. */ */ internal val androidStubs = internal val androidStubs = arrayOf( arrayOf( indentedJava( LibraryReferenceTestFile(File("framework.jar").canonicalFile), """ LibraryReferenceTestFile(File("androidx.annotation_annotation.jar").canonicalFile), package android.app; public class ActivityManager { public static int getCurrentUser() {} } """ ), indentedJava( """ package android.accounts; public class AccountManager { public static AccountManager get(Context context) { return null; } } """ ), indentedJava( """ package android.os; import android.content.pm.UserInfo; import android.annotation.UserIdInt; public class UserManager { public UserInfo getUserInfo(@UserIdInt int userId) {} } """ ), indentedJava(""" package android.annotation; public @interface UserIdInt {} """), indentedJava(""" package android.content.pm; public class UserInfo {} """), indentedJava(""" package android.os; public class Looper {} """), indentedJava(""" package android.os; public class Handler {} """), indentedJava(""" package android.content; public class ServiceConnection {} """), indentedJava(""" package android.os; public enum UserHandle { ALL } """), indentedJava( """ package android.content; import android.os.UserHandle; import android.os.Handler; import android.os.Looper; import java.util.concurrent.Executor; public class Context { public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {} public void registerReceiverAsUser( BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler) {} public void registerReceiverForAllUsers( BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) {} public void sendBroadcast(Intent intent) {} public void sendBroadcast(Intent intent, String receiverPermission) {} public void sendBroadcastAsUser(Intent intent, UserHandle userHandle, String permission) {} public void bindService(Intent intent) {} public void bindServiceAsUser( Intent intent, ServiceConnection connection, int flags, UserHandle userHandle) {} public void unbindService(ServiceConnection connection) {} public Looper getMainLooper() { return null; } public Executor getMainExecutor() { return null; } public Handler getMainThreadHandler() { return null; } public final @Nullable <T> T getSystemService(@NonNull Class<T> serviceClass) { return null; } public abstract @Nullable Object getSystemService(@ServiceName @NonNull String name); } """ ), indentedJava( """ package android.app; import android.content.Context; public class Activity extends Context {} """ ), indentedJava( """ package android.graphics; public class Bitmap { public enum Config { ARGB_8888, RGB_565, HARDWARE } public static Bitmap createBitmap(int width, int height, Config config) { return null; } } """ ), indentedJava(""" package android.content; public class BroadcastReceiver {} """), indentedJava(""" package android.content; public class IntentFilter {} """), indentedJava( indentedJava( """ """ package com.android.systemui.settings; package com.android.systemui.settings; Loading @@ -206,49 +43,6 @@ public interface UserTracker { int getUserId(); int getUserId(); UserInfo getUserInfo(); UserInfo getUserInfo(); } } """ ), indentedJava( """ package androidx.annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.SOURCE; @Retention(SOURCE) @Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) public @interface WorkerThread { } """ ), indentedJava( """ package android.provider; public class Settings { public static final class Global { public static final String UNLOCK_SOUND = "unlock_sound"; """ + commonSettingsCode + """ } public static final class Secure { """ + commonSettingsCode + """ } public static final class System { """ + commonSettingsCode + """ } } """ """ ), ), ) ) packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SoftwareBitmapDetectorTest.kt +8 −9 Original line number Original line Diff line number Diff line Loading @@ -51,12 +51,12 @@ class SoftwareBitmapDetectorTest : SystemUILintDetectorTest() { .run() .run() .expect( .expect( """ """ src/android/graphics/Bitmap.java:5: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] src/TestClass.java:5: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] ARGB_8888, Bitmap.createBitmap(300, 300, Bitmap.Config.RGB_565); ~~~~~~~~~ src/android/graphics/Bitmap.java:6: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] RGB_565, ~~~~~~~ ~~~~~~~ src/TestClass.java:6: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888); ~~~~~~~~~ 0 errors, 2 warnings 0 errors, 2 warnings """ """ ) ) Loading @@ -76,8 +76,7 @@ class SoftwareBitmapDetectorTest : SystemUILintDetectorTest() { } } } } """ """ ) ), .indented(), *stubs *stubs ) ) .issues(SoftwareBitmapDetector.ISSUE) .issues(SoftwareBitmapDetector.ISSUE) Loading packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SystemUILintDetectorTest.kt +33 −0 Original line number Original line Diff line number Diff line Loading @@ -3,9 +3,42 @@ package com.android.internal.systemui.lint import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.TestLintTask import com.android.tools.lint.checks.infrastructure.TestLintTask import java.io.File import java.io.File import org.junit.ClassRule import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.junit.runners.model.Statement @Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage") @RunWith(JUnit4::class) abstract class SystemUILintDetectorTest : LintDetectorTest() { abstract class SystemUILintDetectorTest : LintDetectorTest() { companion object { @ClassRule @JvmField val libraryChecker: LibraryExists = LibraryExists("framework.jar", "androidx.annotation_annotation.jar") } class LibraryExists(vararg val libraryNames: String) : TestRule { override fun apply(base: Statement, description: Description): Statement { return object : Statement() { override fun evaluate() { for (libName in libraryNames) { val libFile = File(libName) if (!libFile.canonicalFile.exists()) { throw Exception( "Could not find $libName in the test's working directory. " + "File ${libFile.absolutePath} does not exist." ) } } base.evaluate() } } } } /** /** * Customize the lint task to disable SDK usage completely. This ensures that running the tests * Customize the lint task to disable SDK usage completely. This ensures that running the tests * in Android Studio has the same result as running the tests in atest * in Android Studio has the same result as running the tests in atest Loading Loading
packages/SystemUI/checks/Android.bp +4 −0 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,10 @@ java_test_host { "tests/**/*.kt", "tests/**/*.kt", "tests/**/*.java", "tests/**/*.java", ], ], data: [ ":framework", ":androidx.annotation_annotation", ], static_libs: [ static_libs: [ "SystemUILintChecker", "SystemUILintChecker", "junit", "junit", Loading
packages/SystemUI/checks/src/com/android/internal/systemui/lint/SoftwareBitmapDetector.kt +3 −3 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,8 @@ import org.jetbrains.uast.UReferenceExpression class SoftwareBitmapDetector : Detector(), SourceCodeScanner { class SoftwareBitmapDetector : Detector(), SourceCodeScanner { override fun getApplicableReferenceNames(): List<String> { override fun getApplicableReferenceNames(): List<String> { return mutableListOf("ALPHA_8", "RGB_565", "ARGB_8888", "RGBA_F16", "RGBA_1010102") return mutableListOf( "ALPHA_8", "RGB_565", "ARGB_4444", "ARGB_8888", "RGBA_F16", "RGBA_1010102") } } override fun visitReference( override fun visitReference( Loading @@ -40,13 +41,12 @@ class SoftwareBitmapDetector : Detector(), SourceCodeScanner { reference: UReferenceExpression, reference: UReferenceExpression, referenced: PsiElement referenced: PsiElement ) { ) { val evaluator = context.evaluator val evaluator = context.evaluator if (evaluator.isMemberInClass(referenced as? PsiField, "android.graphics.Bitmap.Config")) { if (evaluator.isMemberInClass(referenced as? PsiField, "android.graphics.Bitmap.Config")) { context.report( context.report( ISSUE, ISSUE, referenced, referenced, context.getNameLocation(referenced), context.getNameLocation(reference), "Replace software bitmap with `Config.HARDWARE`" "Replace software bitmap with `Config.HARDWARE`" ) ) } } Loading
packages/SystemUI/checks/tests/com/android/internal/systemui/lint/AndroidStubs.kt +4 −210 Original line number Original line Diff line number Diff line Loading @@ -18,185 +18,22 @@ package com.android.internal.systemui.lint import com.android.annotations.NonNull import com.android.annotations.NonNull import com.android.tools.lint.checks.infrastructure.LintDetectorTest.java import com.android.tools.lint.checks.infrastructure.LintDetectorTest.java import com.android.tools.lint.checks.infrastructure.TestFiles.LibraryReferenceTestFile import java.io.File import org.intellij.lang.annotations.Language import org.intellij.lang.annotations.Language @Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage") @NonNull @NonNull private fun indentedJava(@NonNull @Language("JAVA") source: String) = java(source).indented() private fun indentedJava(@NonNull @Language("JAVA") source: String) = java(source).indented() internal val commonSettingsCode = """ public static float getFloat(ContentResolver cr, String name) { return 0.0f; } public static long getLong(ContentResolver cr, String name) { return 0L; } public static int getInt(ContentResolver cr, String name) { return 0; } public static String getString(ContentResolver cr, String name) { return ""; } public static float getFloat(ContentResolver cr, String name, float def) { return 0.0f; } public static long getLong(ContentResolver cr, String name, long def) { return 0L; } public static int getInt(ContentResolver cr, String name, int def) { return 0; } public static String getString(ContentResolver cr, String name, String def) { return ""; } public static boolean putFloat(ContentResolver cr, String name, float value) { return true; } public static boolean putLong(ContentResolver cr, String name, long value) { return true; } public static boolean putInt(ContentResolver cr, String name, int value) { return true; } public static boolean putFloat(ContentResolver cr, String name) { return true; } public static boolean putString(ContentResolver cr, String name, String value) { return true; } """ /* /* * This file contains stubs of framework APIs and System UI classes for testing purposes only. The * This file contains stubs of framework APIs and System UI classes for testing purposes only. The * stubs are not used in the lint detectors themselves. * stubs are not used in the lint detectors themselves. */ */ internal val androidStubs = internal val androidStubs = arrayOf( arrayOf( indentedJava( LibraryReferenceTestFile(File("framework.jar").canonicalFile), """ LibraryReferenceTestFile(File("androidx.annotation_annotation.jar").canonicalFile), package android.app; public class ActivityManager { public static int getCurrentUser() {} } """ ), indentedJava( """ package android.accounts; public class AccountManager { public static AccountManager get(Context context) { return null; } } """ ), indentedJava( """ package android.os; import android.content.pm.UserInfo; import android.annotation.UserIdInt; public class UserManager { public UserInfo getUserInfo(@UserIdInt int userId) {} } """ ), indentedJava(""" package android.annotation; public @interface UserIdInt {} """), indentedJava(""" package android.content.pm; public class UserInfo {} """), indentedJava(""" package android.os; public class Looper {} """), indentedJava(""" package android.os; public class Handler {} """), indentedJava(""" package android.content; public class ServiceConnection {} """), indentedJava(""" package android.os; public enum UserHandle { ALL } """), indentedJava( """ package android.content; import android.os.UserHandle; import android.os.Handler; import android.os.Looper; import java.util.concurrent.Executor; public class Context { public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {} public void registerReceiverAsUser( BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler) {} public void registerReceiverForAllUsers( BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) {} public void sendBroadcast(Intent intent) {} public void sendBroadcast(Intent intent, String receiverPermission) {} public void sendBroadcastAsUser(Intent intent, UserHandle userHandle, String permission) {} public void bindService(Intent intent) {} public void bindServiceAsUser( Intent intent, ServiceConnection connection, int flags, UserHandle userHandle) {} public void unbindService(ServiceConnection connection) {} public Looper getMainLooper() { return null; } public Executor getMainExecutor() { return null; } public Handler getMainThreadHandler() { return null; } public final @Nullable <T> T getSystemService(@NonNull Class<T> serviceClass) { return null; } public abstract @Nullable Object getSystemService(@ServiceName @NonNull String name); } """ ), indentedJava( """ package android.app; import android.content.Context; public class Activity extends Context {} """ ), indentedJava( """ package android.graphics; public class Bitmap { public enum Config { ARGB_8888, RGB_565, HARDWARE } public static Bitmap createBitmap(int width, int height, Config config) { return null; } } """ ), indentedJava(""" package android.content; public class BroadcastReceiver {} """), indentedJava(""" package android.content; public class IntentFilter {} """), indentedJava( indentedJava( """ """ package com.android.systemui.settings; package com.android.systemui.settings; Loading @@ -206,49 +43,6 @@ public interface UserTracker { int getUserId(); int getUserId(); UserInfo getUserInfo(); UserInfo getUserInfo(); } } """ ), indentedJava( """ package androidx.annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.SOURCE; @Retention(SOURCE) @Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) public @interface WorkerThread { } """ ), indentedJava( """ package android.provider; public class Settings { public static final class Global { public static final String UNLOCK_SOUND = "unlock_sound"; """ + commonSettingsCode + """ } public static final class Secure { """ + commonSettingsCode + """ } public static final class System { """ + commonSettingsCode + """ } } """ """ ), ), ) )
packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SoftwareBitmapDetectorTest.kt +8 −9 Original line number Original line Diff line number Diff line Loading @@ -51,12 +51,12 @@ class SoftwareBitmapDetectorTest : SystemUILintDetectorTest() { .run() .run() .expect( .expect( """ """ src/android/graphics/Bitmap.java:5: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] src/TestClass.java:5: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] ARGB_8888, Bitmap.createBitmap(300, 300, Bitmap.Config.RGB_565); ~~~~~~~~~ src/android/graphics/Bitmap.java:6: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] RGB_565, ~~~~~~~ ~~~~~~~ src/TestClass.java:6: Warning: Replace software bitmap with Config.HARDWARE [SoftwareBitmap] Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888); ~~~~~~~~~ 0 errors, 2 warnings 0 errors, 2 warnings """ """ ) ) Loading @@ -76,8 +76,7 @@ class SoftwareBitmapDetectorTest : SystemUILintDetectorTest() { } } } } """ """ ) ), .indented(), *stubs *stubs ) ) .issues(SoftwareBitmapDetector.ISSUE) .issues(SoftwareBitmapDetector.ISSUE) Loading
packages/SystemUI/checks/tests/com/android/internal/systemui/lint/SystemUILintDetectorTest.kt +33 −0 Original line number Original line Diff line number Diff line Loading @@ -3,9 +3,42 @@ package com.android.internal.systemui.lint import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.LintDetectorTest import com.android.tools.lint.checks.infrastructure.TestLintTask import com.android.tools.lint.checks.infrastructure.TestLintTask import java.io.File import java.io.File import org.junit.ClassRule import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.junit.runners.model.Statement @Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage") @RunWith(JUnit4::class) abstract class SystemUILintDetectorTest : LintDetectorTest() { abstract class SystemUILintDetectorTest : LintDetectorTest() { companion object { @ClassRule @JvmField val libraryChecker: LibraryExists = LibraryExists("framework.jar", "androidx.annotation_annotation.jar") } class LibraryExists(vararg val libraryNames: String) : TestRule { override fun apply(base: Statement, description: Description): Statement { return object : Statement() { override fun evaluate() { for (libName in libraryNames) { val libFile = File(libName) if (!libFile.canonicalFile.exists()) { throw Exception( "Could not find $libName in the test's working directory. " + "File ${libFile.absolutePath} does not exist." ) } } base.evaluate() } } } } /** /** * Customize the lint task to disable SDK usage completely. This ensures that running the tests * Customize the lint task to disable SDK usage completely. This ensures that running the tests * in Android Studio has the same result as running the tests in atest * in Android Studio has the same result as running the tests in atest Loading