/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tools.klint.checks;
import com.android.annotations.NonNull;
import com.android.annotations.VisibleForTesting;
import com.android.tools.klint.client.api.IssueRegistry;
import com.android.tools.klint.detector.api.Issue;
import com.android.tools.klint.detector.api.Scope;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
/** Registry which provides a list of checks to be performed on an Android project */
public class BuiltinIssueRegistry extends IssueRegistry {
private static final List<Issue> sIssues;
static final int INITIAL_CAPACITY = 262;
static {
List<Issue> issues = new ArrayList<Issue>(INITIAL_CAPACITY);
issues.add(AddJavascriptInterfaceDetector.ISSUE);
issues.add(AlarmDetector.ISSUE);
issues.add(AllowAllHostnameVerifierDetector.ISSUE);
issues.add(AlwaysShowActionDetector.ISSUE);
issues.add(AndroidAutoDetector.INVALID_USES_TAG_ISSUE);
issues.add(AndroidAutoDetector.MISSING_INTENT_FILTER_FOR_MEDIA_SEARCH);
issues.add(AndroidAutoDetector.MISSING_MEDIA_BROWSER_SERVICE_ACTION_ISSUE);
issues.add(AndroidAutoDetector.MISSING_ON_PLAY_FROM_SEARCH);
issues.add(AnnotationDetector.ANNOTATION_USAGE);
issues.add(AnnotationDetector.FLAG_STYLE);
issues.add(AnnotationDetector.INSIDE_METHOD);
issues.add(AnnotationDetector.SWITCH_TYPE_DEF);
issues.add(AnnotationDetector.UNIQUE);
issues.add(ApiDetector.INLINED);
issues.add(ApiDetector.OVERRIDE);
issues.add(ApiDetector.UNSUPPORTED);
issues.add(ApiDetector.UNUSED);
issues.add(AppCompatCallDetector.ISSUE);
issues.add(AppIndexingApiDetector.ISSUE_APP_INDEXING_API);
issues.add(AppIndexingApiDetector.ISSUE_URL_ERROR);
issues.add(AppIndexingApiDetector.ISSUE_APP_INDEXING);
issues.add(BadHostnameVerifierDetector.ISSUE);
issues.add(BatteryDetector.ISSUE);
issues.add(CallSuperDetector.ISSUE);
issues.add(CipherGetInstanceDetector.ISSUE);
issues.add(CleanupDetector.COMMIT_FRAGMENT);
issues.add(CleanupDetector.RECYCLE_RESOURCE);
issues.add(CleanupDetector.SHARED_PREF);
issues.add(CommentDetector.EASTER_EGG);
issues.add(CommentDetector.STOP_SHIP);
issues.add(CustomViewDetector.ISSUE);
issues.add(CutPasteDetector.ISSUE);
issues.add(DateFormatDetector.DATE_FORMAT);
issues.add(SetTextDetector.SET_TEXT_I18N);
issues.add(UnsafeNativeCodeDetector.LOAD);
issues.add(UnsafeNativeCodeDetector.UNSAFE_NATIVE_CODE_LOCATION);
issues.add(FragmentDetector.ISSUE);
issues.add(GetSignaturesDetector.ISSUE);
issues.add(HandlerDetector.ISSUE);
issues.add(IconDetector.DUPLICATES_CONFIGURATIONS);
issues.add(IconDetector.DUPLICATES_NAMES);
issues.add(IconDetector.GIF_USAGE);
issues.add(IconDetector.ICON_COLORS);
issues.add(IconDetector.ICON_DENSITIES);
issues.add(IconDetector.ICON_DIP_SIZE);
issues.add(IconDetector.ICON_EXPECTED_SIZE);
issues.add(IconDetector.ICON_EXTENSION);
issues.add(IconDetector.ICON_LAUNCHER_SHAPE);
issues.add(IconDetector.ICON_LOCATION);
issues.add(IconDetector.ICON_MISSING_FOLDER);
issues.add(IconDetector.ICON_MIX_9PNG);
issues.add(IconDetector.ICON_NODPI);
issues.add(IconDetector.ICON_XML_AND_PNG);
issues.add(TrustAllX509TrustManagerDetector.ISSUE);
issues.add(JavaPerformanceDetector.PAINT_ALLOC);
issues.add(JavaPerformanceDetector.USE_SPARSE_ARRAY);
issues.add(JavaPerformanceDetector.USE_VALUE_OF);
issues.add(JavaScriptInterfaceDetector.ISSUE);
issues.add(LayoutConsistencyDetector.INCONSISTENT_IDS);
issues.add(LayoutInflationDetector.ISSUE);
issues.add(LeakDetector.ISSUE);
issues.add(LocaleDetector.STRING_LOCALE);
issues.add(LogDetector.CONDITIONAL);
issues.add(LogDetector.LONG_TAG);
issues.add(LogDetector.WRONG_TAG);
issues.add(MathDetector.ISSUE);
issues.add(MergeRootFrameLayoutDetector.ISSUE);
issues.add(NonInternationalizedSmsDetector.ISSUE);
issues.add(OverdrawDetector.ISSUE);
issues.add(OverrideConcreteDetector.ISSUE);
issues.add(ParcelDetector.ISSUE);
issues.add(PreferenceActivityDetector.ISSUE);
issues.add(PrivateResourceDetector.ISSUE);
issues.add(ReadParcelableDetector.ISSUE);
issues.add(RecyclerViewDetector.DATA_BINDER);
issues.add(RecyclerViewDetector.FIXED_POSITION);
issues.add(RegistrationDetector.ISSUE);
issues.add(RequiredAttributeDetector.ISSUE);
issues.add(RtlDetector.COMPAT);
issues.add(RtlDetector.ENABLED);
issues.add(RtlDetector.SYMMETRY);
issues.add(RtlDetector.USE_START);
issues.add(SdCardDetector.ISSUE);
issues.add(SecureRandomDetector.ISSUE);
issues.add(SecurityDetector.EXPORTED_PROVIDER);
issues.add(SecurityDetector.EXPORTED_RECEIVER);
issues.add(SecurityDetector.EXPORTED_SERVICE);
issues.add(SecurityDetector.SET_READABLE);
issues.add(SecurityDetector.SET_WRITABLE);
issues.add(SecurityDetector.OPEN_PROVIDER);
issues.add(SecurityDetector.WORLD_READABLE);
issues.add(SecurityDetector.WORLD_WRITEABLE);
issues.add(ServiceCastDetector.ISSUE);
issues.add(SetJavaScriptEnabledDetector.ISSUE);
issues.add(SQLiteDetector.ISSUE);
issues.add(SslCertificateSocketFactoryDetector.CREATE_SOCKET);
issues.add(SslCertificateSocketFactoryDetector.GET_INSECURE);
issues.add(StringAuthLeakDetector.AUTH_LEAK);
issues.add(StringFormatDetector.ARG_COUNT);
issues.add(StringFormatDetector.ARG_TYPES);
issues.add(StringFormatDetector.INVALID);
issues.add(StringFormatDetector.POTENTIAL_PLURAL);
issues.add(SupportAnnotationDetector.CHECK_PERMISSION);
issues.add(SupportAnnotationDetector.CHECK_RESULT);
issues.add(SupportAnnotationDetector.COLOR_USAGE);
issues.add(SupportAnnotationDetector.MISSING_PERMISSION);
issues.add(SupportAnnotationDetector.RANGE);
issues.add(SupportAnnotationDetector.RESOURCE_TYPE);
issues.add(SupportAnnotationDetector.THREAD);
issues.add(SupportAnnotationDetector.TYPE_DEF);
issues.add(ToastDetector.ISSUE);
issues.add(UnsafeBroadcastReceiverDetector.ACTION_STRING);
issues.add(UnsafeBroadcastReceiverDetector.BROADCAST_SMS);
issues.add(ViewConstructorDetector.ISSUE);
issues.add(ViewHolderDetector.ISSUE);
issues.add(ViewTagDetector.ISSUE);
issues.add(ViewTypeDetector.ISSUE);
issues.add(WrongCallDetector.ISSUE);
issues.add(WrongImportDetector.ISSUE);
sIssues = Collections.unmodifiableList(issues);
}
/**
* Constructs a new {@link BuiltinIssueRegistry}
*/
public BuiltinIssueRegistry() {
}
@NonNull
@Override
public List<Issue> getIssues() {
return sIssues;
}
@Override
protected int getIssueCapacity(@NonNull EnumSet<Scope> scope) {
if (scope.equals(Scope.ALL)) {
return getIssues().size();
} else {
int initialSize = 12;
if (scope.contains(Scope.RESOURCE_FILE)) {
initialSize += 80;
} else if (scope.contains(Scope.ALL_RESOURCE_FILES)) {
initialSize += 12;
}
if (scope.contains(Scope.JAVA_FILE)) {
initialSize += 74;
} else if (scope.contains(Scope.CLASS_FILE)) {
initialSize += 15;
} else if (scope.contains(Scope.MANIFEST)) {
initialSize += 38;
} else if (scope.contains(Scope.GRADLE_FILE)) {
initialSize += 5;
}
return initialSize;
}
}
/**
* Reset the registry such that it recomputes its available issues.
* <p>
* NOTE: This is only intended for testing purposes.
*/
@VisibleForTesting
public static void reset() {
IssueRegistry.reset();
}
}