blob: be4b2dbf0d8904468af52c739d463ff91c5345fb [file] [log] [blame]
/*
* 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.lint.checks;
import com.android.annotations.NonNull;
import com.android.tools.lint.client.api.IssueRegistry;
import com.android.tools.lint.client.api.LintClient;
import com.android.tools.lint.detector.api.ApiKt;
import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.Scope;
import com.google.common.annotations.VisibleForTesting;
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;
public static final int INITIAL_CAPACITY = 360;
static {
List<Issue> issues = new ArrayList<>(INITIAL_CAPACITY);
issues.add(AccessibilityDetector.ISSUE);
issues.add(ActionsXmlDetector.ISSUE);
issues.add(AddJavascriptInterfaceDetector.ISSUE);
issues.add(AlarmDetector.ISSUE);
issues.add(AllCapsDetector.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(AndroidTvDetector.IMPLIED_TOUCHSCREEN_HARDWARE);
issues.add(AndroidTvDetector.MISSING_BANNER);
issues.add(AndroidTvDetector.MISSING_LEANBACK_LAUNCHER);
issues.add(AndroidTvDetector.MISSING_LEANBACK_SUPPORT);
issues.add(AndroidTvDetector.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE);
issues.add(AndroidTvDetector.UNSUPPORTED_TV_HARDWARE);
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.OBSOLETE_SDK);
issues.add(ApiDetector.OVERRIDE);
issues.add(ApiDetector.UNSUPPORTED);
issues.add(ApiDetector.UNUSED);
issues.add(AppCompatCallDetector.ISSUE);
issues.add(AppCompatCustomViewDetector.ISSUE);
issues.add(AppCompatResourceDetector.ISSUE);
issues.add(AppIndexingApiDetector.ISSUE_APP_INDEXING);
issues.add(AppIndexingApiDetector.ISSUE_APP_INDEXING_API);
issues.add(AppLinksAutoVerifyDetector.ISSUE_ERROR);
issues.add(AppLinksAutoVerifyDetector.ISSUE_WARNING);
issues.add(AppLinksValidDetector.TEST_URL);
issues.add(AppLinksValidDetector.VALIDATION);
issues.add(ArraySizeDetector.INCONSISTENT);
issues.add(AssertDetector.ISSUE);
issues.add(AutofillDetector.ISSUE);
issues.add(BadHostnameVerifierDetector.ISSUE);
issues.add(BatteryDetector.ISSUE);
issues.add(BottomAppBarDetector.ISSUE);
issues.add(ButtonDetector.BACK_BUTTON);
issues.add(ButtonDetector.CASE);
issues.add(ButtonDetector.ORDER);
issues.add(ButtonDetector.STYLE);
issues.add(ByteOrderMarkDetector.BOM);
issues.add(CallSuperDetector.ISSUE);
issues.add(C2dmDetector.ISSUE);
issues.add(CanvasSizeDetector.ISSUE);
issues.add(CheckResultDetector.CHECK_RESULT);
issues.add(ChildCountDetector.ADAPTER_VIEW_ISSUE);
issues.add(ChildCountDetector.SCROLLVIEW_ISSUE);
issues.add(ChromeOsDetector.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE);
issues.add(ChromeOsDetector.UNSUPPORTED_CHROME_OS_HARDWARE);
issues.add(CipherGetInstanceDetector.ISSUE);
issues.add(CipherGetInstanceDetector.DEPRECATED_PROVIDER);
issues.add(CleanupDetector.APPLY_SHARED_PREF);
issues.add(CleanupDetector.COMMIT_FRAGMENT);
issues.add(CleanupDetector.RECYCLE_RESOURCE);
issues.add(CleanupDetector.SHARED_PREF);
issues.add(ClickableViewAccessibilityDetector.ISSUE);
issues.add(CommentDetector.EASTER_EGG);
issues.add(CommentDetector.STOP_SHIP);
issues.add(ConstraintLayoutDetector.ISSUE);
issues.add(CordovaVersionDetector.ISSUE);
issues.add(CustomViewDetector.ISSUE);
issues.add(CutPasteDetector.ISSUE);
issues.add(DateFormatDetector.DATE_FORMAT);
issues.add(DeletedProviderDetector.ISSUE);
issues.add(DeprecationDetector.ISSUE);
issues.add(DetectMissingPrefix.MISSING_NAMESPACE);
issues.add(DiffUtilDetector.ISSUE);
issues.add(DosLineEndingDetector.ISSUE);
issues.add(DuplicateIdDetector.CROSS_LAYOUT);
issues.add(DuplicateIdDetector.WITHIN_LAYOUT);
issues.add(DuplicateResourceDetector.ISSUE);
issues.add(DuplicateResourceDetector.STRING_ESCAPING);
issues.add(DuplicateResourceDetector.TYPE_MISMATCH);
issues.add(EllipsizeMaxLinesDetector.ISSUE);
issues.add(ExifInterfaceDetector.ISSUE);
issues.add(ExtraTextDetector.ISSUE);
issues.add(FieldGetterDetector.ISSUE);
issues.add(FirebaseAnalyticsDetector.INVALID_NAME);
issues.add(FirebaseMessagingDetector.MISSING_TOKEN_REFRESH);
issues.add(FontDetector.FONT_VALIDATION_ERROR);
issues.add(FontDetector.FONT_VALIDATION_WARNING);
issues.add(FragmentDetector.ISSUE);
issues.add(FullBackupContentDetector.ISSUE);
issues.add(GetContentDescriptionOverrideDetector.ISSUE);
issues.add(GetSignaturesDetector.ISSUE);
issues.add(GradleDetector.ACCIDENTAL_OCTAL);
issues.add(GradleDetector.BUNDLED_GMS);
issues.add(GradleDetector.COMPATIBILITY);
issues.add(GradleDetector.DATA_BINDING_WITHOUT_KAPT);
issues.add(GradleDetector.DEPENDENCY);
issues.add(GradleDetector.DEPRECATED);
issues.add(GradleDetector.DEPRECATED_CONFIGURATION);
issues.add(GradleDetector.DEPRECATED_LIBRARY);
issues.add(GradleDetector.DEV_MODE_OBSOLETE);
issues.add(GradleDetector.DUPLICATE_CLASSES);
issues.add(GradleDetector.EXPIRED_TARGET_SDK_VERSION);
issues.add(GradleDetector.EXPIRING_TARGET_SDK_VERSION);
issues.add(GradleDetector.GRADLE_GETTER);
issues.add(GradleDetector.GRADLE_PLUGIN_COMPATIBILITY);
issues.add(GradleDetector.HIGH_APP_VERSION_CODE);
issues.add(GradleDetector.IDE_SUPPORT);
issues.add(GradleDetector.MIN_SDK_TOO_LOW);
issues.add(GradleDetector.NOT_INTERPOLATED);
issues.add(GradleDetector.PATH);
issues.add(GradleDetector.PLUS);
issues.add(GradleDetector.REMOTE_VERSION);
issues.add(GradleDetector.RISKY_LIBRARY);
issues.add(GradleDetector.STRING_INTEGER);
issues.add(GridLayoutDetector.ISSUE);
issues.add(HandlerDetector.ISSUE);
issues.add(HardcodedDebugModeDetector.ISSUE);
issues.add(HardcodedValuesDetector.ISSUE);
issues.add(HardwareIdDetector.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(IconDetector.NOTIFICATION_ICON_COMPATIBILITY);
issues.add(IconDetector.WEBP_ELIGIBLE);
issues.add(IconDetector.WEBP_UNSUPPORTED);
issues.add(IgnoreWithoutReasonDetector.ISSUE);
issues.add(IncludeDetector.ISSUE);
issues.add(InefficientWeightDetector.BASELINE_WEIGHTS);
issues.add(InefficientWeightDetector.INEFFICIENT_WEIGHT);
issues.add(InefficientWeightDetector.NESTED_WEIGHTS);
issues.add(InefficientWeightDetector.ORIENTATION);
issues.add(InefficientWeightDetector.WRONG_0DP);
issues.add(IntentDetector.ISSUE);
issues.add(InteroperabilityDetector.KOTLIN_PROPERTY);
issues.add(InteroperabilityDetector.LAMBDA_LAST);
issues.add(InteroperabilityDetector.NO_HARD_KOTLIN_KEYWORDS);
issues.add(InteroperabilityDetector.PLATFORM_NULLNESS);
issues.add(InstantAppDetector.ISSUE);
issues.add(InvalidImeActionIdDetector.ISSUE);
issues.add(InvalidPackageDetector.ISSUE);
issues.add(ItemDecoratorDetector.ISSUE);
issues.add(JavaPerformanceDetector.PAINT_ALLOC);
issues.add(JavaPerformanceDetector.USE_SPARSE_ARRAY);
issues.add(JavaPerformanceDetector.USE_VALUE_OF);
issues.add(JavaScriptInterfaceDetector.ISSUE);
issues.add(JobSchedulerDetector.ISSUE);
issues.add(KeyboardNavigationDetector.ISSUE);
issues.add(LabelForDetector.ISSUE);
issues.add(LayoutConsistencyDetector.INCONSISTENT_IDS);
issues.add(LayoutInflationDetector.ISSUE);
issues.add(LeakDetector.ISSUE);
issues.add(LocaleDetector.FINAL_LOCALE);
issues.add(LocaleDetector.STRING_LOCALE);
issues.add(LocaleFolderDetector.DEPRECATED_CODE);
issues.add(LocaleFolderDetector.GET_LOCALES);
issues.add(LocaleFolderDetector.INVALID_FOLDER);
issues.add(LocaleFolderDetector.USE_ALPHA_2);
issues.add(LocaleFolderDetector.WRONG_REGION);
issues.add(LogDetector.CONDITIONAL);
issues.add(LogDetector.LONG_TAG);
issues.add(LogDetector.WRONG_TAG);
issues.add(ManifestDetector.ALLOW_BACKUP);
issues.add(ManifestDetector.APP_INDEXING_SERVICE);
issues.add(ManifestDetector.APPLICATION_ICON);
issues.add(ManifestDetector.DEVICE_ADMIN);
issues.add(ManifestDetector.DUPLICATE_ACTIVITY);
issues.add(ManifestDetector.DUPLICATE_USES_FEATURE);
issues.add(ManifestDetector.GRADLE_OVERRIDES);
issues.add(ManifestDetector.ILLEGAL_REFERENCE);
issues.add(ManifestDetector.MIPMAP);
issues.add(ManifestDetector.MOCK_LOCATION);
issues.add(ManifestDetector.MULTIPLE_USES_SDK);
issues.add(ManifestDetector.ORDER);
issues.add(ManifestDetector.SET_VERSION);
issues.add(ManifestDetector.TARGET_NEWER);
issues.add(ManifestDetector.UNIQUE_PERMISSION);
issues.add(ManifestDetector.USES_SDK);
issues.add(ManifestDetector.WEARABLE_BIND_LISTENER);
issues.add(ManifestDetector.WRONG_PARENT);
issues.add(ManifestPermissionAttributeDetector.ISSUE);
issues.add(ManifestResourceDetector.ISSUE);
issues.add(ManifestTypoDetector.ISSUE);
issues.add(MathDetector.ISSUE);
issues.add(MediaBrowserServiceCompatVersionDetector.ISSUE);
issues.add(MergeMarkerDetector.ISSUE);
issues.add(MergeRootFrameLayoutDetector.ISSUE);
issues.add(MissingClassDetector.INNERCLASS);
issues.add(MissingClassDetector.INSTANTIATABLE);
issues.add(MissingClassDetector.MISSING);
issues.add(MissingIdDetector.ISSUE);
issues.add(NamespaceDetector.CUSTOM_VIEW);
issues.add(NamespaceDetector.RES_AUTO);
issues.add(NamespaceDetector.REDUNDANT);
issues.add(NamespaceDetector.TYPO);
issues.add(NamespaceDetector.UNUSED);
issues.add(NegativeMarginDetector.ISSUE);
issues.add(NestedScrollingWidgetDetector.ISSUE);
issues.add(NetworkSecurityConfigDetector.ISSUE);
issues.add(NetworkSecurityConfigDetector.MISSING_BACKUP_PIN);
issues.add(NetworkSecurityConfigDetector.PIN_SET_EXPIRY);
issues.add(NfcTechListDetector.ISSUE);
issues.add(NonInternationalizedSmsDetector.ISSUE);
issues.add(ObjectAnimatorDetector.BROKEN_PROPERTY);
issues.add(ObjectAnimatorDetector.MISSING_KEEP);
issues.add(ObsoleteLayoutParamsDetector.ISSUE);
issues.add(OnClickDetector.ISSUE);
issues.add(OverdrawDetector.ISSUE);
issues.add(OverrideConcreteDetector.ISSUE);
issues.add(OverrideDetector.ISSUE);
issues.add(ParcelDetector.ISSUE);
issues.add(PermissionDetector.CHECK_PERMISSION);
issues.add(PermissionDetector.MISSING_PERMISSION);
issues.add(PluralsDetector.EXTRA);
issues.add(PluralsDetector.IMPLIED_QUANTITY);
issues.add(PluralsDetector.MISSING);
issues.add(PowerManagerDetector.INVALID_WAKE_LOCK_TAG);
issues.add(PreferenceActivityDetector.ISSUE);
issues.add(PrivateApiDetector.ISSUE);
issues.add(PrivateKeyDetector.ISSUE);
issues.add(PrivateResourceDetector.ISSUE);
issues.add(ProguardDetector.SPLIT_CONFIG);
issues.add(ProguardDetector.WRONG_KEEP);
issues.add(PropertyFileDetector.ESCAPE);
issues.add(PropertyFileDetector.HTTP);
issues.add(PropertyFileDetector.PROXY_PASSWORD);
issues.add(PxUsageDetector.DP_ISSUE);
issues.add(PxUsageDetector.IN_MM_ISSUE);
issues.add(PxUsageDetector.PX_ISSUE);
issues.add(PxUsageDetector.SMALL_SP_ISSUE);
issues.add(RangeDetector.RANGE);
issues.add(ReadParcelableDetector.ISSUE);
issues.add(RecyclerViewDetector.DATA_BINDER);
issues.add(RecyclerViewDetector.FIXED_POSITION);
issues.add(RegistrationDetector.ISSUE);
issues.add(RelativeOverlapDetector.ISSUE);
issues.add(RequiredAttributeDetector.ISSUE);
issues.add(RequiresFeatureDetector.REQUIRES_FEATURE);
issues.add(ResourceCycleDetector.CRASH);
issues.add(ResourceCycleDetector.CYCLE);
issues.add(ResourcePrefixDetector.ISSUE);
issues.add(ResourceTypeDetector.COLOR_USAGE);
issues.add(ResourceTypeDetector.HALF_FLOAT);
issues.add(ResourceTypeDetector.RESOURCE_TYPE);
issues.add(RestrictToDetector.RESTRICTED);
issues.add(RestrictToDetector.TEST_VISIBILITY);
issues.add(RestrictionsDetector.ISSUE);
issues.add(RtlDetector.COMPAT);
issues.add(RtlDetector.ENABLED);
issues.add(RtlDetector.SYMMETRY);
issues.add(RtlDetector.USE_START);
issues.add(SamDetector.ISSUE);
issues.add(SQLiteDetector.ISSUE);
issues.add(ScrollViewChildDetector.ISSUE);
issues.add(SdCardDetector.ISSUE);
issues.add(SecureRandomDetector.ISSUE);
issues.add(SecureRandomGeneratorDetector.ISSUE);
issues.add(SecurityDetector.EXPORTED_PROVIDER);
issues.add(SecurityDetector.EXPORTED_RECEIVER);
issues.add(SecurityDetector.EXPORTED_SERVICE);
issues.add(SecurityDetector.OPEN_PROVIDER);
issues.add(SecurityDetector.SET_READABLE);
issues.add(SecurityDetector.SET_WRITABLE);
issues.add(SecurityDetector.WORLD_READABLE);
issues.add(SecurityDetector.WORLD_WRITEABLE);
issues.add(ServiceCastDetector.ISSUE);
issues.add(ServiceCastDetector.WIFI_MANAGER);
issues.add(ServiceCastDetector.WIFI_MANAGER_UNCERTAIN);
issues.add(SetJavaScriptEnabledDetector.ISSUE);
issues.add(SetTextDetector.SET_TEXT_I18N);
issues.add(SignatureOrSystemDetector.ISSUE);
issues.add(SliceDetector.ISSUE);
issues.add(SslCertificateSocketFactoryDetector.CREATE_SOCKET);
issues.add(SslCertificateSocketFactoryDetector.GET_INSECURE);
issues.add(StartDestinationDetector.ISSUE);
issues.add(StateListDetector.ISSUE);
issues.add(StorageDetector.ISSUE);
issues.add(StringAuthLeakDetector.AUTH_LEAK);
issues.add(StringCasingDetector.DUPLICATE_STRINGS);
issues.add(StringFormatDetector.ARG_COUNT);
issues.add(StringFormatDetector.ARG_TYPES);
issues.add(StringFormatDetector.INVALID);
issues.add(StringFormatDetector.POTENTIAL_PLURAL);
issues.add(SyntheticAccessorDetector.ISSUE);
issues.add(SystemPermissionsDetector.ISSUE);
issues.add(TextFieldDetector.ISSUE);
issues.add(TextViewDetector.ISSUE);
issues.add(TextViewDetector.SELECTABLE);
issues.add(ThreadDetector.THREAD);
issues.add(TitleDetector.ISSUE);
issues.add(ToastDetector.ISSUE);
issues.add(TooManyViewsDetector.TOO_DEEP);
issues.add(TooManyViewsDetector.TOO_MANY);
issues.add(TranslationDetector.EXTRA);
issues.add(TranslationDetector.MISSING);
issues.add(TranslationDetector.MISSING_BASE);
issues.add(TranslationDetector.TRANSLATED_UNTRANSLATABLE);
issues.add(TranslucentViewDetector.ISSUE);
issues.add(TrustAllX509TrustManagerDetector.ISSUE);
issues.add(TypedefDetector.TYPE_DEF);
issues.add(TypoDetector.ISSUE);
issues.add(TypographyDetector.DASHES);
issues.add(TypographyDetector.ELLIPSIS);
issues.add(TypographyDetector.FRACTIONS);
issues.add(TypographyDetector.OTHER);
issues.add(TypographyDetector.QUOTES);
issues.add(UnpackedNativeCodeDetector.ISSUE);
issues.add(UnsafeBroadcastReceiverDetector.ACTION_STRING);
issues.add(UnsafeBroadcastReceiverDetector.BROADCAST_SMS);
issues.add(UnsafeNativeCodeDetector.LOAD);
issues.add(UnsafeNativeCodeDetector.UNSAFE_NATIVE_CODE_LOCATION);
issues.add(UnusedNavigationDetector.ISSUE);
issues.add(UnusedResourceDetector.ISSUE);
issues.add(UnusedResourceDetector.ISSUE_IDS);
issues.add(UseCompoundDrawableDetector.ISSUE);
issues.add(UselessViewDetector.USELESS_LEAF);
issues.add(UselessViewDetector.USELESS_PARENT);
issues.add(Utf8Detector.ISSUE);
issues.add(VectorDetector.ISSUE);
issues.add(VectorDrawableCompatDetector.ISSUE);
issues.add(VectorPathDetector.PATH_LENGTH);
issues.add(VectorPathDetector.PATH_VALID);
issues.add(ViewConstructorDetector.ISSUE);
issues.add(ViewHolderDetector.ISSUE);
issues.add(ViewTagDetector.ISSUE);
issues.add(ViewTypeDetector.ADD_CAST);
issues.add(ViewTypeDetector.WRONG_VIEW_CAST);
issues.add(WakelockDetector.ISSUE);
issues.add(WakelockDetector.TIMEOUT);
issues.add(WearStandaloneAppDetector.INVALID_WEAR_FEATURE_ATTRIBUTE);
issues.add(WearStandaloneAppDetector.WEAR_STANDALONE_APP_ISSUE);
issues.add(WebViewDetector.ISSUE);
issues.add(WorkManagerDetector.ISSUE);
issues.add(WrongCallDetector.ISSUE);
issues.add(WrongCaseDetector.WRONG_CASE);
issues.add(WrongIdDetector.INVALID);
issues.add(WrongIdDetector.NOT_SIBLING);
issues.add(WrongIdDetector.UNKNOWN_ID);
issues.add(WrongIdDetector.UNKNOWN_ID_LAYOUT);
issues.add(WrongImportDetector.ISSUE);
issues.add(WrongLocationDetector.ISSUE);
issues.add(WrongThreadInterproceduralDetector.ISSUE);
sIssues = Collections.unmodifiableList(issues);
}
/** Constructs a new {@link BuiltinIssueRegistry} */
public BuiltinIssueRegistry() {}
@Override
public boolean cacheable() {
// In the IDE, cache across incremental runs; here, lint is never run in parallel
// Outside of the IDE, typically in Gradle, we don't want this caching since
// lint can run in parallel and this caching can be incorrect;
// see for example issue 77891711
return LintClient.Companion.isStudio();
}
@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 += 102;
} else if (scope.contains(Scope.ALL_RESOURCE_FILES)) {
initialSize += 12;
}
if (scope.contains(Scope.JAVA_FILE)) {
initialSize += 120;
} else if (scope.contains(Scope.CLASS_FILE)) {
initialSize += 16;
} else if (scope.contains(Scope.MANIFEST)) {
initialSize += 52;
} else if (scope.contains(Scope.GRADLE_FILE)) {
initialSize += 15;
}
return initialSize;
}
}
@Override
public int getApi() {
return ApiKt.CURRENT_API;
}
/**
* 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.Companion.reset();
}
}