Showing preview only (3,008K chars total). Download the full file or copy to clipboard to get everything.
Repository: Kotlin/anko
Branch: master
Commit: 37893764c0f2
Files: 396
Total size: 2.8 MB
Directory structure:
gitextract_fw5cbrlj/
├── .gitignore
├── .idea/
│ └── runConfigurations/
│ └── Android_Studio.xml
├── CHANGELOG.md
├── GOODBYE.md
├── LICENSE
├── README.md
├── anko/
│ ├── idea-plugin/
│ │ ├── attrs/
│ │ │ ├── build.gradle
│ │ │ └── src/
│ │ │ └── org/
│ │ │ └── jetbrains/
│ │ │ └── kotlin/
│ │ │ └── android/
│ │ │ └── Attrs.kt
│ │ ├── build.gradle
│ │ ├── idea-runner/
│ │ │ └── build.gradle
│ │ ├── intentions/
│ │ │ ├── build.gradle
│ │ │ └── src/
│ │ │ └── org/
│ │ │ └── jetbrains/
│ │ │ └── anko/
│ │ │ └── idea/
│ │ │ └── intentions/
│ │ │ ├── AnkoIntention.kt
│ │ │ ├── FindViewByIdIntention.kt
│ │ │ ├── ReplaceColorGrayOpaqueIntention.kt
│ │ │ └── ToastMakeTextShowIntention.kt
│ │ ├── plugin-classpath/
│ │ │ └── build.gradle
│ │ ├── preview/
│ │ │ ├── build.gradle
│ │ │ ├── resources/
│ │ │ │ ├── META-INF/
│ │ │ │ │ └── plugin.xml
│ │ │ │ └── intentionDescriptions/
│ │ │ │ ├── FindViewByIdIntention/
│ │ │ │ │ ├── after.kt.template
│ │ │ │ │ ├── before.kt.template
│ │ │ │ │ └── description.html
│ │ │ │ ├── ReplaceColorGrayOpaqueIntention/
│ │ │ │ │ ├── after.kt.template
│ │ │ │ │ ├── before.kt.template
│ │ │ │ │ └── description.html
│ │ │ │ └── ToastMakeTextShowIntention/
│ │ │ │ ├── after.kt.template
│ │ │ │ ├── before.kt.template
│ │ │ │ └── description.html
│ │ │ └── src/
│ │ │ └── org/
│ │ │ └── jetbrains/
│ │ │ └── kotlin/
│ │ │ └── android/
│ │ │ └── dslpreview/
│ │ │ ├── AnkoNlPreviewManager.kt
│ │ │ ├── AnkoViewLoaderExtension.kt
│ │ │ ├── DslPreviewClassResolver.kt
│ │ │ ├── LayoutPsiFile.kt
│ │ │ ├── PreviewClassDescription.kt
│ │ │ ├── SourceFileModificationTracker.kt
│ │ │ └── UpdateActivityNameTask.kt
│ │ └── xml-converter/
│ │ ├── build.gradle
│ │ ├── resources/
│ │ │ ├── attrs.json
│ │ │ └── views.json
│ │ ├── src/
│ │ │ └── org/
│ │ │ └── jetbrains/
│ │ │ └── kotlin/
│ │ │ └── android/
│ │ │ └── xmlconverter/
│ │ │ ├── AttributeOptimizer.kt
│ │ │ ├── AttributeParser.kt
│ │ │ ├── ConvertAction.kt
│ │ │ ├── LayoutAttributeRenderer.kt
│ │ │ ├── Util.kt
│ │ │ ├── ViewAttributeRenderer.kt
│ │ │ └── XmlConverter.kt
│ │ ├── test/
│ │ │ └── org/
│ │ │ └── jetbrains/
│ │ │ └── kotlin/
│ │ │ └── android/
│ │ │ └── xmlconverter/
│ │ │ ├── BaseXmlConverterTest.java
│ │ │ └── XmlConverterTest.kt
│ │ └── testData/
│ │ ├── attributes/
│ │ │ ├── layout.kt
│ │ │ └── layout.xml
│ │ ├── dimensions/
│ │ │ ├── layout.kt
│ │ │ └── layout.xml
│ │ ├── linearLayout/
│ │ │ ├── layout.kt
│ │ │ └── layout.xml
│ │ ├── relativeLayout/
│ │ │ ├── layout.kt
│ │ │ └── layout.xml
│ │ └── simple/
│ │ ├── layout.kt
│ │ └── layout.xml
│ ├── library/
│ │ ├── generated/
│ │ │ ├── anko/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── appcompat-v7/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ └── Views.kt
│ │ │ ├── appcompat-v7-commons/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── appcompat-v7-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── appcompat-v7-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── cardview-v7/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ └── Views.kt
│ │ │ ├── common/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── commons/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── constraint-layout/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ └── Views.kt
│ │ │ ├── coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── bg.kt
│ │ │ │ └── weakReferenceSupport.kt
│ │ │ ├── design/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ └── Views.kt
│ │ │ ├── design-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── design-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── gridlayout-v7/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ └── Views.kt
│ │ │ ├── percent/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ └── Views.kt
│ │ │ ├── recyclerview-v7/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ └── Views.kt
│ │ │ ├── recyclerview-v7-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── recyclerview-v7-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk15/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk15-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk15-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk19/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk19-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk19-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk21/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk21-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk21-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk23/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk23-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk23-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk25/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk25-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk25-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk27/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk27-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk27-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sdk28/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Properties.kt
│ │ │ │ ├── Services.kt
│ │ │ │ └── Views.kt
│ │ │ ├── sdk28-coroutines/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ListenersWithCoroutines.kt
│ │ │ ├── sdk28-listeners/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Listeners.kt
│ │ │ ├── sqlite/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── SqlParserHelpers.kt
│ │ │ ├── support-v4/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── Layouts.kt
│ │ │ │ ├── Listeners.kt
│ │ │ │ └── Views.kt
│ │ │ └── support-v4-commons/
│ │ │ ├── build.gradle
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── AndroidManifest.xml
│ │ ├── generator/
│ │ │ ├── build.gradle
│ │ │ ├── src/
│ │ │ │ └── org/
│ │ │ │ └── jetbrains/
│ │ │ │ └── android/
│ │ │ │ └── anko/
│ │ │ │ ├── ClassProcessor.kt
│ │ │ │ ├── annotations/
│ │ │ │ │ ├── AnnotationManager.kt
│ │ │ │ │ └── annotationProviders.kt
│ │ │ │ ├── artifact/
│ │ │ │ │ └── Artifact.kt
│ │ │ │ ├── config/
│ │ │ │ │ ├── AnkoConfiguration.kt
│ │ │ │ │ ├── AnkoFile.kt
│ │ │ │ │ ├── ArtifactType.kt
│ │ │ │ │ ├── ConfigurationKey.kt
│ │ │ │ │ ├── DefaultAnkoConfiguration.kt
│ │ │ │ │ ├── GeneratorContext.kt
│ │ │ │ │ ├── Logger.kt
│ │ │ │ │ ├── Props.kt
│ │ │ │ │ └── configurationKeys.kt
│ │ │ │ ├── generator/
│ │ │ │ │ ├── GenerationState.kt
│ │ │ │ │ ├── LayoutGenerator.kt
│ │ │ │ │ ├── ListenerGenerator.kt
│ │ │ │ │ ├── PropertyGenerator.kt
│ │ │ │ │ ├── ServiceGenerator.kt
│ │ │ │ │ ├── dslElements.kt
│ │ │ │ │ ├── layoutParamsUtils.kt
│ │ │ │ │ └── viewClassGenerators.kt
│ │ │ │ ├── main.kt
│ │ │ │ ├── render/
│ │ │ │ │ ├── LayoutRenderer.kt
│ │ │ │ │ ├── ListenerRenderer.kt
│ │ │ │ │ ├── PropertyRenderer.kt
│ │ │ │ │ ├── RenderFacade.kt
│ │ │ │ │ ├── ServiceRenderer.kt
│ │ │ │ │ ├── SqlParserHelperRenderer.kt
│ │ │ │ │ ├── viewConstructorUtils.kt
│ │ │ │ │ └── viewRenderers.kt
│ │ │ │ ├── sources/
│ │ │ │ │ ├── SourceManager.kt
│ │ │ │ │ └── sourceProviders.kt
│ │ │ │ ├── templates/
│ │ │ │ │ ├── JtwigTemplateProvider.kt
│ │ │ │ │ ├── MustacheTemplateProvider.kt
│ │ │ │ │ └── TemplateManager.kt
│ │ │ │ ├── utils/
│ │ │ │ │ ├── Buffer.kt
│ │ │ │ │ ├── ClassInfo.kt
│ │ │ │ │ ├── ClassTree.kt
│ │ │ │ │ ├── ClassTreeUtils.kt
│ │ │ │ │ ├── ImportList.kt
│ │ │ │ │ ├── KMethod.kt
│ │ │ │ │ ├── KType.kt
│ │ │ │ │ ├── KVariable.kt
│ │ │ │ │ ├── MethodInfo.kt
│ │ │ │ │ ├── Property.kt
│ │ │ │ │ ├── ReflectionUtils.kt
│ │ │ │ │ ├── SignatureParser.kt
│ │ │ │ │ ├── Types.kt
│ │ │ │ │ ├── stringUtils.kt
│ │ │ │ │ └── utils.kt
│ │ │ │ └── writer/
│ │ │ │ ├── AbstractWriter.kt
│ │ │ │ ├── GeneratorWriter.kt
│ │ │ │ └── VerifyWriter.kt
│ │ │ └── test/
│ │ │ └── org/
│ │ │ └── jetbrains/
│ │ │ └── android/
│ │ │ └── anko/
│ │ │ └── ClassTreeTest.java
│ │ ├── library.gradle
│ │ ├── robolectricTests/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle
│ │ │ ├── local.properties
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── AndroidLayoutParamsTestActivity.kt
│ │ │ │ ├── AndroidLayoutsTestActivity.kt
│ │ │ │ ├── AndroidListenerHelpersTestActivity.kt
│ │ │ │ ├── AndroidMultiMethodListenersActivity.kt
│ │ │ │ ├── AndroidPropertiesTestActivity.kt
│ │ │ │ ├── AndroidSimpleTestActivity.kt
│ │ │ │ ├── AndroidWidgetTestActivity.kt
│ │ │ │ └── README.md
│ │ │ └── test/
│ │ │ └── java/
│ │ │ ├── AnkoLoggerTest.kt
│ │ │ ├── AnkoSQliteTest.kt
│ │ │ ├── AttemptTest.kt
│ │ │ ├── BuildSpannedTest.kt
│ │ │ ├── BundleOfTest.kt
│ │ │ ├── ChildrenSequenceTest.kt
│ │ │ ├── ClassParserTest.kt
│ │ │ ├── CollectionsTest.kt
│ │ │ ├── CreateIntentTest.kt
│ │ │ ├── DialogsTest.kt
│ │ │ ├── FindViewTest.kt
│ │ │ ├── IntentForTest.kt
│ │ │ ├── RelativeLayoutHelpersTest.kt
│ │ │ ├── ServiceTest.kt
│ │ │ ├── SimpleTest.kt
│ │ │ ├── SparseArraysTest.kt
│ │ │ └── WithArgumentsTest.kt
│ │ ├── static/
│ │ │ ├── appcompatV7/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── SupportAlertBuilder.kt
│ │ │ ├── commons/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── AnkoContext.kt
│ │ │ │ ├── Async.kt
│ │ │ │ ├── ContextUtils.kt
│ │ │ │ ├── Custom.kt
│ │ │ │ ├── Deprecated.kt
│ │ │ │ ├── Dimensions.kt
│ │ │ │ ├── Helpers.kt
│ │ │ │ ├── Intents.kt
│ │ │ │ ├── Internals.kt
│ │ │ │ ├── Logging.kt
│ │ │ │ ├── RelativeLayoutLayoutParamsHelpers.kt
│ │ │ │ ├── SharedPreferences.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ ├── Ui.kt
│ │ │ │ ├── buildSpanned.kt
│ │ │ │ ├── collections/
│ │ │ │ │ ├── Arrays.kt
│ │ │ │ │ ├── Collections.kt
│ │ │ │ │ └── SparseArrays.kt
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── AlertBuilder.kt
│ │ │ │ │ ├── AlertDialogBuilder.kt
│ │ │ │ │ ├── AndroidAlertBuilder.kt
│ │ │ │ │ ├── AndroidDialogs.kt
│ │ │ │ │ ├── AndroidSelectors.kt
│ │ │ │ │ ├── Dialogs.kt
│ │ │ │ │ ├── Selectors.kt
│ │ │ │ │ └── Toasts.kt
│ │ │ │ ├── menuItemsSequences.kt
│ │ │ │ └── viewChildrenSequences.kt
│ │ │ ├── constraint-layout/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── ConstraintLayout.kt
│ │ │ ├── design/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── Snackbar.kt
│ │ │ ├── platform/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── CustomLayoutProperties.kt
│ │ │ │ ├── CustomServices.kt
│ │ │ │ ├── CustomViewProperties.kt
│ │ │ │ ├── CustomViews.kt
│ │ │ │ ├── InputConstraints.kt
│ │ │ │ └── Menus.kt
│ │ │ ├── sqlite/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ ├── ClassParser.kt
│ │ │ │ ├── Database.kt
│ │ │ │ ├── SelectQueryBuilder.kt
│ │ │ │ ├── SqlParsers.kt
│ │ │ │ ├── UpdateQueryBuilder.kt
│ │ │ │ ├── org/
│ │ │ │ │ └── jetbrains/
│ │ │ │ │ └── anko/
│ │ │ │ │ └── db/
│ │ │ │ │ └── JavaSqliteUtils.java
│ │ │ │ └── sqlTypes.kt
│ │ │ └── supportV4/
│ │ │ ├── build.gradle
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ ├── Support.kt
│ │ │ ├── SupportAsync.kt
│ │ │ ├── SupportContextUtils.kt
│ │ │ ├── SupportDialogs.kt
│ │ │ ├── SupportDimensions.kt
│ │ │ └── SupportIntents.kt
│ │ ├── stubs/
│ │ │ ├── build.gradle
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── Stubs.kt
│ │ └── testUtils/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── com/
│ │ │ └── intellij/
│ │ │ └── rt/
│ │ │ └── execution/
│ │ │ └── junit/
│ │ │ ├── FileComparisonFailure.java
│ │ │ └── KnownException.kt
│ │ └── org/
│ │ └── jetbrains/
│ │ └── anko/
│ │ └── test/
│ │ └── testUtils.kt
│ └── props/
│ ├── annotations/
│ │ └── android/
│ │ ├── support/
│ │ │ └── v7/
│ │ │ └── widget/
│ │ │ └── annotations.xml
│ │ ├── view/
│ │ │ └── annotations.xml
│ │ └── widget/
│ │ └── annotations.xml
│ ├── configuration.json
│ ├── excluded_methods.txt
│ ├── excluded_properties.txt
│ ├── helper_constructors.txt
│ ├── imports_properties.txt
│ ├── imports_sqliteparserhelpers.txt
│ ├── imports_views.txt
│ ├── kotlin-android-sdk-annotations-1.0.0.jar
│ ├── properties_without_getters.txt
│ └── templates/
│ ├── complex_listener.twig
│ ├── complex_listener_coroutines.twig
│ ├── layout.twig
│ ├── services.twig
│ ├── simple_listener.mustache
│ ├── simple_listener_coroutines.twig
│ ├── sql_parser_helpers.twig
│ └── view.mustache
├── build.gradle
├── download_android_sdk.xml
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
├── update_dependencies.xml
└── update_dependencies_idea.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
/dependencies/
/ideaSDK/
build/
.DS_Store
*.iml
.gradle
/out
.idea/*
!.idea/runConfigurations
local.properties
================================================
FILE: .idea/runConfigurations/Android_Studio.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Android Studio" type="Application" factoryName="Application" singleton="true">
<log_file path="$PROJECT_DIR$/ideaSDK/system-idea/log/idea.log" checked="true" skipped="true" show_all="false" alias="idea.log" />
<extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
<option name="MAIN_CLASS_NAME" value="com.intellij.idea.Main" />
<option name="VM_PARAMETERS" value="-Xmx1250m -XX:ReservedCodeCacheSize=240m -XX:+HeapDumpOnOutOfMemoryError -ea -Didea.is.internal=true -Didea.debug.mode=true -Didea.system.path=../system-idea -Didea.config.path=../config-idea -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -Dsun.io.useCanonCaches=false -Dplugin.path=$PROJECT_DIR$/anko/idea-plugin/preview/build/libs/preview-all.jar -Dkotlin.internal.mode.enabled=true -Didea.additional.classpath=../idea-kotlin-runtime/kotlin-runtime.jar,../idea-kotlin-runtime/kotlin-reflect.jar -Didea.platform.prefix=AndroidStudio" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/ideaSDK/bin" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="idea-runner" />
<envs />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
<RunnerSettings RunnerId="JavaRebel">
<option name="bootstrapPath" />
<option name="jrebelArgs" value="" />
<option name="loggingEnabled" value="false" />
<option name="useBootstrapDefaults" value="true" />
</RunnerSettings>
<RunnerSettings RunnerId="JavaRebel Debug">
<option name="bootstrapPath" />
<option name="debugPort" value="" />
<option name="jrebelArgs" value="" />
<option name="loggingEnabled" value="false" />
<option name="transport" value="0" />
<option name="useBootstrapDefaults" value="true" />
<option name="DEBUG_PORT" value="" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
<RunnerSettings RunnerId="Profile " />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Debug" />
<ConfigurationWrapper RunnerId="Profile " />
<ConfigurationWrapper RunnerId="Run" />
<method>
<option name="Make" enabled="false" />
<option name="Gradle.BeforeRunTask" enabled="true" tasks=":ide:build :ide:preview:shadowJar" externalProjectPath="$PROJECT_DIR$/anko/idea-plugin" vmOptions="" scriptParameters="" />
</method>
</configuration>
</component>
================================================
FILE: CHANGELOG.md
================================================
## Change Log
### Anko 0.10.5 *(2018-04-28)*
- [DSL for ConstraintLayout](https://github.com/Kotlin/anko/wiki/ConstraintLayout)
- Preview plugin compatibility with Android Studio 3.1 C6
### Anko 0.10.3 *(2017-11-22)*
#### Bugfixes
- Anko support plugin compatibility with Kotlin 1.1.60+
- Fix Xml to Dsl converter ([#370](https://github.com/Kotlin/anko/issues/370))
- `lparams` for `CollapsingToolbarLayout`, now returns correct LayoutParams ([#275](https://github.com/Kotlin/anko/issues/275), [#269](https://github.com/Kotlin/anko/issues/269))
- `Context.clipboardManager` now returns new `ClipboardManager` instead of deprecated one ([#180](https://github.com/Kotlin/anko/issues/180))
- Generate layout wrapper for `CardView` ([#269](https://github.com/Kotlin/anko/issues/269), [#357](https://github.com/Kotlin/anko/issues/357))
- Fix ClassParser's Boolean parser when type is Long ([#464](https://github.com/Kotlin/anko/issues/464))
#### Breaking Changes
- Removed Dsl for classes from `android.support.design.internal.*` as they shouldn't be used outside of support library
#### Other Changes
- `TextInputEditText` added to anko-design ([#205](https://github.com/Kotlin/anko/issues/205))
- Anko commons dialog extensions now accept `CharSequence` instead of `String` ([#422](https://github.com/Kotlin/anko/issues/422))
- Add start and end rules to RelativeLayout.LayoutParams extensions ([#497](https://github.com/Kotlin/anko/pull/497))
- Add `allCaps` and `ems` properties to TextView ([#459](https://github.com/Kotlin/anko/pull/459))
- Add snackbar helpers with indefinite duration [(#454](https://github.com/Kotlin/anko/pull/454))
- Allow nullable values in `createIntent` and `startActivity` ([#465](https://github.com/Kotlin/anko/pull/465))
- Add extensions for `View::backgroundColorResource` and `TextView::textColorResource` ([#254](https://github.com/Kotlin/anko/pull/254))
- Return `ComponentName` from `startService` methods ([#435](https://github.com/Kotlin/anko/issues/435))
- Allow alerts to be cancelable ([#405](https://github.com/Kotlin/anko/pull/405))
- Add intent helpers for stopping services ([#509](https://github.com/Kotlin/anko/pull/509))
- Return toast object in toast helper functions ([#512](https://github.com/Kotlin/anko/pull/512))
### Anko 0.10.2 *(2017-10-17)*
- Fixed Anko Support IDE plugin compatibility with Android Studio 3.0 RC1
- `Fragment.indeterminateProgressDialog` now shows indeterminate progress dialog instead of classic ([#487](https://github.com/Kotlin/anko/pull/487))
- Added methods for creating and dropping a index for SQLiteDatabase ([#472](https://github.com/Kotlin/anko/pull/472))
### Anko 0.10.1 *(2017-05-31)*
#### Bugfixes
- Fix assertion in the Anko Support IDE plugin ([#387](https://github.com/Kotlin/anko/issues/387));
- Update `kotlinx.coroutines.android` dependency (the old one fails to resolve in Android Studio 3.0) )[#381](https://github.com/Kotlin/anko/issues/381));
- Fix inconsistency between `hasNext()` and `next()` in `childrenRecursiveSequence()` ([#388](https://github.com/Kotlin/anko/pull/388)).
### Anko 0.10 *(2017-05-17)*
#### 🐧 Notable changes:
- Coroutines and `DslMarker` annotation support;
- Anko Support IDE plugin updated for Android Studio 2.4.
#### Breaking changes:
- `DslMarker` annotation support (calling `lparams()` inside View blocks is finally forbidden);
- DSL listeners moved to `anko-<platformName>-listeners` artifacts (e.g. `anko-sdk25-listeners`);
- View blocks with the `theme` parameter renamed to `themed…()` to avoid disambiguation;
- Removed `AnkoLogger(clazz: KClass<*>)` and `AnkoLogger(obj: Any)`.
#### New API:
- `anko-<platformName>-coroutines` (e.g. `anko-sdk25-coroutines`) artifacts with the new listener helpers with coroutines support;
- `bg()` function that executes code in background (wrapper on top of [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines));
- `AlertBuilder` interface with *core* and *appcompat* implementations. `AlertDialogBuilder` is deprecated;
- `Snackbar` helpers #203;
- `Dialog.find()` method #351;
- `foreach()` extensions for `SparseArray` #255;
- Reified version for `AnkoLogger` (`AnkoLogger<MyClass>()`);
- `isError` and `hasValue` to `AttemptResult`.
#### Other changes:
- Anko Support IDE plugin upated in order to support Android Studio 2.4;
- Added meta-artifact `org.jetbrains.anko:anko`;
- Added *Anko Commons* artifacts for Android support libraries (`anko-support-v4-commons`, `anko-appcompat-v7-commons`) #158;
- New Android SDK target: `sdk-25`;
- Updated Android Support library dependencies;
- `anko-common` artifact renamed to `anko-commons` to reflect the naming changes. `anko-common` is deprecated;
- `ClassParser` now accepts all primitive types #320;
- Synthetic properties (such as `act` or `ctx`) are now `inline`;
- `lparams` functions are now `inline` #338;
- Removed `TextView.enabled` generated property #245;
- Accessing setter-only property values is now forbidden.
#### Bugfixes:
- Fix `NoSuchMethodError` on accessing `act` property from the support Fragment #311;
- Fix compatibility with Proguard #235;
- Require the relative view `id` to be set in `RelativeView` helpers #363.
### Anko 0.10 Beta 2 *(2017-03-22)*
#### Breaking changes:
- DSL listeners moved to `anko-<platformName>-listeners` (e.g. `anko-sdk15-listeners`) artifacts;
- The custom `async()` function introduced in 0.10.0-beta1 was removed (use `async()` from [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines));
- `AnkoLogger(clazz: KClass<*>)` and `AnkoLogger(obj: Any)` functions are removed;
#### Other changes:
- `anko-<platformName>-coroutines` (e.g. `anko-sdk15-coroutines`) artifacts with the new listener helpers with coroutines support;
- `lparams` functions are now `inline` #338;
- `bg()` function that executes code in a background thread and returns `Deferred<T>`;
- `AnkoLogger` now has the reified version: `AnkoLogger<MyClass>()`;
### Anko 0.10 Beta 1 *(2017-03-06)*
**Anko 0.10 requires Kotlin 1.1.**
#### Breaking changes:
- View DSL functions that accept the `theme` parameter are renamed to `themed…()` to avoid disambiguation;
- `DslMarker` support (`lparams` inside the View lambda are now forbidden);
#### Other changes:
- Add `anko-coroutines` artifact with the Kotlin 1.1 coroutines support (`async` / `bg`);
- New Android SDK target: `sdk-25`;
- Android Support library dependencies updated;
- `AlertBuilder` interface with core and app-compat implementations. `AlertDialogBuilder` is deprecated;
- `ClassParser` now accepts all primitive types #320;
- New artifacts: `anko-support-v4-common` and `anko-appcompat-v7-common` (with basic helpers, without the DSL functionality) #158;
- Synthetic properties (such as `act` or `ctx`) are now `inline`;
- `TextView.enabled` generated property is removed #245;
- Accessing setter-only property values is forbidden;
- SAM View listener setter functions are now `inline`;
- Add `isError` and `hasValue` to `AttemptResult`;
- Fix `NoSuchMethodError` on accessing `act` property from the support Fragment #311.
### Anko 0.9.1 *(2016-12-14)*
- Allow to use `AnkoLogger` as an instance #262;
- `FOREIGN_KEY` now returns `Pair<String, SqlType>` #258 #219;
- Fix `SparseArray` as sequence returns list which doesn't match its size #243 #240;
- Allow ManagedSQLiteOpenHelper to accept null for database name #228;
- Fix ProGuard warning (can't find referenced method 'int getThemeResId()' in library class android.view.ContextThemeWrapper). #206;
- Add `LayoutParams.baselineOf()` #213;
- Allow nullable values in `intentFor` #211;
- Migrate Anko build to Gradle.
### Anko 0.9 *(2016-06-07)*
- Update to Kotlin 1.0.2 and IDEA 2016.1 #161 #177;
- Support styles in DSL #16 #143;
- Add KDoc comments for most of Anko utilities #168;
- Rename `async()` to `doAsync()`, `onUiThread()` to `runOnUiThread()` for `Fragment` and `Context`;
- Add `AnkoAsyncContext.onComplete()` #181;
- `uiThread()` now returns `false` if code was not executed;
- Ability to add an exception handler to `doAsync()` #182;
- Add `newTask` parameter to `browse()` #186;
- Add `sendSMS()` #171;
- Add `makeStyle()` #132;
- Add `Activity.contentView` property #157;
- Add `horizontalProgressBar()` #23;
- Add `doFromSdk()` and `doIfSdk()` #118;
- Add `alignStart()` and `alignEnd()` to `RelativeLayout.LayoutParams` extensions;
- `AlertDialogBuilder`: make the `dialog` property public #140;
- Add `okButton()`, `yesButton()`, `cancelButton()`, `noButton()` to `AlertDialogBuilder`;
- Add nullable values to SQLite helpers #154;
- Add `editText()` with input constraints #25;
- Add `attempt()` #182;
- Change semantics of `Intent.clearTask()` and similar functions, now add flags, not set (replace old) #173;
- Rename `forEachReversed` to `forEachReversedByIndex()`;
- Rename `style()` to `applyRecursively()`;
- Allow the database to be pluggable for query builders #187;
- Fix `NOT_NULL` SQL type modifier #175;
- Fix `startActivityForResult` called on wrong object (for Fragments) #76;
- Fix `include` doesn't set LayoutParams from the XML #149;
- `View.backgroundDrawable` is nullable now #169;
- `classParser` has always not accessible constructor #136 #145.
### Anko 0.8.3 *(2016-03-02)*
Built for Kotlin 1.0.
* Remove deprecated `android.support.v4.Fragment.addView()` function.
### Anko 0.8.2 *(2016-02-04)*
Built for Kotlin 1.0 RC.
* `forEachChild()`, `forEachChildWithIndex()`, `firstChild()`, `firstChildOrNull()` are inlined now [#134](https://github.com/Kotlin/anko/pull/134);
* `Int.withAlpha` [#125](https://github.com/Kotlin/anko/pull/125);
* `ContextWrapper` is now supported by `AnkoContext`;
* Anko library size and method count was slightly reduced.
### Anko 0.8.1 *(2015-12-09)*
Built for Koltin Beta 3 (1.0.0-beta-3595).
* SQLite helpers are moved to `anko-sqlite` artifact;
* Fixed "Implicit setContentView in onCreate doesn't work in 0.8" [#114](https://github.com/Kotlin/anko/issues/114);
* Fixed "Anko DSL Preview plugin 0.8 crashes" [#115](https://github.com/Kotlin/anko/issues/115);
* Add intention: `0xffefefef.toInt()` → `0xef.gray.opaque`;
* Add `forEachChild()`, `firstChild()`, `firstChildOrNull()` helpers.
### Anko 0.8 *(2015-12-01)*
Built for Kotlin Beta 2 (1.0.0-beta-2423).
* `AnkoComponent` interface for writing reusable components;
* New DSL preview plugin: much more fast and stable :rocket:;
* Add `TextView.gravity` [#96](https://github.com/JetBrains/anko/issues/96) and `ImageView.imageResource` [#102](https://github.com/JetBrains/anko/issues/102) properties;
* `Cancel` is the default negative button name [#112](https://github.com/JetBrains/anko/issues/112);
* Fix `AnkoLogger.wtf`;
* Remove deprecated `__dslAddView` functions.
### Anko 0.7.3 *(2015-11-02)*
Built for Kotlin **Beta Candidate** (`1.0.0-beta-1103`).
### Anko 0.7.2 *(2015-10-22)*
Built for Kotlin **Beta Candidate**.
### Anko 0.7.1 *(2015-10-01)*
Built for Kotlin M14 (0.14.449).
* [#86](https://github.com/JetBrains/anko/pull/86) New: Allow getting MenuItems as a Sequence.
* New: Added `findOptional<T>` for `View`, `Activity` and `Fragment`.
* Fix: An exception in DSL Preview plugin in Android Studio 1.4.
### Anko 0.7 *(2015-09-17)*
Built for Kotlin M13 (0.13.1513).
* Anko is now split to several components:
* `anko-common` contains some basic helpers (such as `async`, `toast` or SQLite parsers). Does not contain any of view DSL).
* `anko-sdk15` (also `19`, `21`, `23`) contains DSL bindings for the corresponding Android SDK version.
* `anko-support-v4`, `anko-appcompat-v7` and others - additional DSL bindings for the Android support library widgets.
* [#78](https://github.com/JetBrains/anko/issues/78) Changed `async` logic.
* Most of extension properties for Views are removed because Kotlin now supports this seamlessly.
* [#74](https://github.com/JetBrains/anko/issues/74) New: Ability to iterate children views lazily using sequences.
* [#77](https://github.com/JetBrains/anko/issues/77) New: Extension functions for the optimized Android collections and arrays.
* `layoutParams` property is renamed to `lparams` (due to the clash with `View.getLayoutParams`).
### Anko 0.6.3 *(2015-07-10)*
Built for Kotlin M12.1 (0.12.613).
* New: Tinted (appcompat) widgets support.
* Deprecated extension properties for `RSSurfaceView`, `RSTextureView`, `WebView` are removed.
* Intentions for `Toast.makeText(...).show()` and `findViewById()` in IDEA plugin.
* [#54](https://github.com/JetBrains/anko/issues/54) Fix: LayoutParams resolving for some widgets.
* [#60](https://github.com/JetBrains/anko/issues/60) Support more types in `intentFor`.
* [#65](https://github.com/JetBrains/anko/issues/65) Fix: `AnkoLogger` can't now be used as a delegate.
* Fix: `InterfaceWorkarounds` fields.
* DSL Preview plugin is updated to Robolectric 3.0 rc3.
* DSL generator refactoring.
### Anko 0.6.2 *(2015-05-29)*
Built for Kotlin M12 (0.12.200).
* Sensible listener argument names.
* Some listener arguments and properties are now not-null.
* New: Added `bundleOf` function.
* New: Added `getBuilder` in `AlertDialogBuilder`.
* [#42](https://github.com/JetBrains/anko/pull/42) New: Added `Context.startService` extension.
* [#46](https://github.com/JetBrains/anko/pull/46) Fix: `IllegalArgumentException` in `AnkoLogger`.
* [#44](https://github.com/JetBrains/anko/pull/44) Fix: Wrong return type for `include`.
* [#42](https://github.com/JetBrains/anko/pull/42) Fix: `INTEGER` `SqlType` instead of `INT`.
* [#31](https://github.com/JetBrains/anko/issues/31) Fix: Added `withArguments` for `android.support.v4.Fragment`.
* [#45](https://github.com/JetBrains/anko/issues/45) Fix: `SingleColumnParser` and `ScalarColumnParser`.
* [#38](https://github.com/JetBrains/anko/issues/38) Fix: `SQLiteDatabase.dropTable` signature.
### Anko 0.6.1 *(2015-05-06)*
Built for Kotlin M11 (0.11.91.4).
* [#30](https://github.com/JetBrains/anko/issues/30) Fix: Arguments in `intentFor`.
* [#29](https://github.com/JetBrains/anko/issues/29) New: `android.support.v4.app.Fragment.withArguments` function.
* [#26](https://github.com/JetBrains/anko/issues/26) New: More extension properties (including `emptyView` for `AdapterView`).
* [#21](https://github.com/JetBrains/anko/issues/21) Fix: Supported String resources with `progressDialog` and `indeterminateProgressDialog`.
### Anko 0.6 *(2015-04-29)*
Built for Kotlin M11 (0.11.91.2).
* **Breaking:** package name change (kotlinx.android.anko → org.jetbrains.anko).
* **Breaking:** [new syntax](https://github.com/JetBrains/anko#listeners) for multi-method listeners.
* New: Supported Configuration qualifiers.
* New: Custom views creation.
* New: Supported `appcompat.v7` views and properties.
* Top-level DSL functions for simple views are removed.
* New: `startActivityForResult`, `dimen` extension functions.
* New: `uiThread` property for `Context` and `Fragment`.
### Anko 0.5 *(2015-04-02)*
Built for Koltin M11 (0.11.91.1).
* Rebranding: Koan → Anko! :sparkles:
* **Preview plugin** is available for IntelliJ IDEA and Android Studio.
================================================
FILE: GOODBYE.md
================================================
# Discontinuing Anko
Over the last few months, we have received quite a few questions from our users regarding the future of Anko. So today, we are going to make things clear and officially deprecate the library.
## Why are you deprecating Anko?
Anko was born as a type-safe DSL for building Android layouts. It not only allowed creating layouts in a type-safe way, but it made the layouts more adaptable, dynamic, reusable, and also performant, as there was no need for expensive layout inflation.
During the evolution of Anko, it became clear that not only the layout part of the Android framework could benefit from providing Kotlin extensions. That is why we created Anko Commons, a toolbox of utility functions and classes for different parts of the Android framework.
While Anko was quite popular among Kotlin users, we have to admit that the experience was not 100% perfect. Until recently, Android View APIs were highly optimized for inflation, and sometimes it wasn't possible to set some of the attributes programmatically. As a result, the DSL had to rely on hacks or workarounds. Also, it was non-trivial to emulate the reflective approach of widget loading needed for supporting AppCompat. We didn't have enough resources to fix all corner cases in a timely manner.
However, things have changed substantially during the last few years. Google officially supported Kotlin, and later even made Kotlin the preferred language for Android application development. Thanks to JetPack, an extensive set of libraries, the rough edges of the SDK were smoothed over.
Anko is a successful project, and it has played its role in establishing a better Android developer experience with Kotlin. However, there are modern alternatives today, and we feel it's time to say goodbye to Anko.
## What should I use instead of Anko?
### Layout DSL
- Jetpack Compose. A reactive View DSL for Kotlin, backed by Google.
- Splitties – [Views DSL](https://github.com/LouisCAD/Splitties/tree/master/modules/views-dsl). An extensible View DSL which resembles Anko.
### Generic utilities
- [Android KTX](https://developer.android.com/kotlin/ktx). A set of Kotlin extensions for different purposes, backed by Google.
- [Splitties](https://github.com/LouisCAD/Splitties). A lot of micro-libraries for all occasions.
### SQLite helpers
- [Room](https://developer.android.com/topic/libraries/architecture/room). An annotation-based framework for SQLite database access, backed by Google.
- [SQLDelight](https://github.com/cashapp/sqldelight) A type-safe API generator for SQL queries.
* * *
We would like to thank you for your support throughout these years. If you have any questions, please contact us on Slack or via the forum. You can find the links on our [community overview](https://kotlinlang.org/community/) page.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
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.
================================================
FILE: README.md
================================================
[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
[ ](https://bintray.com/jetbrains/anko/anko/_latestVersion)
[](https://www.apache.org/licenses/LICENSE-2.0)
<img src="doc/logo.png" alt="Anko logo" height="101" width="220" />
:warning: Anko is deprecated. Please see [this page](/GOODBYE.md) for more information.
* * *
Anko is a [Kotlin](https://www.kotlinlang.org/) library which makes Android application development faster and easier. It makes your code clean and easy to read, and lets you forget about rough edges of the Android SDK for Java.
Anko consists of several parts:
* *Anko Commons*: a lightweight library full of helpers for intents, dialogs, logging and so on;
* *Anko Layouts*: a fast and type-safe way to write dynamic Android layouts;
* *Anko SQLite*: a query DSL and parser collection for Android SQLite;
* *Anko Coroutines*: utilities based on the [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) library.
## Anko Commons
*Anko Commons* is a "toolbox" for Kotlin Android developer. The library contains a lot of helpers for Android SDK, including, but not limited to:
* Intents ([wiki](https://github.com/Kotlin/anko/wiki/Anko-Commons-–-Intents));
* Dialogs and toasts ([wiki](https://github.com/Kotlin/anko/wiki/Anko-Commons-–-Dialogs));
* Logging ([wiki](https://github.com/Kotlin/anko/wiki/Anko-Commons-–-Logging));
* Resources and dimensions ([wiki](https://github.com/Kotlin/anko/wiki/Anko-Commons-–-Misc)).
## Anko Layouts ([wiki](https://github.com/Kotlin/anko/wiki/Anko-Layouts))
*Anko Layouts* is a DSL for writing dynamic Android layouts. Here is a simple UI written with Anko DSL:
```kotlin
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
```
The code above creates a button inside a `LinearLayout` and attaches an `OnClickListener` to that button. Moreover, `onClick` accepts a [`suspend` lambda](https://kotlinlang.org/docs/reference/coroutines.html), so you can write your asynchronous code right inside the listener!
Note that this is the complete layout code. No XML is required!
Anko has a [DSL for ConstraintLayout](https://github.com/Kotlin/anko/wiki/ConstraintLayout) since v0.10.4
<img src="doc/helloworld.png" alt="Hello world" height="90" width="373" />
There is also a [plugin](https://github.com/Kotlin/anko/wiki/Anko-Layouts#anko-support-plugin) for Android Studio that supports previewing Anko DSL layouts.
## Anko SQLite ([wiki](https://github.com/Kotlin/anko/wiki/Anko-SQLite))
Have you ever been tired of parsing SQLite query results using Android cursors? *Anko SQLite* provides lots of helpers to simplify working with SQLite databases.
For example, here is how you can fetch the list of users with a particular name:
```kotlin
fun getUsers(db: ManagedSQLiteOpenHelper): List<User> = db.use {
db.select("Users")
.whereSimple("family_name = ?", "John")
.doExec()
.parseList(UserParser)
}
```
## Anko Coroutines ([wiki](https://github.com/Kotlin/anko/wiki/Anko-Coroutines))
*Anko Coroutines* is based on the [`kotlinx.coroutines`](https://github.com/kotlin/kotlinx.coroutines) library and provides:
* [`bg()`](https://github.com/Kotlin/anko/wiki/Anko-Coroutines#bg) function that executes your code in a common pool.
* [`asReference()`](https://github.com/Kotlin/anko/wiki/Anko-Coroutines#asreference) function which creates a weak reference wrapper. By default, a coroutine holds references to captured objects until it is finished or canceled. If your asynchronous framework does not support cancellation, the values you use inside the asynchronous block can be leaked. `asReference()` protects you from this.
## Using Anko
### Gradle-based project
Anko has a meta-dependency which plugs in all available features (including Commons, Layouts, SQLite) into your project at once:
```gradle
dependencies {
implementation "org.jetbrains.anko:anko:$anko_version"
}
```
Make sure that you have the ```$anko_version``` settled in your gradle file at the project level:
```
ext.anko_version='0.10.8'
```
If you only need some of the features, you can reference any of Anko's parts:
```gradle
dependencies {
// Anko Commons
implementation "org.jetbrains.anko:anko-commons:$anko_version"
// Anko Layouts
implementation "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// Coroutine listeners for Anko Layouts
implementation "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
implementation "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
// Anko SQLite
implementation "org.jetbrains.anko:anko-sqlite:$anko_version"
}
```
There are also a number of artifacts for the Android support libraries:
```gradle
dependencies {
// Appcompat-v7 (only Anko Commons)
implementation "org.jetbrains.anko:anko-appcompat-v7-commons:$anko_version"
// Appcompat-v7 (Anko Layouts)
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
implementation "org.jetbrains.anko:anko-coroutines:$anko_version"
// CardView-v7
implementation "org.jetbrains.anko:anko-cardview-v7:$anko_version"
// Design
implementation "org.jetbrains.anko:anko-design:$anko_version"
implementation "org.jetbrains.anko:anko-design-coroutines:$anko_version"
// GridLayout-v7
implementation "org.jetbrains.anko:anko-gridlayout-v7:$anko_version"
// Percent
implementation "org.jetbrains.anko:anko-percent:$anko_version"
// RecyclerView-v7
implementation "org.jetbrains.anko:anko-recyclerview-v7:$anko_version"
implementation "org.jetbrains.anko:anko-recyclerview-v7-coroutines:$anko_version"
// Support-v4 (only Anko Commons)
implementation "org.jetbrains.anko:anko-support-v4-commons:$anko_version"
// Support-v4 (Anko Layouts)
implementation "org.jetbrains.anko:anko-support-v4:$anko_version"
// ConstraintLayout
implementation "org.jetbrains.anko:anko-constraint-layout:$anko_version"
}
```
There is an [example project](https://github.com/kotlin/anko-example) showing how to include Anko library into your Android Gradle project.
### IntelliJ IDEA project
If your project is not based on Gradle, just attach the required JARs from the [jcenter repository](https://jcenter.bintray.com/org/jetbrains/anko/) as the library dependencies and that's it.
## Contributing
The best way to submit a patch is to send us a [pull request](https://help.github.com/articles/about-pull-requests/). Before submitting the pull request, make sure all existing tests are passing, and add the new test if it is required.
If you want to add new functionality, please file a new *proposal* issue first to make sure that it is not in progress already. If you have any questions, feel free to create a *question* issue.
Instructions for building Anko are available in the [Wiki](https://github.com/Kotlin/anko/wiki/Building-Anko).
================================================
FILE: anko/idea-plugin/attrs/build.gradle
================================================
apply plugin: 'kotlin'
sourceSets {
main {
java.srcDirs = ['src']
kotlin.srcDirs = ['src']
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile project(':ide:plugin-classpath')
}
================================================
FILE: anko/idea-plugin/attrs/src/org/jetbrains/kotlin/android/Attrs.kt
================================================
/*
* Copyright 2016 JetBrains s.r.o.
*
* 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 org.jetbrains.kotlin.android.attrs
import java.io.File
data class NameValue(
val name: String = "",
val value: String = "")
data class Attr(
val name: String = "",
val format: List<String> = emptyList(),
val flags: List<NameValue>? = null,
val enum: List<NameValue>? = null)
val NoAttr: Attr = Attr()
data class Styleable(
val name: String = "",
val attrs: List<Attr> = emptyList())
data class Attrs(
val free: List<Attr> = emptyList(),
val styleables: Map<String, Styleable> = emptyMap())
fun readResource(filename: String): String {
return Attrs::class.java.classLoader.getResourceAsStream(filename)?.reader()?.readText()
?: File(filename).readText()
}
================================================
FILE: anko/idea-plugin/build.gradle
================================================
subprojects {
apply plugin: 'kotlin'
sourceSets {
main {
java.srcDirs = ['src', 'resources']
kotlin.srcDirs = ['src']
resources.srcDirs = ['resources']
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
}
================================================
FILE: anko/idea-plugin/idea-runner/build.gradle
================================================
apply plugin: 'java'
dependencies {
compile fileTree(dir: new File(project.rootDir, "ideaSDK/lib"), include: ['*.jar'])
}
================================================
FILE: anko/idea-plugin/intentions/build.gradle
================================================
apply plugin: 'kotlin'
sourceSets {
main {
java.srcDirs = ['src']
kotlin.srcDirs = ['src']
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile project(':ide:plugin-classpath')
}
================================================
FILE: anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/AnkoIntention.kt
================================================
package org.jetbrains.anko.idea.intentions
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass
import org.jetbrains.kotlin.types.lowerIfFlexible
abstract class AnkoIntention<TElement : KtElement>(
elementType: Class<TElement>,
text: String,
familyName: String = text
) : SelfTargetingIntention<TElement>(elementType, text, familyName) {
final override fun isApplicableTo(element: TElement, caretOffset: Int): Boolean {
val file = element.containingFile as? KtFile ?: return false
val moduleDescriptor = file.findModuleDescriptor()
moduleDescriptor.resolveTopLevelClass(ANKO_INTERNALS_FQNAME, NoLookupLocation.FROM_IDE) ?: return false
return isApplicable(element, caretOffset)
}
abstract fun isApplicable(element: TElement, caretOffset: Int): Boolean
private fun isTypeOf(descriptor: ClassifierDescriptor, vararg fqName: String): Boolean {
val resolvedName = DescriptorUtils.getFqNameSafe(descriptor).asString()
return fqName.any { it == resolvedName }
}
protected fun KtCallExpression.isValueParameterTypeOf(
parameterIndex: Int,
resolvedCall: ResolvedCall<*>?,
vararg fqName: String
): Boolean {
val ctxArgumentDescriptor = (resolvedCall ?: getResolvedCall(analyze()))?.resultingDescriptor
?.valueParameters?.get(parameterIndex)?.type?.lowerIfFlexible()
?.constructor?.declarationDescriptor ?: return false
return isTypeOf(ctxArgumentDescriptor, *fqName)
}
protected fun KtCallExpression.isReceiverParameterTypeOf(
resolvedCall: ResolvedCall<*>?,
vararg fqName: String
): Boolean {
val receiverDescriptor = (resolvedCall ?: getResolvedCall(analyze()))?.resultingDescriptor
?.dispatchReceiverParameter?.type?.lowerIfFlexible()
?.constructor?.declarationDescriptor ?: return false
return isTypeOf(receiverDescriptor, *fqName)
}
protected val KtDotQualifiedExpression.receiver: KtExpression?
get() = receiverExpression
protected val KtDotQualifiedExpression.selector: KtExpression?
get() = selectorExpression
protected val KtBinaryExpressionWithTypeRHS.operation: KtSimpleNameExpression
get() = operationReference
protected inline fun <reified E : PsiElement> PsiElement?.require(name: String? = null, sub: E.() -> Boolean): Boolean {
return require<E>(name) && (this as E).sub()
}
inline fun require(cond: Boolean, sub: () -> Boolean): Boolean {
if (cond) sub()
return cond
}
protected inline fun <reified E : PsiElement> PsiElement?.require(name: String? = null): Boolean {
if (this !is E) return false
if (name != null && name != this.text) return false
return true
}
protected inline fun PsiElement?.requireCall(
functionName: String? = null,
argCount: Int? = null,
sub: KtCallExpression.() -> Boolean
): Boolean {
return requireCall(functionName, argCount) && (this as KtCallExpression).sub()
}
@Suppress("NOTHING_TO_INLINE")
protected inline fun PsiElement?.requireCall(functionName: String? = null, argCount: Int? = null): Boolean {
if (this !is KtCallExpression) return false
if (functionName != null && functionName != calleeExpression?.text) return false
if (argCount != null && argCount != valueArguments.size) return false
return true
}
abstract fun replaceWith(element: TElement, psiFactory: KtPsiFactory): NewElement?
final override fun applyTo(element: TElement, editor: Editor?) {
val project = editor?.project ?: return
val file = element.containingFile as? KtFile ?: return
val moduleDescriptor = file.findModuleDescriptor()
val resolutionFacade = file.getResolutionFacade()
val psiFactory = KtPsiFactory(project)
val (newElement, fqNamesToImport) = replaceWith(element, psiFactory) ?: return
val newExpression = newElement
ImportInsertHelper.getInstance(project).apply {
fqNamesToImport
.flatMap {
val fqName = FqName(if ('.' in it) it else "$ANKO_PACKAGE$it")
resolutionFacade.resolveImportReference(moduleDescriptor, fqName)
}
.forEach { if (it.importableFqName != null) importDescriptor(file, it) }
}
element.replace(newExpression)
}
private companion object {
private val ANKO_PACKAGE = "org.jetbrains.anko."
private val ANKO_INTERNALS_FQNAME = FqName("org.jetbrains.anko.internals.AnkoInternals")
}
}
object FqNames {
val ACTIVITY_FQNAME = "android.app.Activity"
val CONTEXT_FQNAME = "android.content.Context"
val VIEW_FQNAME = "android.view.View"
}
class NewElement(val element: KtExpression, vararg val newNames: String) {
operator fun component1() = element
operator fun component2() = newNames //fqName or name in anko package
}
abstract class A {
open fun test(a: CharSequence) {}
}
class B : A() {
override fun test(a: CharSequence) {}
}
================================================
FILE: anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/FindViewByIdIntention.kt
================================================
package org.jetbrains.anko.idea.intentions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
class FindViewByIdIntention : AnkoIntention<KtExpression>(
KtExpression::class.java,
"Simplify findViewById() with Anko"
) {
override fun isApplicable(element: KtExpression, caretOffset: Int): Boolean {
fun PsiElement?.requireFindViewByIdCall() = requireCall(FIND_VIEW_BY_ID, 1) {
val resolvedCall = getResolvedCall(analyze())
isValueParameterTypeOf(0, resolvedCall, "kotlin.Int")
&& isReceiverParameterTypeOf(resolvedCall, FqNames.ACTIVITY_FQNAME, FqNames.VIEW_FQNAME)
}
return element.require<KtBinaryExpressionWithTypeRHS>() {
operation.require<KtSimpleNameExpression>("as")
&& (left.requireFindViewByIdCall() || left.require<KtDotQualifiedExpression> {
selector.requireFindViewByIdCall()
})
}
}
override fun replaceWith(element: KtExpression, psiFactory: KtPsiFactory): NewElement? {
fun KtCallExpression.createElement(type: String, receiver: String? = null): NewElement {
val id = valueArguments[0].text
val receiverWithDot = if (receiver == null) "" else "$receiver."
val newExpression = psiFactory.createExpression("${receiverWithDot}find<$type>($id)")
return NewElement(newExpression, "find")
}
element.require<KtBinaryExpressionWithTypeRHS>() {
val type = right?.text ?: return null
left.requireCall(FIND_VIEW_BY_ID) {
return createElement(type)
}
left.require<KtDotQualifiedExpression> {
selector.requireCall(FIND_VIEW_BY_ID) {
return createElement(type, receiver?.text)
}
}
}
return null
}
private companion object {
val FIND_VIEW_BY_ID = "findViewById"
}
}
================================================
FILE: anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/ReplaceColorGrayOpaqueIntention.kt
================================================
package org.jetbrains.anko.idea.intentions
import org.jetbrains.kotlin.psi.*
class ReplaceColorGrayOpaqueIntention : AnkoIntention<KtExpression>(
KtExpression::class.java,
"Simplify color numeric literal with Anko"
) {
override fun isApplicable(element: KtExpression, caretOffset: Int): Boolean {
return element.require<KtDotQualifiedExpression> {
receiver.require<KtConstantExpression> { text.matches(COLOR_REGEX) } && selector.requireCall("toInt", 0)
} || element.require<KtConstantExpression> {
text.matches(COLOR_REGEX) && (this != (parent as? KtDotQualifiedExpression)?.receiver)
}
}
override fun replaceWith(element: KtExpression, psiFactory: KtPsiFactory): NewElement? {
fun createNewElement(colorText: String): NewElement? {
val color = ARGB(colorText)
if (color.isOpaque) {
return if (color.isTransparent) {
NewElement(psiFactory.createExpression("Color.TRANSPARENT"), ANDROID_GRAPHICS_COLOR)
} else if (color.color in COLORS) {
NewElement(psiFactory.createExpression("Color.${COLORS[color.color]}"), ANDROID_GRAPHICS_COLOR)
} else if (color.isGray) {
NewElement(psiFactory.createExpression(color.getGrayOpaque()), GRAY, OPAQUE)
} else {
return NewElement(psiFactory.createExpression(color.getOpaque()), OPAQUE)
}
}
return null
}
element.require<KtDotQualifiedExpression> {
receiver.require<KtConstantExpression> { text.matches(COLOR_REGEX) } && selector.requireCall("toInt", 0) {
return createNewElement(receiver!!.text)
}
} || element.require<KtConstantExpression> {
require(text.matches(COLOR_REGEX) && (this != (parent as? KtDotQualifiedExpression)?.receiver)) {
return createNewElement(text)
}
}
return null
}
private data class ARGB(val color: String, val a: String, val r: String, val g: String, val b: String) {
@JvmField val A = a.toUpperCase()
@JvmField val R = r.toUpperCase()
@JvmField val G = g.toUpperCase()
@JvmField val B = b.toUpperCase()
constructor(color: String) : this(color.drop(2).toUpperCase(), color.substring(2, 4), color.substring(4, 6),
color.substring(6, 8), color.substring(8, 10))
val isGray: Boolean
get() = R == G && G == B
val isTransparent: Boolean
get() = A == "00"
val isOpaque: Boolean
get() = A == "FF"
fun getGrayOpaque() = "0x$r.gray.opaque"
fun getOpaque() = "0x$r$g$b.opaque"
}
private companion object {
val COLOR_REGEX = "^0x[0-9A-Fa-f]{8}$".toRegex()
val GRAY = "gray"
val OPAQUE = "opaque"
val ANDROID_GRAPHICS_COLOR = "android.graphics.Color"
val COLORS = mapOf(
"FFFFFFFF" to "WHITE",
"FF000000" to "BLACK",
"FF888888" to "GRAY",
"FFCCCCCC" to "LTGRAY",
"FFFF0000" to "RED",
"FF00FF00" to "GREEN",
"FF0000FF" to "BLUE",
"FFFFFF00" to "YELLOW",
"FF00FFFF" to "CYAN",
"FFFF00FF" to "MAGENTA")
}
}
================================================
FILE: anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/ToastMakeTextShowIntention.kt
================================================
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* 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 org.jetbrains.anko.idea.intentions
import org.jetbrains.kotlin.psi.*
class ToastMakeTextShowIntention : AnkoIntention<KtExpression>(
KtExpression::class.java,
"Simplify Toast.makeText().show() with Anko"
) {
override fun isApplicable(element: KtExpression, caretOffset: Int): Boolean {
return element.require<KtDotQualifiedExpression> {
receiver.require<KtDotQualifiedExpression> {
receiver.require<KtReferenceExpression>("Toast")
&& selector.requireCall("makeText", 3) {
isLongToast() != null && isValueParameterTypeOf(0, null, FqNames.CONTEXT_FQNAME)
}
}
&& selector.requireCall("show", 0)
}
}
private fun KtCallExpression.isLongToast(): Boolean? {
return when (valueArguments[2].text) {
"Toast.LENGTH_SHORT", "LENGTH_SHORT" -> false
"Toast.LENGTH_LONG", "LENGTH_LONG" -> true
else -> null
}
}
override fun replaceWith(element: KtExpression, psiFactory: KtPsiFactory): NewElement? {
element.require<KtDotQualifiedExpression> {
receiver.require<KtDotQualifiedExpression> {
selector.requireCall("makeText") {
val args = valueArguments
val ctxArg = args[0].text
val textArg = args[1].text
val funName = if (isLongToast()!!) "longToast" else "toast"
val receiver = if (ctxArg == "this") "" else "$ctxArg."
val newExpression = psiFactory.createExpression("$receiver$funName($textArg)")
return NewElement(newExpression, funName)
}
}
}
return null
}
}
================================================
FILE: anko/idea-plugin/plugin-classpath/build.gradle
================================================
apply plugin: 'java'
dependencies {
compile fileTree(dir: new File(project.rootDir, "ideaSDK/lib"), include: ['*.jar'])
compile fileTree(dir: new File(project.rootDir, "ideaSDK/plugins/android/lib"), include: ['*.jar'])
compile fileTree(dir: new File(project.rootDir, "ideaSDK/plugins/Kotlin/lib"), include: ['kotlin-plugin.jar'])
}
================================================
FILE: anko/idea-plugin/preview/build.gradle
================================================
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'kotlin'
sourceSets {
main {
java.srcDirs = ['src']
kotlin.srcDirs = ['src']
}
}
configurations {
shadow
compile.extendsFrom shadow
}
dependencies {
compile project(':ide:plugin-classpath')
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
shadow "org.jetbrains.kotlinx:kotlinx.dom:$kotlinx_dom_version"
shadow(project(':ide:attrs')) {
transitive = false
}
shadow(project(':ide:intentions')) {
transitive = false
}
shadow(project(':ide:xml-converter')) {
transitive = false
}
}
shadowJar {
configurations = [project.configurations.shadow]
}
================================================
FILE: anko/idea-plugin/preview/resources/META-INF/plugin.xml
================================================
<idea-plugin>
<id>org.jetbrains.kotlin.android.dsl</id>
<name>Anko Support</name>
<description>Anko Android library support.</description>
<version>0.10.8</version>
<vendor url="https://www.jetbrains.com">JetBrains s.r.o.</vendor>
<idea-version since-build="171.1" until-build="183.*"/>
<depends>org.jetbrains.kotlin</depends>
<depends>org.jetbrains.android</depends>
<actions>
<action id="XmlConvertAction" class="org.jetbrains.kotlin.android.xmlconverter.ConvertAction"
text="Convert to Anko Layouts DSL" description="Convert XML layout to Anko Layouts code (Kotlin)">
<add-to-group group-id="CodeMenu" anchor="last"/>
</action>
</actions>
<extensions defaultExtensionNs="com.intellij">
<psi.treeChangePreprocessor
implementation="org.jetbrains.kotlin.android.dslpreview.SourceFileModificationTracker"/>
<intentionAction>
<className>org.jetbrains.anko.idea.intentions.ToastMakeTextShowIntention</className>
<category>Anko</category>
</intentionAction>
<intentionAction>
<className>org.jetbrains.anko.idea.intentions.FindViewByIdIntention</className>
<category>Anko</category>
</intentionAction>
<intentionAction>
<className>org.jetbrains.anko.idea.intentions.ReplaceColorGrayOpaqueIntention</className>
<category>Anko</category>
</intentionAction>
</extensions>
<extensions defaultExtensionNs="org.jetbrains.android.uipreview">
<viewLoaderExtension implementation="org.jetbrains.kotlin.android.dslpreview.AnkoViewLoaderExtension"/>
</extensions>
<project-components>
<component>
<implementation-class>org.jetbrains.kotlin.android.dslpreview.AnkoNlPreviewManager</implementation-class>
<skipForDefaultProject/>
<headless-implementation-class/>
</component>
</project-components>
</idea-plugin>
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/FindViewByIdIntention/after.kt.template
================================================
find<TextView>(R.id.name)
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/FindViewByIdIntention/before.kt.template
================================================
findViewById(R.id.name) as TextView
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/FindViewByIdIntention/description.html
================================================
<html>
<body>
This intention replaces 'findViewById() as T' method call with 'find<T>' that is available in Anko.
</body>
</html>
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/ReplaceColorGrayOpaqueIntention/after.kt.template
================================================
0xCC.gray.opaque
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/ReplaceColorGrayOpaqueIntention/before.kt.template
================================================
0xFFCCCCCC.toInt()
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/ReplaceColorGrayOpaqueIntention/description.html
================================================
<html>
<body>
This intention replaces numeric literals representing Android colors with ones that use Anko `gray` and `opaque` extension properties.
</body>
</html>
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/ToastMakeTextShowIntention/after.kt.template
================================================
toast("Message")
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/ToastMakeTextShowIntention/before.kt.template
================================================
Toast.makeText(this, "Message", Toast.LENGTH_SHORT).show()
================================================
FILE: anko/idea-plugin/preview/resources/intentionDescriptions/ToastMakeTextShowIntention/description.html
================================================
<html>
<body>
This intention replaces 'Toast.makeText(ctx, text, length).show()' method call with 'toast(text)' or 'longToast(text)' that is available in Anko.
</body>
</html>
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/AnkoNlPreviewManager.kt
================================================
package org.jetbrains.kotlin.android.dslpreview
import com.android.tools.idea.common.model.NlModel
import com.android.tools.idea.gradle.project.GradleProjectInfo
import com.android.tools.idea.gradle.project.build.invoker.GradleBuildInvoker
import com.android.tools.idea.project.AndroidProjectInfo
import com.android.tools.idea.uibuilder.editor.NlPreviewForm
import com.android.tools.idea.uibuilder.editor.NlPreviewManager
import com.intellij.ide.highlighter.XmlFileType
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.TextEditor
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.util.Computable
import com.intellij.openapi.wm.ToolWindow
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiFileFactory
import com.intellij.psi.xml.XmlFile
import com.intellij.util.Alarm
import org.jetbrains.android.uipreview.ViewLoaderExtension
import org.jetbrains.kotlin.idea.util.InfinitePeriodicalTask
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.awt.BorderLayout
import java.awt.event.ItemEvent
import javax.swing.ComboBoxModel
import javax.swing.DefaultComboBoxModel
import javax.swing.JPanel
class AnkoNlPreviewManager(
project: Project,
fileEditorManager: FileEditorManager?
) : NlPreviewManager(project, fileEditorManager), Disposable {
internal val classResolver = DslPreviewClassResolver(project)
internal var myActivityListModel: DefaultComboBoxModel<Any> = DefaultComboBoxModel()
private val viewLoaderExtension by lazy {
val area = Extensions.getArea(project)
if (area.hasExtensionPoint(ViewLoaderExtension.EP_NAME.name)) {
area.getExtensionPoint(ViewLoaderExtension.EP_NAME).extensions.firstIsInstanceOrNull<AnkoViewLoaderExtension>()
} else {
null
}
}
init {
ApplicationManager.getApplication().invokeLater {
val task = Computable { UpdateActivityNameTask(this) }
InfinitePeriodicalTask(1000, Alarm.ThreadToUse.SWING_THREAD, this@AnkoNlPreviewManager, task).start()
}
GradleBuildInvoker.getInstance(project).add {
ApplicationManager.getApplication().invokeLater {
refresh()
}
}
}
override fun getToolWindowId() = "Anko Layout Preview"
override fun getComponentName() = "AnkoNlPreviewManager"
public override fun getToolWindow() = super.getToolWindow()
override fun getBoundXmlFile(file: PsiFile?): XmlFile? {
if (file is XmlFile) {
return file
} else if (file !is KtFile) {
return null
}
val ankoPreviewFrom = previewForm as? AnkoPreviewForm ?: return null
val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return null
return if (refresh() || ankoPreviewFrom.xmlFile == null) {
generateStubXmlFile(module, file).also {
ankoPreviewFrom.xmlFile = it
}
} else {
ankoPreviewFrom.xmlFile
}
}
private fun getActiveTextEditor(): TextEditor? {
if (!ApplicationManager.getApplication().isReadAccessAllowed) {
return ApplicationManager.getApplication().runReadAction(Computable<TextEditor> { getActiveTextEditor() })
}
ApplicationManager.getApplication().assertReadAccessAllowed()
val fileEditors = fileEditorManager?.selectedEditors
if (fileEditors != null && fileEditors.isNotEmpty() && fileEditors[0] is TextEditor) {
val textEditor = fileEditors[0] as TextEditor
if (isApplicableEditor(textEditor, null)) {
return textEditor
}
}
return null
}
private fun generateStubXmlFile(module: Module, originalFile: KtFile): LayoutPsiFile {
val filename = "anko_preview.xml"
val content = """<?xml version="1.0" encoding="utf-8"?>
<__anko.preview.View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>"""
val psiFile = PsiFileFactory.getInstance(project).createFileFromText(filename, XmlFileType.INSTANCE, content)
return LayoutPsiFile(psiFile as XmlFile, originalFile, module)
}
private fun refresh(): Boolean {
val toolWindow: ToolWindow = toolWindow ?: return false
if (!toolWindow.isVisible) return false
val viewLoaderExtension = this.viewLoaderExtension ?: return false
val description = myActivityListModel.selectedItem as? PreviewClassDescription
?: classResolver.getOnCursorPreviewClassDescription()
if (description != null && viewLoaderExtension.description != description) {
viewLoaderExtension.description = description
return true
}
return false
}
override fun isApplicableEditor(textEditor: TextEditor, file: PsiFile?): Boolean {
val psiFile =
file ?: PsiDocumentManager.getInstance(project).getPsiFile(textEditor.editor.document) ?: return false
if (!GradleProjectInfo.getInstance(project).isBuildWithGradle &&
!AndroidProjectInfo.getInstance(project).isLegacyIdeaAndroidProject) {
return false
}
return psiFile is KtFile
}
private val fileEditorManager: FileEditorManager?
get() = with(NlPreviewManager::class.java.getDeclaredField("myFileEditorManager")) {
val oldAccessible = isAccessible
try {
isAccessible = true
get(this@AnkoNlPreviewManager) as? FileEditorManager
} finally {
isAccessible = oldAccessible
}
}
override fun initToolWindow() {
super.initToolWindow()
resolveAvailableClasses()
}
override fun createPreviewForm(): NlPreviewForm = AnkoPreviewForm(this)
internal fun updatePreview() {
getActiveTextEditor()?.let { notifyFileShown(it, true) }
}
fun resolveAvailableClasses() {
val activityClasses = classResolver
.getAncestors(DslPreviewClassResolver.ANKO_COMPONENT_CLASS_NAME)
.filter { classResolver.isClassApplicableForPreview(it.ktClass) }
with(myActivityListModel) {
selectedItem = null
removeAllElements()
val items = activityClasses
items.sortedBy { it.toString() }.forEach { addElement(it) }
}
}
override fun isUseInteractiveSelector() = false
override fun dispose() {}
}
class AnkoPreviewForm(private val ankoPreviewManager: AnkoNlPreviewManager) : NlPreviewForm(ankoPreviewManager) {
var xmlFile: XmlFile? = null
override fun setActiveModel(model: NlModel?) {
super.setActiveModel(model)
if (model != null) {
(this.toolbarComponent as? JPanel)?.let { addLayoutComboBox(it) }
}
}
private fun addLayoutComboBox(panel: JPanel) {
if (panel.components.firstIsInstanceOrNull<PreviewCandidateComboBox>() != null) {
return
}
val comboBox = PreviewCandidateComboBox(ankoPreviewManager.myActivityListModel)
comboBox.addItemListener { itemEvent ->
if (itemEvent.stateChange == ItemEvent.SELECTED) {
ankoPreviewManager.updatePreview()
}
}
panel.add(comboBox, BorderLayout.SOUTH)
}
}
class PreviewCandidateComboBox(model: ComboBoxModel<Any>) : ComboBox<Any>(model)
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/AnkoViewLoaderExtension.kt
================================================
package org.jetbrains.kotlin.android.dslpreview
import org.jetbrains.android.uipreview.ViewLoaderExtension
import org.jetbrains.org.objectweb.asm.ClassWriter
import org.jetbrains.org.objectweb.asm.Opcodes
import java.net.URL
import java.net.URLClassLoader
class AnkoViewLoaderExtension : ViewLoaderExtension {
internal var description: PreviewClassDescription? = null
override fun loadClass(className: String, delegateClassLoader: ClassLoader): Class<*>? {
val description = this.description
if (className == "__anko.preview.View" && description != null) {
val clazz = generateStubViewClass(delegateClassLoader, description)
if (clazz != null) return clazz
}
return null
}
private fun generateStubViewClass(delegateClassLoader: ClassLoader, description: PreviewClassDescription): Class<*>? {
val uiInternalName = description.internalName
val viewFqName = "__anko.preview.View"
val viewInternalName = viewFqName.replace('.', '/')
val superClassInternalName = "android/widget/FrameLayout"
val bytes = with (ClassWriter(0)) {
visit(49, Opcodes.ACC_PUBLIC, viewInternalName, null, superClassInternalName, null)
visitSource(null, null)
fun visitConstructor(vararg params: String) {
val signature = "(${params.joinToString("")})V"
with (visitMethod(Opcodes.ACC_PUBLIC, "<init>", signature, null, null)) {
visitVarInsn(Opcodes.ALOAD, 0)
params.forEachIndexed { i, param ->
when (param) {
"I" -> visitVarInsn(Opcodes.ILOAD, i + 1)
else -> visitVarInsn(Opcodes.ALOAD, i + 1)
}
}
visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "<init>", signature)
visitVarInsn(Opcodes.ALOAD, 0)
visitMethodInsn(Opcodes.INVOKEVIRTUAL, viewInternalName, "init", "()V")
visitInsn(Opcodes.RETURN)
visitMaxs(1 + params.size /*max stack*/, 1 + params.size /*max locals*/)
visitEnd()
}
}
visitConstructor("Landroid/content/Context;")
visitConstructor("Landroid/content/Context;", "Landroid/util/AttributeSet;")
visitConstructor("Landroid/content/Context;", "Landroid/util/AttributeSet;", "I")
/*
private fun init() {
addView(MainActivityUi().createView(AnkoContext.create(getContext())))
}
*/
with (visitMethod(Opcodes.ACC_PRIVATE, "init", "()V", null, null)) {
visitVarInsn(Opcodes.ALOAD, 0)
visitTypeInsn(Opcodes.NEW, uiInternalName)
visitInsn(Opcodes.DUP)
visitMethodInsn(Opcodes.INVOKESPECIAL, uiInternalName, "<init>", "()V")
visitFieldInsn(Opcodes.GETSTATIC, "org/jetbrains/anko/AnkoContext", "Companion",
"Lorg/jetbrains/anko/AnkoContext" + '$' + "Companion;")
visitVarInsn(Opcodes.ALOAD, 0)
visitMethodInsn(Opcodes.INVOKEVIRTUAL, viewInternalName, "getContext", "()Landroid/content/Context;")
visitInsn(Opcodes.ICONST_0)
visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/jetbrains/anko/AnkoContext" + '$' + "Companion", "create",
"(Landroid/content/Context;Z)Lorg/jetbrains/anko/AnkoContext;")
visitMethodInsn(Opcodes.INVOKEVIRTUAL, uiInternalName, "createView",
"(Lorg/jetbrains/anko/AnkoContext;)Landroid/view/View;")
visitMethodInsn(Opcodes.INVOKEVIRTUAL, viewInternalName, "addView", "(Landroid/view/View;)V")
visitInsn(Opcodes.RETURN)
visitMaxs(5 /*max stack*/, 1 /*max locals*/)
visitEnd()
}
visitEnd()
toByteArray()
}
return loadClass(viewFqName, bytes, delegateClassLoader)
}
private fun loadClass(fqName: String, bytes: ByteArray, delegateClassLoader: ClassLoader): Class<*>? {
class ByteClassLoader(
urls: Array<out URL>?,
parent: ClassLoader?,
private var extraClasses: MutableMap<String, ByteArray>
) : URLClassLoader(urls, parent) {
override fun findClass(name: String): Class<*>? {
return extraClasses.remove(name)?.let {
defineClass(name, it, 0, it.size)
} ?: super.findClass(name)
}
}
try {
val classLoader = ByteClassLoader(emptyArray(), delegateClassLoader, hashMapOf(fqName to bytes))
return Class.forName(fqName, false, classLoader)
} catch (e: Throwable) {
return null
}
}
}
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/DslPreviewClassResolver.kt
================================================
package org.jetbrains.kotlin.android.dslpreview
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.IndexNotReadyException
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Computable
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.ClassInheritorsSearch
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.codegen.ClassBuilderMode
import org.jetbrains.kotlin.codegen.state.IncompatibleClassTracker
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtConstructor
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.types.typeUtil.supertypes
import java.util.*
internal class DslPreviewClassResolver(private val project: Project) {
private fun getKtClass(psiElement: PsiElement?): KtClass? {
return if (psiElement is KtLightElement<*, *>) {
getKtClass(psiElement.kotlinOrigin)
} else if (psiElement is KtClass && !psiElement.isEnum() && !psiElement.isInterface() &&
!psiElement.isAnnotation() && !psiElement.isSealed()) {
psiElement
} else {
val parent = psiElement?.parent ?: return null
return getKtClass(parent)
}
}
fun getOnCursorPreviewClassDescription(): PreviewClassDescription? {
val editor = ApplicationManager.getApplication().runReadAction(Computable {
FileEditorManager.getInstance(project).selectedTextEditor
}) ?: return null
val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.document)
if (psiFile !is KtFile || editor !is EditorEx) return null
val selectionStart = editor.caretModel.primaryCaret.selectionStart
val psiElement = psiFile.findElementAt(selectionStart) ?: return null
val cacheService = KotlinCacheService.getInstance(project)
return resolveClassDescription(psiElement, cacheService)
}
fun getAncestors(baseClassName: String): Collection<PreviewClassDescription> {
if (DumbService.isDumb(project)) return emptyList()
val baseClasses = JavaPsiFacade.getInstance(project)
.findClasses(baseClassName, GlobalSearchScope.allScope(project))
if (baseClasses.isEmpty()) return emptyList()
return try {
val cacheService = KotlinCacheService.getInstance(project)
val previewClasses = ArrayList<PreviewClassDescription>(0)
for (element in ClassInheritorsSearch.search(baseClasses[0]).findAll()) {
resolveClassDescription(element, cacheService)?.let { previewClasses += it }
}
previewClasses
}
catch (e: IndexNotReadyException) {
emptyList()
}
}
private fun isZeroParameterConstructor(constructor: KtConstructor<*>?): Boolean {
if (constructor == null) return false
val parameters = constructor.getValueParameters()
return parameters.isEmpty() || parameters.all { it.hasDefaultValue() }
}
fun isClassApplicableForPreview(clazz: KtClass): Boolean {
val primaryConstructor = clazz.primaryConstructor
val secondaryConstructors = clazz.secondaryConstructors
return (primaryConstructor == null && secondaryConstructors.isEmpty())
|| isZeroParameterConstructor(primaryConstructor)
|| secondaryConstructors.any(this::isZeroParameterConstructor)
}
fun resolveClassDescription(element: PsiElement, cacheService: KotlinCacheService): PreviewClassDescription? {
if (DumbService.isDumb(element.project)) return null
val ktClass = getKtClass(element) ?: return null
if (!isClassApplicableForPreview(ktClass)) return null
val resolveSession = cacheService.getResolutionFacade(listOf(ktClass))
.getFrontendService(ResolveSession::class.java)
val classDescriptor = resolveSession.getClassDescriptor(ktClass, NoLookupLocation.FROM_IDE)
if (!classDescriptor.defaultType.supertypes().any {
val fqName = it.constructor.declarationDescriptor?.fqNameUnsafe?.asString() ?: ""
fqName == ANKO_COMPONENT_CLASS_NAME
}) {
return null
}
val typeMapper = createTypeMapper(resolveSession.bindingContext)
return PreviewClassDescription(ktClass, classDescriptor.fqNameSafe.asString(),
typeMapper.mapType(classDescriptor).internalName)
}
companion object {
val ANKO_COMPONENT_CLASS_NAME = "org.jetbrains.anko.AnkoComponent"
private fun createTypeMapper(bindingContext: BindingContext): KotlinTypeMapper {
// TODO: Add stable constructor to KotlinTypeMapper
val typeMapperConstructor7 = KotlinTypeMapper::class.java.constructors.find { it.parameterCount == 7 }
if (typeMapperConstructor7 != null) {
if (typeMapperConstructor7.parameterTypes[4].isAssignableFrom(JvmTarget::class.java))
return typeMapperConstructor7
.newInstance(
bindingContext,
ClassBuilderMode.LIGHT_CLASSES,
IncompatibleClassTracker.DoNothing,
"main",
JvmTarget.DEFAULT,
false,
false) as KotlinTypeMapper
else
return typeMapperConstructor7
.newInstance(
bindingContext,
ClassBuilderMode.LIGHT_CLASSES,
IncompatibleClassTracker.DoNothing,
"main",
false,
false,
false) as KotlinTypeMapper
}
val typeMapperConstructor6 = KotlinTypeMapper::class.java.constructors.find { it.parameterCount == 6 }
if (typeMapperConstructor6 != null) {
return typeMapperConstructor6
.newInstance(
bindingContext,
ClassBuilderMode.LIGHT_CLASSES,
IncompatibleClassTracker.DoNothing,
"main",
false,
false) as KotlinTypeMapper
}
return KotlinTypeMapper(
bindingContext,
ClassBuilderMode.LIGHT_CLASSES,
IncompatibleClassTracker.DoNothing,
"main",
false)
}
}
}
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/LayoutPsiFile.kt
================================================
/*
* Copyright 2016 JetBrains s.r.o.
*
* 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.
*/
@file:Suppress("UNREACHABLE_CODE", "OverridingDeprecatedMember", "DEPRECATION")
package org.jetbrains.kotlin.android.dslpreview
import com.intellij.injected.editor.DocumentWindow
import com.intellij.injected.editor.VirtualFileWindow
import com.intellij.lang.ASTNode
import com.intellij.lang.FileASTNode
import com.intellij.lang.Language
import com.intellij.navigation.ItemPresentation
import com.intellij.openapi.Disposable
import com.intellij.openapi.editor.Document
import com.intellij.openapi.editor.RangeMarker
import com.intellij.openapi.editor.event.DocumentListener
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Iconable.IconFlags
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.Segment
import com.intellij.openapi.util.TextRange
import com.intellij.openapi.util.UserDataHolderBase
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.*
import com.intellij.psi.impl.PsiDocumentManagerImpl
import com.intellij.psi.impl.PsiManagerEx
import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.PsiElementProcessor
import com.intellij.psi.search.SearchScope
import com.intellij.psi.xml.XmlFile
import com.intellij.testFramework.LightVirtualFile
import com.intellij.util.IncorrectOperationException
import org.jetbrains.android.facet.AndroidFacet
import org.jetbrains.android.resourceManagers.ModuleResourceManagers
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.psi.KtFile
import java.beans.PropertyChangeListener
import javax.swing.Icon
/*
Reason for these stubs:
Android Preview checks that the xml file is placed inside "layout-*" directory.
TODO: Implement some kind of stable api in Android plugin for this
*/
class LayoutPsiFile(private val myPsiFile: XmlFile, val originalFile: KtFile, module: Module) : XmlFile {
private val myPsiDirectory: PsiDirectory = LayoutPsiDirectory(module)
private val myViewProvider: FileViewProvider = object : FileViewProvider by myPsiFile.viewProvider {
override fun getPsi(p0: Language): PsiFile = this@LayoutPsiFile
}
private val myVirtualFile: VirtualFile by lazy {
LayoutLightVirtualFile(myPsiFile.name, myPsiFile.text).also { virtualFile ->
(myPsiFile.manager as? PsiManagerEx)?.fileManager?.setViewProvider(virtualFile, myViewProvider)
}
}
override fun getParent() = myPsiDirectory
override fun getDocument() = myPsiFile.document
override fun getRootTag() = myPsiFile.rootTag
override fun getVirtualFile(): VirtualFile? = myVirtualFile
override fun getContainingDirectory() = myPsiDirectory
override fun getModificationStamp() = myPsiFile.modificationStamp
override fun getOriginalFile() = this
override fun getFileType() = myPsiFile.fileType
override fun getViewProvider() = myViewProvider
override fun getNode(): FileASTNode? = myPsiFile.node
override fun getPsiRoots(): Array<PsiFile> = myPsiFile.psiRoots
override fun subtreeChanged() = myPsiFile.subtreeChanged()
override fun isDirectory() = myPsiFile.isDirectory
override fun getName() = myPsiFile.name
override fun checkSetName(s: String) = myPsiFile.checkSetName(s)
override fun setName(s: String): PsiElement = myPsiFile.setName(s)
override fun getProject() = myPsiFile.project
override fun getLanguage() = myPsiFile.language
override fun getManager(): PsiManager? = myPsiFile.manager
override fun getChildren(): Array<PsiElement> = myPsiFile.children
override fun getFirstChild(): PsiElement? = myPsiFile.firstChild
override fun getLastChild(): PsiElement? = myPsiFile.lastChild
override fun getNextSibling(): PsiElement? = myPsiFile.nextSibling
override fun getPrevSibling(): PsiElement? = myPsiFile.prevSibling
override fun getContainingFile(): PsiFile? = myPsiFile.containingFile
override fun getTextRange(): TextRange? = myPsiFile.textRange
override fun getStartOffsetInParent() = myPsiFile.startOffsetInParent
override fun getTextLength() = myPsiFile.textLength
override fun findElementAt(i: Int) = myPsiFile.findElementAt(i)
override fun findReferenceAt(i: Int) = myPsiFile.findReferenceAt(i)
override fun getTextOffset() = myPsiFile.textOffset
override fun getText(): String? = myPsiFile.text
override fun textToCharArray() = myPsiFile.textToCharArray()
override fun getNavigationElement(): PsiElement? = myPsiFile.navigationElement
override fun getOriginalElement(): PsiElement? = myPsiFile.originalElement
override fun textMatches(charSequence: CharSequence) = myPsiFile.textMatches(charSequence)
override fun textMatches(psiElement: PsiElement) = myPsiFile.textMatches(psiElement)
override fun textContains(c: Char) = myPsiFile.textContains(c)
override fun accept(psiElementVisitor: PsiElementVisitor) = myPsiFile.accept(psiElementVisitor)
override fun acceptChildren(psiElementVisitor: PsiElementVisitor) = myPsiFile.acceptChildren(psiElementVisitor)
override fun copy(): PsiElement? = myPsiFile.copy()
override fun add(psiElement: PsiElement): PsiElement? = myPsiFile.add(psiElement)
override fun processChildren(psiFileSystemItemPsiElementProcessor: PsiElementProcessor<PsiFileSystemItem>?): Boolean {
return myPsiFile.processChildren(psiFileSystemItemPsiElementProcessor)
}
override fun addBefore(psiElement: PsiElement, psiElement2: PsiElement?): PsiElement? =
myPsiFile.addBefore(psiElement, psiElement2)
override fun addAfter(psiElement: PsiElement, psiElement2: PsiElement?): PsiElement? =
myPsiFile.addAfter(psiElement, psiElement2)
override fun checkAdd(psiElement: PsiElement) = myPsiFile.checkAdd(psiElement)
override fun addRange(psiElement: PsiElement, psiElement2: PsiElement): PsiElement? {
return myPsiFile.addRange(psiElement, psiElement2)
}
override fun addRangeBefore(psiElement: PsiElement, psiElement2: PsiElement, psiElement3: PsiElement): PsiElement? {
return myPsiFile.addRangeBefore(psiElement, psiElement2, psiElement3)
}
override fun addRangeAfter(psiElement: PsiElement, psiElement2: PsiElement, psiElement3: PsiElement): PsiElement? {
return myPsiFile.addRangeAfter(psiElement, psiElement2, psiElement3)
}
override fun delete() = myPsiFile.delete()
override fun checkDelete() = myPsiFile.checkDelete()
override fun deleteChildRange(psiElement: PsiElement, psiElement2: PsiElement)
= myPsiFile.deleteChildRange(psiElement, psiElement2)
override fun replace(psiElement: PsiElement): PsiElement? = myPsiFile.replace(psiElement)
override fun isValid() = myPsiFile.isValid
override fun isWritable() = myPsiFile.isWritable
override fun getReference() = myPsiFile.reference
override fun getReferences(): Array<PsiReference> = myPsiFile.references
override fun <T> getCopyableUserData(tKey: Key<T>) = myPsiFile.getCopyableUserData(tKey)
override fun <T> putCopyableUserData(tKey: Key<T>, t: T?) = myPsiFile.putCopyableUserData(tKey, t)
override fun processDeclarations(
psiScopeProcessor: PsiScopeProcessor,
resolveState: ResolveState,
psiElement: PsiElement?,
psiElement2: PsiElement
): Boolean {
return myPsiFile.processDeclarations(psiScopeProcessor, resolveState, psiElement, psiElement2)
}
override fun getContext() = myPsiFile.context
override fun isPhysical() = myPsiFile.isPhysical
override fun getResolveScope() = myPsiFile.resolveScope
override fun getUseScope() = myPsiFile.useScope
override fun toString() = myPsiFile.toString()
override fun isEquivalentTo(psiElement: PsiElement) = myPsiFile.isEquivalentTo(psiElement)
override fun <T> getUserData(tKey: Key<T>) = myPsiFile.getUserData(tKey)
override fun <T> putUserData(tKey: Key<T>, t: T?) = myPsiFile.putUserData(tKey, t)
override fun getIcon(i: Int): Icon = myPsiFile.getIcon(i)
override fun getPresentation() = myPsiFile.presentation
override fun navigate(b: Boolean) = myPsiFile.navigate(b)
override fun canNavigate() = myPsiFile.canNavigate()
override fun canNavigateToSource() = myPsiFile.canNavigateToSource()
override fun getFileResolveScope() = myPsiFile.fileResolveScope
override fun ignoreReferencedElementAccessibility() = myPsiFile.ignoreReferencedElementAccessibility()
override fun processElements(psiElementProcessor: PsiElementProcessor<PsiElement>, psiElement: PsiElement): Boolean {
return myPsiFile.processElements(psiElementProcessor, psiElement)
}
private class LayoutPsiDirectory(val module: Module) : PsiDirectory {
private val parentDir by lazy {
val facet = AndroidFacet.getInstance(module) ?: return@lazy null
val dir = ModuleResourceManagers.getInstance(facet).localResourceManager.resourceDirs
.firstOrNull() ?: return@lazy null
PsiManager.getInstance(module.project).findDirectory(dir)
}
override fun getName(): String {
return "layout"
}
override fun getVirtualFile(): VirtualFile {
return null!!
}
@Throws(IncorrectOperationException::class)
override fun setName(s: String): PsiElement {
return null!!
}
override fun getParentDirectory(): PsiDirectory? = parentDir
override fun getParent() = parentDir
override fun getSubdirectories(): Array<PsiDirectory?> {
return arrayOfNulls(0)
}
override fun getFiles(): Array<PsiFile?> {
return arrayOfNulls(0)
}
override fun findSubdirectory(s: String): PsiDirectory? {
return null
}
override fun findFile(@NonNls s: String): PsiFile? {
return null
}
@Throws(IncorrectOperationException::class)
override fun createSubdirectory(s: String): PsiDirectory {
return null!!
}
@Throws(IncorrectOperationException::class)
override fun checkCreateSubdirectory(s: String) {
}
@Throws(IncorrectOperationException::class)
override fun createFile(@NonNls s: String): PsiFile {
return null!!
}
@Throws(IncorrectOperationException::class)
override fun copyFileFrom(s: String, psiFile: PsiFile): PsiFile {
return null!!
}
@Throws(IncorrectOperationException::class)
override fun checkCreateFile(s: String) {
}
override fun isDirectory(): Boolean {
return true
}
override fun processChildren(psiFileSystemItemPsiElementProcessor: PsiElementProcessor<PsiFileSystemItem>): Boolean {
return false
}
override fun getPresentation(): ItemPresentation? {
return null
}
override fun navigate(b: Boolean) {
}
override fun canNavigate(): Boolean {
return false
}
override fun canNavigateToSource(): Boolean {
return false
}
@Throws(IncorrectOperationException::class)
override fun checkSetName(s: String) {
}
@Throws(PsiInvalidElementAccessException::class)
override fun getProject(): Project {
return null!!
}
override fun getLanguage(): Language {
return null!!
}
override fun getManager(): PsiManager? {
return null
}
override fun getChildren(): Array<PsiElement?> {
return arrayOfNulls(0)
}
override fun getFirstChild(): PsiElement? {
return null
}
override fun getLastChild(): PsiElement? {
return null
}
override fun getNextSibling(): PsiElement? {
return null
}
override fun getPrevSibling(): PsiElement? {
return null
}
@Throws(PsiInvalidElementAccessException::class)
override fun getContainingFile(): PsiFile? {
return null
}
override fun getTextRange(): TextRange? {
return null
}
override fun getStartOffsetInParent(): Int {
return 0
}
override fun getTextLength(): Int {
return 0
}
override fun findElementAt(i: Int): PsiElement? {
return null
}
override fun findReferenceAt(i: Int): PsiReference? {
return null
}
override fun getTextOffset(): Int {
return 0
}
override fun getText(): String? {
return null
}
override fun textToCharArray(): CharArray {
return CharArray(0)
}
override fun getNavigationElement(): PsiElement? {
return null
}
override fun getOriginalElement(): PsiElement? {
return null
}
override fun textMatches(@NonNls charSequence: CharSequence): Boolean {
return false
}
override fun textMatches(psiElement: PsiElement): Boolean {
return false
}
override fun textContains(c: Char): Boolean {
return false
}
override fun accept(psiElementVisitor: PsiElementVisitor) {
}
override fun acceptChildren(psiElementVisitor: PsiElementVisitor) {
}
override fun copy(): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun add(psiElement: PsiElement): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun addBefore(psiElement: PsiElement, psiElement2: PsiElement?): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun addAfter(psiElement: PsiElement, psiElement2: PsiElement?): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun checkAdd(psiElement: PsiElement) {
}
@Throws(IncorrectOperationException::class)
override fun addRange(psiElement: PsiElement, psiElement2: PsiElement): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun addRangeBefore(psiElement: PsiElement, psiElement2: PsiElement, psiElement3: PsiElement): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun addRangeAfter(psiElement: PsiElement, psiElement2: PsiElement, psiElement3: PsiElement): PsiElement? {
return null
}
@Throws(IncorrectOperationException::class)
override fun delete() {
}
@Throws(IncorrectOperationException::class)
override fun checkDelete() {
}
@Throws(IncorrectOperationException::class)
override fun deleteChildRange(psiElement: PsiElement, psiElement2: PsiElement) {
}
@Throws(IncorrectOperationException::class)
override fun replace(psiElement: PsiElement): PsiElement? {
return null
}
override fun isValid(): Boolean {
return false
}
override fun isWritable(): Boolean {
return false
}
override fun getReference(): PsiReference? {
return null
}
override fun getReferences(): Array<PsiReference?> {
return arrayOfNulls(0)
}
override fun <T> getCopyableUserData(tKey: Key<T>): T? {
return null
}
override fun <T> putCopyableUserData(tKey: Key<T>, t: T?) {
}
override fun processDeclarations(
psiScopeProcessor: PsiScopeProcessor,
resolveState: ResolveState,
psiElement: PsiElement?,
psiElement2: PsiElement
): Boolean {
return false
}
override fun getContext(): PsiElement? {
return null
}
override fun isPhysical(): Boolean {
return false
}
override fun getResolveScope(): GlobalSearchScope {
return null!!
}
override fun getUseScope(): SearchScope {
return null!!
}
override fun getNode(): ASTNode? {
return null
}
override fun isEquivalentTo(psiElement: PsiElement): Boolean {
return false
}
override fun getIcon(@IconFlags i: Int): Icon? {
return null
}
override fun <T> getUserData(tKey: Key<T>): T? {
return null
}
override fun <T> putUserData(tKey: Key<T>, t: T?) {
}
}
inner class LayoutLightVirtualFile(name: String, text: String) : LightVirtualFile(name, text), VirtualFileWindow {
/*
* This hack is needed to force PsiDocumentManager return our LayoutPsiFile for LayoutLightVirtualFile
*/
override fun getDocumentWindow(): DocumentWindow {
val documentManager = PsiDocumentManager.getInstance(project)
val documentWindowStub = object : UserDataHolderBase(), DocumentWindow {
override fun hostToInjectedUnescaped(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun isOneLine(): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun removeDocumentListener(p0: DocumentListener) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun deleteString(p0: Int, p1: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getTextLength(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getHostRanges(): Array<Segment> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getText(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getText(p0: TextRange): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getLineStartOffset(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun createRangeMarker(p0: Int, p1: Int): RangeMarker {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun createRangeMarker(p0: Int, p1: Int, p2: Boolean): RangeMarker {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun createRangeMarker(p0: TextRange): RangeMarker {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun insertString(p0: Int, p1: CharSequence) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun setText(p0: CharSequence) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun startGuardedBlockChecking() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getHostRange(p0: Int): TextRange? {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getChars(): CharArray {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getLineCount(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun stopGuardedBlockChecking() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun areRangesEqual(p0: DocumentWindow): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun isValid(): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun removeGuardedBlock(p0: RangeMarker) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getLineSeparatorLength(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun injectedToHostLine(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun addPropertyChangeListener(p0: PropertyChangeListener) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun createGuardedBlock(p0: Int, p1: Int): RangeMarker {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun replaceString(p0: Int, p1: Int, p2: CharSequence) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getModificationStamp(): Long {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun setReadOnly(p0: Boolean) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun intersectWithEditable(p0: TextRange): TextRange? {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun fireReadOnlyModificationAttempt() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getLineNumber(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun setCyclicBufferSize(p0: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun hostToInjected(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getImmutableCharSequence(): CharSequence {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getOffsetGuard(p0: Int): RangeMarker? {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun isWritable(): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getLineEndOffset(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getCharsSequence(): CharSequence {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getDelegate(): Document {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun containsRange(p0: Int, p1: Int): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun addDocumentListener(p0: DocumentListener) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun addDocumentListener(p0: DocumentListener, p1: Disposable) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun removePropertyChangeListener(p0: PropertyChangeListener) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun getRangeGuard(p0: Int, p1: Int): RangeMarker? {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun injectedToHost(p0: Int): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun injectedToHost(p0: TextRange): TextRange {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
(documentManager as PsiDocumentManagerImpl).associatePsi(documentWindowStub, this@LayoutPsiFile)
return documentWindowStub
}
override fun getDelegate(): VirtualFile = this@LayoutPsiFile.originalFile.virtualFile
override fun getParent() = object : LightVirtualFile("layout") {
override fun isDirectory() = true
}
}
}
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/PreviewClassDescription.kt
================================================
/*
* Copyright 2016 JetBrains s.r.o.
*
* 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 org.jetbrains.kotlin.android.dslpreview
import org.jetbrains.kotlin.psi.KtClass
class PreviewClassDescription(val ktClass: KtClass, val fqName: String, val internalName: String) {
val packageName = fqName.substringBeforeLast('.')
val name = fqName.substringAfterLast('.')
override fun toString(): String {
return if (packageName.isNotBlank())
"<html>$packageName.<b>$name</b></html>"
else
"<html><b>$name</b></html>"
}
override fun equals(other: Any?): Boolean{
if (this === other) return true
if (other?.javaClass != javaClass) return false
other as PreviewClassDescription
if (fqName != other.fqName) return false
if (internalName != other.internalName) return false
return true
}
override fun hashCode(): Int{
var result = fqName.hashCode()
result += 31 * result + internalName.hashCode()
return result
}
}
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/SourceFileModificationTracker.kt
================================================
/*
* Copyright 2016 JetBrains s.r.o.
*
* 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 org.jetbrains.kotlin.android.dslpreview
import com.intellij.openapi.util.ModificationTracker
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.impl.PsiTreeChangeEventImpl
import com.intellij.psi.impl.PsiTreeChangePreprocessor
import org.jetbrains.kotlin.psi.KtFile
import java.util.concurrent.atomic.AtomicLong
class SourceFileModificationTracker : PsiTreeChangePreprocessor, ModificationTracker {
private val counter = AtomicLong()
companion object {
private val HANDLED_EVENTS = setOf(
PsiTreeChangeEventImpl.PsiEventType.CHILD_ADDED,
PsiTreeChangeEventImpl.PsiEventType.CHILD_MOVED,
PsiTreeChangeEventImpl.PsiEventType.CHILD_REMOVED,
PsiTreeChangeEventImpl.PsiEventType.CHILD_REPLACED,
PsiTreeChangeEventImpl.PsiEventType.CHILDREN_CHANGED)
}
override fun treeChanged(event: PsiTreeChangeEventImpl) {
if (event.code in HANDLED_EVENTS) {
val file = event.file
if (file is KtFile || file is PsiJavaFile) counter.incrementAndGet()
}
}
override fun getModificationCount() = counter.get()
}
================================================
FILE: anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/UpdateActivityNameTask.kt
================================================
package org.jetbrains.kotlin.android.dslpreview
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.wm.ToolWindow
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.idea.internal.Location
import org.jetbrains.kotlin.idea.util.LongRunningReadTask
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import javax.swing.DefaultComboBoxModel
class UpdateActivityNameTask(
val previewManager: AnkoNlPreviewManager
) : LongRunningReadTask<PsiElement, PreviewClassDescription>() {
override fun prepareRequestInfo(): PsiElement? = with (previewManager) {
val toolWindow: ToolWindow = toolWindow ?: return null
if (!toolWindow.isVisible) return null
val editor = FileEditorManager.getInstance(project).selectedTextEditor
val location = Location.fromEditor(editor, project)
if (location.editor == null) return null
val file = location.kFile
if (file == null ||
!ProjectRootsUtil.isInProjectSource(file))
return null
val psiElement = file.findElementAt(location.startOffset) ?: return null
return psiElement
}
override fun cloneRequestInfo(requestInfo: PsiElement): PsiElement {
val newRequestInfo = super.cloneRequestInfo(requestInfo)
assert(requestInfo == newRequestInfo) { "cloneRequestInfo should generate same location object" }
return newRequestInfo
}
override fun hideResultOnInvalidLocation() {
}
override fun processRequest(element: PsiElement): PreviewClassDescription? {
val cacheService = KotlinCacheService.getInstance(previewManager.project)
return previewManager.classResolver.resolveClassDescription(element, cacheService)
}
private fun indexOf(model: DefaultComboBoxModel<Any>, description: PreviewClassDescription): Int? {
for (i in 0..(model.size - 1)) {
val item = model.getElementAt(i) as? PreviewClassDescription ?: continue
if (item == description) return i
}
return null
}
private fun setSelection(model: DefaultComboBoxModel<Any>, description: PreviewClassDescription): Boolean {
val index = indexOf(model, description) ?: return false
model.selectedItem = model.getElementAt(index)
return true
}
override fun onResultReady(requestInfo: PsiElement, description: PreviewClassDescription?) = with (previewManager) {
if (description == null) return
val model = myActivityListModel
if (!setSelection(model, description)) {
resolveAvailableClasses()
setSelection(model, description)
}
}
}
================================================
FILE: anko/idea-plugin/xml-converter/build.gradle
================================================
apply plugin: 'kotlin'
sourceSets {
main {
java.srcDirs = ['src']
kotlin.srcDirs = ['src']
}
test {
java.srcDirs = ['test']
kotlin.srcDirs = ['test']
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlinx:kotlinx.dom:$kotlinx_dom_version"
compile project(':ide:plugin-classpath')
compile project(':ide:attrs')
}
================================================
FILE: anko/idea-plugin/xml-converter/resources/attrs.json
================================================
{
"free": [
{
"name": "textSize",
"format": [
"dimension"
]
},
{
"name": "fontFamily",
"format": [
"string"
]
},
{
"name": "typeface",
"format": [
"enum"
],
"enum": [
{
"name": "normal",
"value": "0"
},
{
"name": "sans",
"value": "1"
},
{
"name": "serif",
"value": "2"
},
{
"name": "monospace",
"value": "3"
}
]
},
{
"name": "textStyle",
"format": [
"flags"
],
"flags": [
{
"name": "normal",
"value": "0"
},
{
"name": "bold",
"value": "1"
},
{
"name": "italic",
"value": "2"
}
]
},
{
"name": "textColor",
"format": [
"reference",
"color"
]
},
{
"name": "textColorHighlight",
"format": [
"reference",
"color"
]
},
{
"name": "textColorHint",
"format": [
"reference",
"color"
]
},
{
"name": "textColorLink",
"format": [
"reference",
"color"
]
},
{
"name": "textCursorDrawable",
"format": [
"reference"
]
},
{
"name": "textIsSelectable",
"format": [
"boolean"
]
},
{
"name": "ellipsize",
"format": [
"enum"
],
"enum": [
{
"name": "none",
"value": "0"
},
{
"name": "start",
"value": "1"
},
{
"name": "middle",
"value": "2"
},
{
"name": "end",
"value": "3"
},
{
"name": "marquee",
"value": "4"
}
]
},
{
"name": "inputType",
"format": [
"flags"
],
"flags": [
{
"name": "none",
"value": "0x00000000"
},
{
"name": "text",
"value": "0x00000001"
},
{
"name": "textCapCharacters",
"value": "0x00001001"
},
{
"name": "textCapWords",
"value": "0x00002001"
},
{
"name": "textCapSentences",
"value": "0x00004001"
},
{
"name": "textAutoCorrect",
"value": "0x00008001"
},
{
"name": "textAutoComplete",
"value": "0x00010001"
},
{
"name": "textMultiLine",
"value": "0x00020001"
},
{
"name": "textImeMultiLine",
"value": "0x00040001"
},
{
"name": "textNoSuggestions",
"value": "0x00080001"
},
{
"name": "textUri",
"value": "0x00000011"
},
{
"name": "textEmailAddress",
"value": "0x00000021"
},
{
"name": "textEmailSubject",
"value": "0x00000031"
},
{
"name": "textShortMessage",
"value": "0x00000041"
},
{
"name": "textLongMessage",
"value": "0x00000051"
},
{
"name": "textPersonName",
"value": "0x00000061"
},
{
"name": "textPostalAddress",
"value": "0x00000071"
},
{
"name": "textPassword",
"value": "0x00000081"
},
{
"name": "textVisiblePassword",
"value": "0x00000091"
},
{
"name": "textWebEditText",
"value": "0x000000a1"
},
{
"name": "textFilter",
"value": "0x000000b1"
},
{
"name": "textPhonetic",
"value": "0x000000c1"
},
{
"name": "textWebEmailAddress",
"value": "0x000000d1"
},
{
"name": "textWebPassword",
"value": "0x000000e1"
},
{
"name": "number",
"value": "0x00000002"
},
{
"name": "numberSigned",
"value": "0x00001002"
},
{
"name": "numberDecimal",
"value": "0x00002002"
},
{
"name": "numberPassword",
"value": "0x00000012"
},
{
"name": "phone",
"value": "0x00000003"
},
{
"name": "datetime",
"value": "0x00000004"
},
{
"name": "date",
"value": "0x00000014"
},
{
"name": "time",
"value": "0x00000024"
}
]
},
{
"name": "imeOptions",
"format": [
"flags"
],
"flags": [
{
"name": "normal",
"value": "0x00000000"
},
{
"name": "actionUnspecified",
"value": "0x00000000"
},
{
"name": "actionNone",
"value": "0x00000001"
},
{
"name": "actionGo",
"value": "0x00000002"
},
{
"name": "actionSearch",
"value": "0x00000003"
},
{
"name": "actionSend",
"value": "0x00000004"
},
{
"name": "actionNext",
"value": "0x00000005"
},
{
"name": "actionDone",
"value": "0x00000006"
},
{
"name": "actionPrevious",
"value": "0x00000007"
},
{
"name": "flagNoFullscreen",
"value": "0x2000000"
},
{
"name": "flagNavigatePrevious",
"value": "0x4000000"
},
{
"name": "flagNavigateNext",
"value": "0x8000000"
},
{
"name": "flagNoExtractUi",
"value": "0x10000000"
},
{
"name": "flagNoAccessoryAction",
"value": "0x20000000"
},
{
"name": "flagNoEnterAction",
"value": "0x40000000"
},
{
"name": "flagForceAscii",
"value": "0x80000000"
}
]
},
{
"name": "x",
"format": [
"dimension"
]
},
{
"name": "y",
"format": [
"dimension"
]
},
{
"name": "gravity",
"format": [
"flags"
],
"flags": [
{
"name": "top",
"value": "0x30"
},
{
"name": "bottom",
"value": "0x50"
},
{
"name": "left",
"value": "0x03"
},
{
"name": "right",
"value": "0x05"
},
{
"name": "center_vertical",
"value": "0x10"
},
{
"name": "fill_vertical",
"value": "0x70"
},
{
"name": "center_horizontal",
"value": "0x01"
},
{
"name": "fill_horizontal",
"value": "0x07"
},
{
"name": "center",
"value": "0x11"
},
{
"name": "fill",
"value": "0x77"
},
{
"name": "clip_vertical",
"value": "0x80"
},
{
"name": "clip_horizontal",
"value": "0x08"
},
{
"name": "start",
"value": "0x00800003"
},
{
"name": "end",
"value": "0x00800005"
}
]
},
{
"name": "autoLink",
"format": [
"flags"
],
"flags": [
{
"name": "none",
"value": "0x00"
},
{
"name": "web",
"value": "0x01"
},
{
"name": "email",
"value": "0x02"
},
{
"name": "phone",
"value": "0x04"
},
{
"name": "map",
"value": "0x08"
},
{
"name": "all",
"value": "0x0f"
}
]
},
{
"name": "entries",
"format": [
"reference"
]
},
{
"name": "layout_gravity",
"format": [
"flags"
],
"flags": [
{
"name": "top",
"value": "0x30"
},
{
"name": "bottom",
"value": "0x50"
},
{
"name": "left",
"value": "0x03"
},
{
"name": "right",
"value": "0x05"
},
{
"name": "center_vertical",
"value": "0x10"
},
{
"name": "fill_vertical",
"value": "0x70"
},
{
"name": "center_horizontal",
"value": "0x01"
},
{
"name": "fill_horizontal",
"value": "0x07"
},
{
"name": "center",
"value": "0x11"
},
{
"name": "fill",
"value": "0x77"
},
{
"name": "clip_vertical",
"value": "0x80"
},
{
"name": "clip_horizontal",
"value": "0x08"
},
{
"name": "start",
"value": "0x00800003"
},
{
"name": "end",
"value": "0x00800005"
}
]
},
{
"name": "orientation",
"format": [
"enum"
],
"enum": [
{
"name": "horizontal",
"value": "0"
},
{
"name": "vertical",
"value": "1"
}
]
},
{
"name": "alignmentMode",
"format": [
"enum"
],
"enum": [
{
"name": "alignBounds",
"value": "0"
},
{
"name": "alignMargins",
"value": "1"
}
]
},
{
"name": "keycode",
"format": [
"enum"
],
"enum": [
{
"name": "KEYCODE_UNKNOWN",
"value": "0"
},
{
"name": "KEYCODE_SOFT_LEFT",
"value": "1"
},
{
"name": "KEYCODE_SOFT_RIGHT",
"value": "2"
},
{
"name": "KEYCODE_HOME",
"value": "3"
},
{
"name": "KEYCODE_BACK",
"value": "4"
},
{
"name": "KEYCODE_CALL",
"value": "5"
},
{
"name": "KEYCODE_ENDCALL",
"value": "6"
},
{
"name": "KEYCODE_0",
"value": "7"
},
{
"name": "KEYCODE_1",
"value": "8"
},
{
"name": "KEYCODE_2",
"value": "9"
},
{
"name": "KEYCODE_3",
"value": "10"
},
{
"name": "KEYCODE_4",
"value": "11"
},
{
"name": "KEYCODE_5",
"value": "12"
},
{
"name": "KEYCODE_6",
"value": "13"
},
{
"name": "KEYCODE_7",
"value": "14"
},
{
"name": "KEYCODE_8",
"value": "15"
},
{
"name": "KEYCODE_9",
"value": "16"
},
{
"name": "KEYCODE_STAR",
"value": "17"
},
{
"name": "KEYCODE_POUND",
"value": "18"
},
{
"name": "KEYCODE_DPAD_UP",
"value": "19"
},
{
"name": "KEYCODE_DPAD_DOWN",
"value": "20"
},
{
"name": "KEYCODE_DPAD_LEFT",
"value": "21"
},
{
"name": "KEYCODE_DPAD_RIGHT",
"value": "22"
},
{
"name": "KEYCODE_DPAD_CENTER",
"value": "23"
},
{
"name": "KEYCODE_VOLUME_UP",
"value": "24"
},
{
"name": "KEYCODE_VOLUME_DOWN",
"value": "25"
},
{
"name": "KEYCODE_POWER",
"value": "26"
},
{
"name": "KEYCODE_CAMERA",
"value": "27"
},
{
"name": "KEYCODE_CLEAR",
"value": "28"
},
{
"name": "KEYCODE_A",
"value": "29"
},
{
"name": "KEYCODE_B",
"value": "30"
},
{
"name": "KEYCODE_C",
"value": "31"
},
{
"name": "KEYCODE_D",
"value": "32"
},
{
"name": "KEYCODE_E",
"value": "33"
},
{
"name": "KEYCODE_F",
"value": "34"
},
{
"name": "KEYCODE_G",
"value": "35"
},
{
"name": "KEYCODE_H",
"value": "36"
},
{
"name": "KEYCODE_I",
"value": "37"
},
{
"name": "KEYCODE_J",
"value": "38"
},
{
"name": "KEYCODE_K",
"value": "39"
},
{
"name": "KEYCODE_L",
"value": "40"
},
{
"name": "KEYCODE_M",
"value": "41"
},
{
"name": "KEYCODE_N",
"value": "42"
},
{
"name": "KEYCODE_O",
"value": "43"
},
{
"name": "KEYCODE_P",
"value": "44"
},
{
"name": "KEYCODE_Q",
"value": "45"
},
{
"name": "KEYCODE_R",
"value": "46"
},
{
"name": "KEYCODE_S",
"value": "47"
},
{
"name": "KEYCODE_T",
"value": "48"
},
{
"name": "KEYCODE_U",
"value": "49"
},
{
"name": "KEYCODE_V",
"value": "50"
},
{
"name": "KEYCODE_W",
"value": "51"
},
{
"name": "KEYCODE_X",
"value": "52"
},
{
"name": "KEYCODE_Y",
"value": "53"
},
{
"name": "KEYCODE_Z",
"value": "54"
},
{
"name": "KEYCODE_COMMA",
"value": "55"
},
{
"name": "KEYCODE_PERIOD",
"value": "56"
},
{
"name": "KEYCODE_ALT_LEFT",
"value": "57"
},
{
"name": "KEYCODE_ALT_RIGHT",
"value": "58"
},
{
"name": "KEYCODE_SHIFT_LEFT",
"value": "59"
},
{
"name": "KEYCODE_SHIFT_RIGHT",
"value": "60"
},
{
"name": "KEYCODE_TAB",
"value": "61"
},
{
"name": "KEYCODE_SPACE",
"value": "62"
},
{
"name": "KEYCODE_SYM",
"value": "63"
},
{
"name": "KEYCODE_EXPLORER",
"value": "64"
},
{
"name": "KEYCODE_ENVELOPE",
"value": "65"
},
{
"name": "KEYCODE_ENTER",
"value": "66"
},
{
"name": "KEYCODE_DEL",
"value": "67"
},
{
"name": "KEYCODE_GRAVE",
"value": "68"
},
{
"name": "KEYCODE_MINUS",
"value": "69"
},
{
"name": "KEYCODE_EQUALS",
"value": "70"
},
{
"name": "KEYCODE_LEFT_BRACKET",
"value": "71"
},
{
"name": "KEYCODE_RIGHT_BRACKET",
"value": "72"
},
{
"name": "KEYCODE_BACKSLASH",
"value": "73"
},
{
"name": "KEYCODE_SEMICOLON",
"value": "74"
},
{
"name": "KEYCODE_APOSTROPHE",
"value": "75"
},
{
"name": "KEYCODE_SLASH",
"value": "76"
},
{
"name": "KEYCODE_AT",
"value": "77"
},
{
"name": "KEYCODE_NUM",
"value": "78"
},
{
"name": "KEYCODE_HEADSETHOOK",
"value": "79"
},
{
"name": "KEYCODE_FOCUS",
"value": "80"
},
{
"name": "KEYCODE_PLUS",
"value": "81"
},
{
"name": "KEYCODE_MENU",
"value": "82"
},
{
"name": "KEYCODE_NOTIFICATION",
"value": "83"
},
{
"name": "KEYCODE_SEARCH",
"value": "84"
},
{
"name": "KEYCODE_MEDIA_PLAY_PAUSE",
"value": "85"
},
{
"name": "KEYCODE_MEDIA_STOP",
"value": "86"
},
{
"name": "KEYCODE_MEDIA_NEXT",
"value": "87"
},
{
"name": "KEYCODE_MEDIA_PREVIOUS",
"value": "88"
},
{
"name": "KEYCODE_MEDIA_REWIND",
"value": "89"
},
{
"name": "KEYCODE_MEDIA_FAST_FORWARD",
"value": "90"
},
{
"name": "KEYCODE_MUTE",
"value": "91"
},
{
"name": "KEYCODE_PAGE_UP",
"value": "92"
},
{
"name": "KEYCODE_PAGE_DOWN",
"value": "93"
},
{
"name": "KEYCODE_PICTSYMBOLS",
"value": "94"
},
{
"name": "KEYCODE_SWITCH_CHARSET",
"value": "95"
},
{
"name": "KEYCODE_BUTTON_A",
"value": "96"
},
{
"name": "KEYCODE_BUTTON_B",
"value": "97"
},
{
"name": "KEYCODE_BUTTON_C",
"value": "98"
},
{
"name": "KEYCODE_BUTTON_X",
"value": "99"
},
{
"name": "KEYCODE_BUTTON_Y",
"value": "100"
},
{
"name": "KEYCODE_BUTTON_Z",
"value": "101"
},
{
"name": "KEYCODE_BUTTON_L1",
"value": "102"
},
{
"name": "KEYCODE_BUTTON_R1",
"value": "103"
},
{
"name": "KEYCODE_BUTTON_L2",
"value": "104"
},
{
"name": "KEYCODE_BUTTON_R2",
"value": "105"
},
{
"name": "KEYCODE_BUTTON_THUMBL",
"value": "106"
},
{
"name": "KEYCODE_BUTTON_THUMBR",
"value": "107"
},
{
"name": "KEYCODE_BUTTON_START",
"value": "108"
},
{
"name": "KEYCODE_BUTTON_SELECT",
"value": "109"
},
{
"name": "KEYCODE_BUTTON_MODE",
"value": "110"
},
{
"name": "KEYCODE_ESCAPE",
"value": "111"
},
{
"name": "KEYCODE_FORWARD_DEL",
"value": "112"
},
{
"name": "KEYCODE_CTRL_LEFT",
"value": "113"
},
{
"name": "KEYCODE_CTRL_RIGHT",
"value": "114"
},
{
"name": "KEYCODE_CAPS_LOCK",
"value": "115"
},
{
"name": "KEYCODE_SCROLL_LOCK",
"value": "116"
},
{
"name": "KEYCODE_META_LEFT",
"value": "117"
},
{
"name": "KEYCODE_META_RIGHT",
"value": "118"
},
{
"name": "KEYCODE_FUNCTION",
"value": "119"
},
{
"name": "KEYCODE_SYSRQ",
"value": "120"
},
{
"name": "KEYCODE_BREAK",
"value": "121"
},
{
"name": "KEYCODE_MOVE_HOME",
"value": "122"
},
{
"name": "KEYCODE_MOVE_END",
"value": "123"
},
{
"name": "KEYCODE_INSERT",
"value": "124"
},
{
"name": "KEYCODE_FORWARD",
"value": "125"
},
{
"name": "KEYCODE_MEDIA_PLAY",
"value": "126"
},
{
"name": "KEYCODE_MEDIA_PAUSE",
"value": "127"
},
{
"name": "KEYCODE_MEDIA_CLOSE",
"value": "128"
},
{
"name": "KEYCODE_MEDIA_EJECT",
"value": "129"
},
{
"name": "KEYCODE_MEDIA_RECORD",
"value": "130"
},
{
"name": "KEYCODE_F1",
"value": "131"
},
{
"name": "KEYCODE_F2",
"value": "132"
},
{
"name": "KEYCODE_F3",
"value": "133"
},
{
"name": "KEYCODE_F4",
"value": "134"
},
{
"name": "KEYCODE_F5",
"value": "135"
},
{
"name": "KEYCODE_F6",
"value": "136"
},
{
"name": "KEYCODE_F7",
"value": "137"
},
{
"name": "KEYCODE_F8",
"value": "138"
},
{
"name": "KEYCODE_F9",
"value": "139"
},
{
"name": "KEYCODE_F10",
"value": "140"
},
{
"name": "KEYCODE_F11",
"value": "141"
},
{
"name": "KEYCODE_F12",
"value": "142"
},
{
"name": "KEYCODE_NUM_LOCK",
"value": "143"
},
{
"name": "KEYCODE_NUMPAD_0",
"value": "144"
},
{
"name": "KEYCODE_NUMPAD_1",
"value": "145"
},
{
"name": "KEYCODE_NUMPAD_2",
"value": "146"
},
{
"name": "KEYCODE_NUMPAD_3",
"value": "147"
},
{
"name": "KEYCODE_NUMPAD_4",
"value": "148"
},
{
"name": "KEYCODE_NUMPAD_5",
"value": "149"
},
{
"name": "KEYCODE_NUMPAD_6",
"value": "150"
},
{
"name": "KEYCODE_NUMPAD_7",
"value": "151"
},
{
"name": "KEYCODE_NUMPAD_8",
"value": "152"
},
{
"name": "KEYCODE_NUMPAD_9",
"value": "153"
},
{
"name": "KEYCODE_NUMPAD_DIVIDE",
"value": "154"
},
{
"name": "KEYCODE_NUMPAD_MULTIPLY",
"value": "155"
},
{
"name": "KEYCODE_NUMPAD_SUBTRACT",
"value": "156"
},
{
"name": "KEYCODE_NUMPAD_ADD",
"value": "157"
},
{
"name": "KEYCODE_NUMPAD_DOT",
"value": "158"
},
{
"name": "KEYCODE_NUMPAD_COMMA",
"value": "159"
},
{
"name": "KEYCODE_NUMPAD_ENTER",
"value": "160"
},
{
"name": "KEYCODE_NUMPAD_EQUALS",
"value": "161"
},
{
"name": "KEYCODE_NUMPAD_LEFT_PAREN",
"value": "162"
},
{
"name": "KEYCODE_NUMPAD_RIGHT_PAREN",
"value": "163"
},
{
"name": "KEYCODE_VOLUME_MUTE",
"value": "164"
},
{
"name": "KEYCODE_INFO",
"value": "165"
},
{
"name": "KEYCODE_CHANNEL_UP",
"value": "166"
},
{
"name": "KEYCODE_CHANNEL_DOWN",
"value": "167"
},
{
"name": "KEYCODE_ZOOM_IN",
"value": "168"
},
{
"name": "KEYCODE_ZOOM_OUT",
"value": "169"
},
{
"name": "KEYCODE_TV",
"value": "170"
},
{
"name": "KEYCODE_WINDOW",
"value": "171"
},
{
"name": "KEYCODE_GUIDE",
"value": "172"
},
{
"name": "KEYCODE_DVR",
"value": "173"
},
{
"name": "KEYCODE_BOOKMARK",
"value": "174"
},
{
"name": "KEYCODE_CAPTIONS",
"value": "175"
},
{
"name": "KEYCODE_SETTINGS",
"value": "176"
},
{
"name": "KEYCODE_TV_POWER",
"value": "177"
},
{
"name": "KEYCODE_TV_INPUT",
"value": "178"
},
{
"name": "KEYCODE_STB_POWER",
"value": "179"
},
{
"name": "KEYCODE_STB_INPUT",
"value": "180"
},
{
"name": "KEYCODE_AVR_POWER",
"value": "181"
},
{
"name": "KEYCODE_AVR_INPUT",
"value": "182"
},
{
"name": "KEYCODE_PROG_GRED",
"value": "183"
},
{
"name": "KEYCODE_PROG_GREEN",
"value": "184"
},
{
"name": "KEYCODE_PROG_YELLOW",
"value": "185"
},
{
"name": "KEYCODE_PROG_BLUE",
"value": "186"
},
{
"name": "KEYCODE_APP_SWITCH",
"value": "187"
},
{
"name": "KEYCODE_BUTTON_1",
"value": "188"
},
{
"name": "KEYCODE_BUTTON_2",
"value": "189"
},
{
"name": "KEYCODE_BUTTON_3",
"value": "190"
},
{
"name": "KEYCODE_BUTTON_4",
"value": "191"
},
{
"name": "KEYCODE_BUTTON_5",
"value": "192"
},
{
"name": "KEYCODE_BUTTON_6",
"value": "193"
},
{
"name": "KEYCODE_BUTTON_7",
"value": "194"
},
{
"name": "KEYCODE_BUTTON_8",
"value": "195"
},
{
"name": "KEYCODE_BUTTON_9",
"value": "196"
},
{
"name": "KEYCODE_BUTTON_10",
"value": "197"
},
{
"name": "KEYCODE_BUTTON_11",
"value": "198"
},
{
"name": "KEYCODE_BUTTON_12",
"value": "199"
},
{
"name": "KEYCODE_BUTTON_13",
"value": "200"
},
{
"name": "KEYCODE_BUTTON_14",
"value": "201"
},
{
"name": "KEYCODE_BUTTON_15",
"value": "202"
},
{
"name": "KEYCODE_BUTTON_16",
"value": "203"
},
{
"name": "KEYCODE_LANGUAGE_SWITCH",
"value": "204"
},
{
"name": "KEYCODE_MANNER_MODE",
"value": "205"
},
{
"name": "KEYCODE_3D_MODE",
"value": "206"
},
{
"name": "KEYCODE_CONTACTS",
"value": "207"
},
{
"name": "KEYCODE_CALENDAR",
"value": "208"
},
{
"name": "KEYCODE_MUSIC",
"value": "209"
},
{
"name": "KEYCODE_CALCULATOR",
"value": "210"
},
{
"name": "KEYCODE_ZENKAKU_HANKAKU",
"value": "211"
},
{
"name": "KEYCODE_EISU",
"value": "212"
},
{
"name": "KEYCODE_MUHENKAN",
"value": "213"
},
{
"name": "KEYCODE_HENKAN",
"value": "214"
},
{
"name": "KEYCODE_KATAKANA_HIRAGANA",
"value": "215"
},
{
"name": "KEYCODE_YEN",
"value": "216"
},
{
"name": "KEYCODE_RO",
"value": "217"
},
{
"name": "KEYCODE_KANA",
"value": "218"
},
{
"name": "KEYCODE_ASSIST",
"value": "219"
},
{
"name": "KEYCODE_BRIGHTNESS_DOWN",
"value": "220"
},
{
"name": "KEYCODE_BRIGHTNESS_UP",
"value": "221"
},
{
"name": "KEYCODE_MEDIA_AUDIO_TRACK",
"value": "222"
}
]
},
{
"name": "layout_childType",
"format": [
"enum"
],
"enum": [
{
"name": "none",
"value": "0"
},
{
"name": "widget",
"value": "1"
},
{
"name": "challenge",
"value": "2"
},
{
"name": "userSwitcher",
"value": "3"
},
{
"name": "scrim",
"value": "4"
},
{
"name": "widgets",
"value": "5"
},
{
"name": "expandChallengeHandle",
"value": "6"
},
{
"name": "pageDeleteDropTarget",
"value": "7"
}
]
}
],
"styleables": {
"Theme": {
"name": "Theme",
"attrs": [
{
"name": "colorForeground",
"format": [
"color"
]
},
{
"name": "colorForegroundInverse",
"format": [
"color"
]
},
{
"name": "colorBackground",
"format": [
"color"
]
},
{
"name": "colorBackgroundCacheHint",
"format": [
"color"
]
},
{
"name": "colorPressedHighlight",
"format": [
"color"
]
},
{
"name": "colorLongPressedHighlight",
"format": [
"color"
]
},
{
"name": "colorFocusedHighlight",
"format": [
"color"
]
},
{
"name": "colorActivatedHighlight",
"format": [
"color"
]
},
{
"name": "colorMultiSelectHighlight",
"format": [
"color"
]
},
{
"name": "disabledAlpha",
"format": [
"float"
]
},
{
"name": "backgroundDimAmount",
"format": [
"float"
]
},
{
"name": "backgroundDimEnabled",
"format": [
"boolean"
]
},
{
"name": "textAppearance",
"format": [
"reference"
]
},
{
"name": "textAppearanceInverse",
"format": [
"reference"
]
},
{
"name": "textColorPrimary",
"format": [
"reference",
"color"
]
},
{
"name": "textColorSecondary",
"format": [
"reference",
"color"
]
},
{
"name": "textColorTertiary",
"format": [
"reference",
"color"
]
},
{
"name": "textColorPrimaryInverse",
"format": [
"reference",
"color"
]
},
{
"name": "textColorSecondaryInverse",
"format": [
"reference",
"color"
]
},
{
"name": "textColorTertiaryInverse",
"format": [
"reference",
"color"
]
},
{
"name": "textColorHintInverse",
"format": [
"reference",
"color"
]
},
{
"name": "textColorPrimaryDisableOnly",
"format": [
"reference",
"color"
]
},
{
"name": "textColorPrimaryInverseDisableOnly",
"format": [
"reference",
"color"
]
},
{
"name": "textColorPrimaryNoDisable",
"format": [
"reference",
"color"
]
},
{
"name": "textColorSecondaryNoDisable",
"format": [
"reference",
"color"
]
},
{
"name": "textColorPrimaryInverseNoDisable",
"format": [
"reference",
"color"
]
},
{
"name": "textColorSecondaryInverseNoDisable",
"format": [
"reference",
"color"
]
},
{
"name": "textColorSearchUrl",
"format": [
"reference",
"color"
]
},
{
"name": "textColorHighlightInverse",
"format": [
"reference",
"color"
]
},
{
"name": "textColorLinkInverse",
"format": [
"reference",
"color"
]
},
{
"name": "textColorAlertDialogListItem",
"format": [
"reference",
"color"
]
},
{
"name": "searchWidgetCorpusItemBackground",
"format": [
"reference",
"color"
]
},
{
"name": "textAppearanceLarge",
"format": [
"reference"
]
},
{
"name": "textAppearanceMedium",
"format": [
"reference"
]
},
{
"name": "textAppearanceSmall",
"format": [
"reference"
]
},
{
"name": "textAppearanceLargeInverse",
"format": [
"reference"
]
},
{
"name": "textAppearanceMediumInverse",
"format": [
"reference"
]
},
{
"name": "textAppearanceSmallInverse",
"format": [
"reference"
]
},
{
"name": "textAppearanceSearchResultTitle",
"format": [
"reference"
]
},
{
"name": "textAppearanceSearchResultSubtitle",
"format": [
"reference"
]
},
{
"name": "textAppearanceButton",
"format": [
"reference"
]
},
{
"name": "textAppearanceLargePopupMenu",
"format": [
"reference"
]
},
{
"name": "textAppearanceSmallPopupMenu",
"format": [
"reference"
]
},
{
"name": "textAppearanceEasyCorrectSuggestion",
"format": [
"reference"
]
},
{
"name": "textAppearanceMisspelledSuggestion",
"format": [
"reference"
]
},
{
"name": "textAppearanceAutoCorrectionSuggestion",
"format": [
"reference"
]
},
{
"name": "textUnderlineColor",
"format": [
"reference",
"color"
]
},
{
"name": "textUnderlineThickness",
"format": [
"reference",
"dimension"
]
},
{
"name": "editTextColor",
"format": [
"reference",
"color"
]
},
{
"name": "editTextBackground",
"format": [
"reference"
]
},
{
"name": "errorMessageBackground",
"format": [
"reference"
]
},
{
"name": "errorMessageAboveBackground",
"format": [
"reference"
]
},
{
"name": "candidatesTextStyleSpans",
"format": [
"reference",
"string"
]
},
{
"name": "textCheckMark",
"format": [
"reference"
]
},
{
"name": "textCheckMarkInverse",
"format": [
"reference"
]
},
{
"name": "listChoiceIndicatorMultiple",
"format": [
"reference"
]
},
{
"name": "listChoiceIndicatorSingle",
"format": [
"reference"
]
},
{
"name": "listChoiceBackgroundIndicator",
"format": [
"reference"
]
},
{
"name": "activatedBackgroundIndicator",
"format": [
"reference"
]
},
{
"name": "buttonStyle",
"format": [
"reference"
]
},
{
"name": "buttonStyleSmall",
"format": [
"reference"
]
},
{
"name": "buttonStyleInset",
"format": [
"reference"
]
},
{
"name": "buttonStyleToggle",
"format": [
"reference"
]
},
{
"name": "galleryItemBackground",
"format": [
"reference"
]
},
{
"name": "listPreferredItemHeight",
"format": [
"dimension"
]
},
{
"name": "listPreferredItemHeightSmall",
"format": [
"dimension"
]
},
{
"name": "listPreferredItemHeightLarge",
"format": [
"dimension"
]
},
{
"name": "searchResultListItemHeight",
"format": [
"dimension"
]
},
{
"name": "listPreferredItemPaddingLeft",
"format": [
"dimension"
]
},
{
"name": "listPreferredItemPaddingRight",
"format": [
"dimension"
]
},
{
"name": "textAppearanceListItem",
"format": [
"reference"
]
},
{
"name": "textAppearanceListItemSmall",
"format": [
"reference"
]
},
{
"name": "listDivider",
"format": [
"reference"
]
},
{
"name": "listDividerAlertDialog",
"format": [
"reference"
]
},
{
"name": "listSeparatorTextViewStyle",
"format": [
"reference"
]
},
{
"name": "expandableListPreferredItemPaddingLeft",
"format": [
"dimension"
]
},
{
"name": "expandableListPreferredChildPaddingLeft",
"format": [
"dimension"
]
},
{
"name": "expandableListPreferredItemIndicatorLeft",
"format": [
"dimension"
]
},
{
"name": "expandableListPreferredItemIndicatorRight",
"format": [
"dimension"
]
},
{
"name": "expandableListPreferredChildIndicatorLeft",
"format": [
"dimension"
]
},
{
"name": "expandableListPreferredChildIndicatorRight",
"format": [
"dimension"
]
},
{
"name": "dropdownListPreferredItemHeight",
"format": [
"dimension"
]
},
{
"name": "listPreferredItemPaddingStart",
"format": [
"dimension"
]
},
{
"name": "listPreferredItemPaddingEnd",
"format": [
"dimension"
]
},
{
"name": "windowBackground",
"format": [
"reference"
]
},
{
"name": "windowFrame",
"format": [
"reference"
]
},
{
"name": "windowNoTitle",
"format": [
"boolean"
]
},
{
"name": "windowFullscreen",
"format": [
"boolean"
]
},
{
"name": "windowOverscan",
"format": [
"boolean"
]
},
{
"name": "windowIsFloating",
"format": [
"boolean"
]
},
{
"name": "windowIsTranslucent",
"format": [
"boolean"
]
},
{
"name": "windowShowWallpaper",
"format": [
"boolean"
]
},
{
"name": "windowContentOverlay",
"format": [
"reference"
]
},
{
"name": "windowTitleSize",
"format": [
"dimension"
]
},
{
"name": "windowTitleStyle",
"format": [
"reference"
]
},
{
"name": "windowTitleBackgroundStyle",
"format": [
"reference"
]
},
{
"name": "windowAnimationStyle",
"format": [
"reference"
]
},
{
"name": "windowActionBar",
"format": [
"boolean"
]
},
{
"name": "windowActionBarOverlay",
"format": [
"boolean"
]
},
{
"name": "windowActionModeOverlay",
"format": [
"boolean"
]
},
{
"name": "windowSplitActionBar",
"format": [
"boolean"
]
},
{
"name": "windowSoftInputMode",
"format": [
"flags"
],
"flags": [
{
"name": "stateUnspecified",
"value": "0"
},
{
"name": "stateUnchanged",
"value": "1"
},
{
"name": "stateHidden",
"value": "2"
},
{
"name": "stateAlwaysHidden",
"value": "3"
},
{
"name": "stateVisible",
"value": "4"
},
{
"name": "stateAlwaysVisible",
"value": "5"
},
{
"name": "adjustUnspecified",
"value": "0x00"
},
{
"name": "adjustResize",
"value": "0x10"
},
{
"name": "adjustPan",
"value": "0x20"
},
{
"name": "adjustNothing",
"value": "0x30"
}
]
},
{
"name": "windowDisablePreview",
"format": [
"boolean"
]
},
{
"name": "windowNoDisplay",
"format": [
"boolean"
]
},
{
"name": "windowEnableSplitTouch",
"format": [
"boolean"
]
},
{
"name": "windowCloseOnTouchOutside",
"format": [
"boolean"
]
},
{
"name": "windowTranslucentStatus",
"format": [
"boolean"
]
},
{
"name": "windowTranslucentNavigation",
"format": [
"boolean"
]
},
{
"name": "alertDialogStyle",
"format": [
"reference"
]
},
{
"name": "alertDialogButtonGroupStyle",
"format": [
"reference"
]
},
{
"name": "alertDialogCenterButtons",
"format": [
"boolean"
]
},
{
"name": "detailsElementBackground",
"format": [
"reference"
]
},
{
"name": "panelBackground",
"format": [
"reference",
"color"
]
},
{
"name": "panelFullBackground",
"format": [
"reference",
"color"
]
},
{
"name": "panelColorForeground",
"format": [
"reference",
"color"
]
},
{
"name": "panelColorBackground",
"format": [
"reference",
"color"
]
},
{
"name": "panelTextAppearance",
"format": [
"reference"
]
},
{
"name": "panelMenuIsCompact",
"format": [
"boolean"
]
},
{
"name": "panelMenuListWidth",
"format": [
"dimension"
]
},
{
"name": "panelMenuListTheme",
"format": [
"reference"
]
},
{
"name": "absListViewStyle",
"format": [
"reference"
]
},
{
"name": "autoCompleteTextViewStyle",
"format": [
"reference"
]
},
{
"name": "checkboxStyle",
"format": [
"reference"
]
},
{
"name": "checkedTextViewStyle",
"format": [
"reference"
]
},
{
"name": "dropDownListViewStyle",
"format": [
"reference"
]
},
{
"name": "editTextStyle",
"format": [
"reference"
]
},
{
"name": "expandableListViewStyle",
"format": [
"reference"
]
},
{
"name": "expandableListViewWhiteStyle",
"format": [
"reference"
]
},
{
"name": "galleryStyle",
"format": [
"reference"
]
},
{
"name": "gestureOverlayViewStyle",
"format": [
"reference"
]
},
{
"name": "gridViewStyle",
"format": [
"reference"
]
},
{
"name": "imageButtonStyle",
"format": [
"reference"
]
},
{
"name": "imageWellStyle",
"format": [
"reference"
]
},
{
"name": "listViewStyle",
"format": [
"reference"
]
},
{
"name": "listViewWhiteStyle",
"format": [
"reference"
]
},
{
"name": "popupWindowStyle",
"format": [
"reference"
]
},
{
"name": "progressBarStyle",
"format": [
"reference"
]
},
{
"name": "progressBarStyleHorizontal",
"format": [
"reference"
]
},
{
"name": "progressBarStyleSmall",
"format": [
"reference"
]
},
{
"name": "progressBarStyleSmallTitle",
"format": [
"reference"
]
},
{
"name": "progressBarStyleLarge",
"format": [
"reference"
]
},
{
"name": "progressBarStyleInverse",
"format": [
"reference"
]
},
{
"name": "progressBarStyleSmallInverse",
"format": [
"reference"
]
},
{
"name": "progressBarStyleLargeInverse",
"format": [
"reference"
]
},
{
"name": "seekBarStyle",
"format": [
"reference"
]
},
{
"name": "ratingBarStyle",
"format": [
"reference"
]
},
{
"name": "ratingBarStyleIndicator",
"format": [
"reference"
]
},
{
"name": "ratingBarStyleSmall",
"format": [
"reference"
]
},
{
"name": "radioButtonStyle",
"format": [
"reference"
]
},
{
"name": "scrollViewStyle",
"format": [
"reference"
]
},
{
"name": "horizontalScrollViewStyle",
"format": [
"reference"
]
},
{
"name": "spinnerStyle",
"format": [
"reference"
]
},
{
"name": "dropDownSpinnerStyle",
"format": [
"reference"
]
},
{
"name": "actionDropDownStyle",
"format": [
"reference"
]
},
{
"name": "actionButtonStyle",
"format": [
"reference"
]
},
{
"name": "starStyle",
"format": [
"reference"
]
},
{
"name": "tabWidgetStyle",
"format": [
"reference"
]
},
{
"name": "textViewStyle",
"format": [
"reference"
]
},
{
"name": "webTextViewStyle",
"format": [
"reference"
]
},
{
"name": "webViewStyle",
"format": [
"reference"
]
},
{
"name": "dropDownItemStyle",
"format": [
"reference"
]
},
{
"name": "spinnerDropDownItemStyle",
"format": [
"reference"
]
},
{
"name": "dropDownHintAppearance",
"format": [
"reference"
]
},
{
"name": "spinnerItemStyle",
"format": [
"reference"
]
},
{
"name": "mapViewStyle",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeOverlay",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeStyleWindowSmall",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeStyleWindowMedium",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeStyleWindowLarge",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeStyleSmallWindowSmall",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeStyleSmallWindowMedium",
"format": [
"reference"
]
},
{
"name": "quickContactBadgeStyleSmallWindowLarge",
"format": [
"reference"
]
},
{
"name": "textSelectHandleWindowStyle",
"format": [
"reference"
]
},
{
"name": "textSuggestionsWindowStyle",
"format": [
"reference"
]
},
{
"name": "listPopupWindowStyle",
"format": [
"reference"
]
},
{
"name": "popupMenuStyle",
"format": [
"reference"
]
},
{
"name": "stackViewStyle",
"format": [
"reference"
]
},
{
"name": "numberPickerStyle",
"format": [
"reference"
]
},
{
"name": "calendarViewStyle",
"format": [
"reference"
]
},
{
"name": "timePickerStyle",
"format": [
"reference"
]
},
{
"name": "datePickerStyle",
"format": [
"reference"
]
},
{
"name": "activityChooserViewStyle",
"format": [
"reference"
]
},
{
"name": "fastScrollThumbDrawable",
"format": [
"reference"
]
},
{
"name": "fastScrollPreviewBackgroundRight",
"format": [
"reference"
]
},
{
"name": "fastScrollPreviewBackgroundLeft",
"format": [
"reference"
]
},
{
"name": "fastScrollTrackDrawable",
"format": [
"reference"
]
},
{
"name": "fastScrollOverlayPosition",
"format": [
"enum"
],
"enum": [
{
"name": "floating",
"value": "0"
},
{
"name": "atThumb",
"value": "1"
}
]
},
{
"name": "fastScrollTextColor",
"format": [
"color"
]
},
{
"name": "actionBarTabStyle",
"format": [
"reference"
]
},
{
"name": "actionBarTabBarStyle",
"format": [
"reference"
]
},
{
"name": "actionBarTabTextStyle",
"format": [
"reference"
]
},
{
"name": "actionOverflowButtonStyle",
"format": [
"reference"
]
},
{
"name": "actionBarStyle",
"format": [
"reference"
]
},
{
"name": "actionBarSplitStyle",
"format": [
"reference"
]
},
{
"name": "actionBarWidgetTheme",
"format": [
"reference"
]
},
{
"name": "actionBarSize",
"format": [
"dimension",
"enum"
],
"enum": [
{
"name": "wrap_content",
"value": "0"
}
]
},
{
"name": "actionBarDivider",
"format": [
"reference"
]
},
{
"name": "actionBarItemBackground",
"format": [
"reference"
]
},
{
"name": "actionMenuTextAppearance",
"format": [
"reference"
]
},
{
"name": "actionMenuTextColor",
"format": [
"color",
"reference"
]
},
{
"name": "actionModeStyle",
"format": [
"reference"
]
},
{
"name": "actionModeCloseButtonStyle",
"format": [
"reference"
]
},
{
"name": "actionModeBackground",
"format": [
"reference"
]
},
{
"name": "actionModeSplitBackground",
"format": [
"reference"
]
},
{
"name": "actionModeCloseDrawable",
"format": [
"reference"
]
},
{
"name": "actionModeCutDrawable",
"format": [
"reference"
]
},
{
"name": "actionModeCopyDrawable",
"format": [
"reference"
]
},
{
"name": "actionModePasteDrawable",
"format": [
"reference"
]
},
{
"name": "actionModeSelectAllDrawable",
"format": [
"reference"
]
},
{
"name": "actionModeShareDrawable",
"format": [
"reference"
]
},
{
"name": "actionModeFindDrawable",
"format": [
"reference"
]
},
{
"name": "actionModeWebSearchDrawable",
"format": [
"reference"
]
},
{
"name": "actionModePopupWindowStyle",
"format": [
"reference"
]
},
{
"name": "preferenceScreenStyle",
"format": [
"reference"
]
},
{
"name": "preferenceFragmentStyle",
"format": [
"reference"
]
},
{
"name": "preferenceCategoryStyle",
"format": [
"reference"
]
},
{
"name": "preferenceStyle",
"format": [
"reference"
]
},
{
"name": "preferenceInformationStyle",
"format": [
"reference"
]
},
{
"name": "checkBoxPreferenceStyle",
"format": [
"reference"
]
},
{
"name": "yesNoPreferenceStyle",
"format": [
"reference"
]
},
{
"name": "dialogPreferenceStyle",
"format": [
"reference"
]
},
{
"name": "editTextPreferenceStyle",
"format": [
"reference"
]
},
{
"name": "ringtonePreferenceStyle",
"format": [
"reference"
]
},
{
"name": "preferenceLayoutChild",
"format": [
"reference"
]
},
{
"name": "preferencePanelStyle",
"format": [
"reference"
]
},
{
"name": "preferenceHeaderPanelStyle",
"format": [
"reference"
]
},
{
"name": "preferenceListStyle",
"format": [
"reference"
]
},
{
"name": "preferenceFragmentListStyle",
"format": [
"reference"
]
},
{
"name": "preferenceFragmentPaddingSide",
"format": [
"dimension"
]
},
{
"name": "switchPreferenceStyle",
"format": [
"reference"
]
},
{
"name": "textSelectHandleLeft",
"format": [
"reference"
]
},
{
"name": "textSelectHandleRight",
"format": [
"reference"
]
},
{
"name": "textSelectHandle",
"format": [
"reference"
]
},
{
"name": "textEditPasteWindowLayout",
"format": [
"reference"
]
},
{
"name": "textEditNoPasteWindowLayout",
"format": [
"reference"
]
},
{
"name": "textEditSidePasteWindowLayout",
"format": [
"reference"
]
},
{
"name": "textEditSideNoPasteWindowLayout",
"format": [
"reference"
]
},
{
"name": "textEditSuggestionItemLayout",
"format": [
"reference"
]
},
{
"name": "dialogTheme",
"format": [
"reference"
]
},
{
"name": "dialogTitleIconsDecorLayout",
"format": [
"reference"
]
},
{
"name": "dialogCustomTitleDecorLayout",
"format": [
"reference"
]
},
{
"name": "dialogTitleDecorLayout",
"format": [
"reference"
]
},
{
"name": "alertDialogTheme",
"format": [
"reference"
]
},
{
"name": "alertDialogIcon",
"format": [
"reference"
]
},
{
"name": "presentationTheme",
"format": [
"reference"
]
},
{
"name": "dividerVertical",
"format": [
"reference"
]
},
{
"name": "dividerHorizontal",
"format": [
"reference"
]
},
{
"name": "buttonBarStyle",
"format": [
"reference"
]
},
{
"name": "buttonBarButtonStyle",
"format": [
"reference"
]
},
{
"name": "segmentedButtonStyle",
"format": [
"reference"
]
},
{
"name": "selectableItemBackground",
"format": [
"reference"
]
},
{
"name": "borderlessButtonStyle",
"format": [
"reference"
]
},
{
"name": "toastFrameBackground",
"format": [
"reference"
]
},
{
"name": "searchDropdownBackground",
"format": [
"reference"
]
},
{
"name": "searchViewCloseIcon",
"format": [
"reference"
]
},
{
"name": "searchViewGoIcon",
"format": [
"reference"
]
},
{
"name": "searchViewSearchIcon",
"format": [
"reference"
]
},
{
"name": "searchViewVoiceIcon",
"format": [
"reference"
]
},
{
"name": "searchViewEditQuery",
"format": [
"reference"
]
},
{
"name": "searchViewEditQueryBackground",
"format": [
"reference"
]
},
{
"name": "searchViewTextField",
"format": [
"reference"
]
},
{
"name": "searchViewTextFieldRight",
"format": [
"reference"
]
},
{
"name": "searchDialogTheme",
"format": [
"reference"
]
},
{
"name": "homeAsUpIndicator",
"format": [
"reference"
]
},
{
"name": "preferenceFrameLayoutStyle",
"format": [
"reference"
]
},
{
"name": "switchStyle",
"format": [
"reference"
]
},
{
"name": "mediaRouteButtonStyle",
"format": [
"reference"
]
},
{
"name": "pointerStyle",
"format": [
"reference"
]
},
{
"name": "accessibilityFocusedDrawable",
"format": [
"reference"
]
},
{
"name": "findOnPageNextDrawable",
"format": [
"reference"
]
},
{
"name": "findOnPagePreviousDrawable",
"format": [
"reference"
]
}
]
},
"Window": {
"name": "Window",
"attrs": [
{
"name": "windowBackground",
"format": []
},
{
"name": "windowContentOverlay",
"format": []
},
{
"name": "windowFrame",
"format": []
},
{
"name": "windowNoTitle",
"format": []
},
{
"name": "windowFullscreen",
"format": []
},
{
"name": "windowOverscan",
"format": []
},
{
"name": "windowIsFloating",
"format": []
},
{
"name": "windowIsTranslucent",
"format": []
},
{
"name": "windowShowWallpaper",
"format": []
},
{
"name": "windowAnimationStyle",
"format": []
},
{
"name": "windowSoftInputMode",
"format": []
},
{
"name": "windowDisablePreview",
"format": []
},
{
"name": "windowNoDisplay",
"format": []
},
{
"name": "textColor",
"format": []
},
{
"name": "backgroundDimEnabled",
"format": []
},
{
"name": "backgroundDimAmount",
"format": []
},
{
"name": "windowActionBar",
"format": []
},
{
"name": "windowActionModeOverlay",
"format": []
},
{
"name": "windowActionBarOverlay",
"format": []
},
{
"name": "windowSplitActionBar",
"format": []
},
{
"name": "windowEnableSplitTouch",
"format": []
},
{
"name": "windowCloseOnTouchOutside",
"format": []
},
{
"name": "windowTranslucentStatus",
"format": []
},
{
"name": "windowTranslucentNavigation",
"format": []
},
{
"name": "windowMinWidthMajor",
"format": [
"dimension",
"fraction"
]
},
{
"name": "windowMinWidthMinor",
"format": [
"dimension",
"fraction"
]
},
{
"name": "windowFixedWidthMajor",
"format": [
"dimension",
"fraction"
]
},
{
"name": "windowFixedHeightMinor",
"format": [
"dimension",
"fraction"
]
},
{
"name": "windowFixedWidthMinor",
"format": [
"dimension",
"fraction"
]
},
{
"name": "windowFixedHeightMajor",
"format": [
"dimension",
"fraction"
]
}
]
},
"AlertDialog": {
"name": "AlertDialog",
"attrs": [
{
"name": "fullDark",
"format": [
"reference",
"color"
]
},
{
"name": "topDark",
"format": [
"reference",
"color"
]
},
{
"name": "centerDark",
"format": [
"reference",
"color"
]
},
{
"name": "bottomDark",
"format": [
"reference",
"color"
]
},
{
"name": "fullBright",
"format": [
"reference",
"color"
]
},
{
"name": "topBright",
"format": [
"reference",
"color"
]
},
{
"name": "centerBright",
"format": [
"reference",
"color"
]
},
{
"name": "bottomBright",
"format": [
"reference",
"color"
]
},
{
"name": "bottomMedium",
"format": [
"reference",
"color"
]
},
{
"name": "centerMedium",
"format": [
"reference",
"color"
]
},
{
"name": "layout",
"format": []
},
{
"name": "listLayout",
"format": [
"reference"
]
},
{
"name": "multiChoiceItemLayout",
"format": [
"reference"
]
},
{
"name": "singleChoiceItemLayout",
"format": [
"reference"
]
},
{
"name": "listItemLayout",
"format": [
"reference"
]
},
{
"name": "progressLayout",
"format": [
"reference"
]
},
{
"name": "horizontalProgressLayout",
"format": [
"reference"
]
}
]
},
"FragmentAnimation": {
"name": "FragmentAnimation",
"attrs": [
{
"name": "fragmentOpenEnterAnimation",
"format": [
"reference"
]
},
{
"name": "fragmentOpenExitAnimation",
"format": [
"reference"
]
},
{
"name": "fragmentCloseEnterAnimation",
"format": [
"reference"
]
},
{
"name": "fragmentCloseExitAnimation",
"format": [
"reference"
]
},
{
"name": "fragmentFadeEnterAnimation",
"format": [
"reference"
]
},
{
"name": "fragmentFadeExitAnimation",
"format": [
"reference"
]
}
]
},
"WindowAnimation": {
"name": "WindowAnimation",
"attrs": [
{
"name": "windowEnterAnimation",
"format": [
"reference"
]
},
{
"name": "windowExitAnimation",
"format": [
"reference"
]
},
{
"name": "windowShowAnimation",
"format": [
"reference"
]
},
{
"name": "windowHideAnimation",
"format": [
"reference"
]
},
{
"name": "activityOpenEnterAnimation",
"format": [
"reference"
]
},
{
"name": "activityOpenExitAnimation",
"format": [
"reference"
]
},
{
"name": "activityCloseEnterAnimation",
"format": [
"reference"
]
},
{
"name": "activityCloseExitAnimation",
"format": [
"reference"
]
},
{
"name": "taskOpenEnterAnimation",
"format": [
"reference"
]
},
{
"name": "taskOpenExitAnimation",
"format": [
"reference"
]
},
{
"name": "taskCloseEnterAnimation",
"format": [
"reference"
]
},
{
"name": "taskCloseExitAnimation",
"format": [
"reference"
]
},
{
"name": "taskToFrontEnterAnimation",
"format": [
"reference"
]
},
{
"name": "taskToFrontExitAnimation",
"format": [
"reference"
]
},
{
"name": "taskToBackEnterAnimation",
"format": [
"reference"
]
},
{
"name": "taskToBackExitAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperOpenEnterAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperOpenExitAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperCloseEnterAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperCloseExitAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperIntraOpenEnterAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperIntraOpenExitAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperIntraCloseEnterAnimation",
"format": [
"reference"
]
},
{
"name": "wallpaperIntraCloseExitAnimation",
"format": [
"reference"
]
}
]
},
"View": {
"name": "View",
"attrs": [
{
"name": "id",
"format": [
"reference"
]
},
{
"name": "tag",
"format": [
"string"
]
},
{
"name": "scrollX",
"format": [
"dimension"
]
},
{
"name": "scrollY",
"format": [
"dimension"
]
},
{
"name": "background",
"format": [
"reference",
"color"
]
},
{
"name": "padding",
"format": [
"dimension"
]
},
{
"name": "paddingLeft",
"format": [
"dimension"
]
},
{
"name": "paddingTop",
"format": [
"dimension"
]
},
{
"name": "paddingRight",
"format": [
"dimension"
]
},
{
"name": "paddingBottom",
"format": [
"dimension"
]
},
{
"name": "paddingStart",
"format": [
"dimension"
]
},
{
"name": "paddingEnd",
"format": [
"dimension"
]
},
{
"name": "focusable",
"format": [
"boolean"
]
},
{
"name": "focusableInTouchMode",
"format": [
"boolean"
]
},
{
"name": "visibility",
"format": [
"enum"
],
"enum": [
{
"name": "visible",
"value": "0"
},
{
"name": "invisible",
"value": "1"
},
{
"name": "gone",
"value": "2"
}
]
},
{
"name": "fitsSystemWindows",
"format": [
"boolean"
]
},
{
"name": "scrollbars",
"format": [
"flags"
],
"flags": [
{
"name": "horizontal",
"value": "0x00000100"
},
{
"name": "vertical",
"value": "0x00000200"
}
]
},
{
"name": "scrollbarStyle",
"format": [
"enum"
],
"enum": [
{
"name": "insideOverlay",
"value": "0x0"
},
{
"name": "insideInset",
"value": "0x01000000"
},
{
"name": "outsideOverlay",
"value": "0x02000000"
},
{
"name": "outsideInset",
"value": "0x03000000"
}
]
},
{
"name": "isScrollContainer",
"format": [
"boolean"
]
},
{
"name": "fadeScrollbars",
"format": [
"boolean"
]
},
{
"name": "scrollbarFadeDuration",
"format": [
"integer"
]
},
{
"name": "scrollbarDefaultDelayBeforeFade",
"format": [
"integer"
]
},
{
"name": "scrollbarSize",
"format": [
"dimension"
]
},
{
"name": "scrollbarThumbHorizontal",
"format": [
"reference"
]
},
{
"name": "scrollbarThumbVertical",
"format": [
"reference"
]
},
{
"name": "scrollbarTrackHorizontal",
"format": [
"reference"
]
},
{
"name": "scrollbarTrackVertical",
"format": [
"reference"
]
},
{
"name": "scrollbarAlwaysDrawHorizontalTrack",
"format": [
"boolean"
]
},
{
"name": "scrollbarAlwaysDrawVerticalTrack",
"format": [
"boolean"
]
},
{
"name": "fadingEdge",
"format": [
"flags"
],
"flags": [
{
"name": "none",
"value": "0x00000000"
},
{
"name": "horizontal",
"value": "0x00001000"
},
{
gitextract_fw5cbrlj/ ├── .gitignore ├── .idea/ │ └── runConfigurations/ │ └── Android_Studio.xml ├── CHANGELOG.md ├── GOODBYE.md ├── LICENSE ├── README.md ├── anko/ │ ├── idea-plugin/ │ │ ├── attrs/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── org/ │ │ │ └── jetbrains/ │ │ │ └── kotlin/ │ │ │ └── android/ │ │ │ └── Attrs.kt │ │ ├── build.gradle │ │ ├── idea-runner/ │ │ │ └── build.gradle │ │ ├── intentions/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── org/ │ │ │ └── jetbrains/ │ │ │ └── anko/ │ │ │ └── idea/ │ │ │ └── intentions/ │ │ │ ├── AnkoIntention.kt │ │ │ ├── FindViewByIdIntention.kt │ │ │ ├── ReplaceColorGrayOpaqueIntention.kt │ │ │ └── ToastMakeTextShowIntention.kt │ │ ├── plugin-classpath/ │ │ │ └── build.gradle │ │ ├── preview/ │ │ │ ├── build.gradle │ │ │ ├── resources/ │ │ │ │ ├── META-INF/ │ │ │ │ │ └── plugin.xml │ │ │ │ └── intentionDescriptions/ │ │ │ │ ├── FindViewByIdIntention/ │ │ │ │ │ ├── after.kt.template │ │ │ │ │ ├── before.kt.template │ │ │ │ │ └── description.html │ │ │ │ ├── ReplaceColorGrayOpaqueIntention/ │ │ │ │ │ ├── after.kt.template │ │ │ │ │ ├── before.kt.template │ │ │ │ │ └── description.html │ │ │ │ └── ToastMakeTextShowIntention/ │ │ │ │ ├── after.kt.template │ │ │ │ ├── before.kt.template │ │ │ │ └── description.html │ │ │ └── src/ │ │ │ └── org/ │ │ │ └── jetbrains/ │ │ │ └── kotlin/ │ │ │ └── android/ │ │ │ └── dslpreview/ │ │ │ ├── AnkoNlPreviewManager.kt │ │ │ ├── AnkoViewLoaderExtension.kt │ │ │ ├── DslPreviewClassResolver.kt │ │ │ ├── LayoutPsiFile.kt │ │ │ ├── PreviewClassDescription.kt │ │ │ ├── SourceFileModificationTracker.kt │ │ │ └── UpdateActivityNameTask.kt │ │ └── xml-converter/ │ │ ├── build.gradle │ │ ├── resources/ │ │ │ ├── attrs.json │ │ │ └── views.json │ │ ├── src/ │ │ │ └── org/ │ │ │ └── jetbrains/ │ │ │ └── kotlin/ │ │ │ └── android/ │ │ │ └── xmlconverter/ │ │ │ ├── AttributeOptimizer.kt │ │ │ ├── AttributeParser.kt │ │ │ ├── ConvertAction.kt │ │ │ ├── LayoutAttributeRenderer.kt │ │ │ ├── Util.kt │ │ │ ├── ViewAttributeRenderer.kt │ │ │ └── XmlConverter.kt │ │ ├── test/ │ │ │ └── org/ │ │ │ └── jetbrains/ │ │ │ └── kotlin/ │ │ │ └── android/ │ │ │ └── xmlconverter/ │ │ │ ├── BaseXmlConverterTest.java │ │ │ └── XmlConverterTest.kt │ │ └── testData/ │ │ ├── attributes/ │ │ │ ├── layout.kt │ │ │ └── layout.xml │ │ ├── dimensions/ │ │ │ ├── layout.kt │ │ │ └── layout.xml │ │ ├── linearLayout/ │ │ │ ├── layout.kt │ │ │ └── layout.xml │ │ ├── relativeLayout/ │ │ │ ├── layout.kt │ │ │ └── layout.xml │ │ └── simple/ │ │ ├── layout.kt │ │ └── layout.xml │ ├── library/ │ │ ├── generated/ │ │ │ ├── anko/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── appcompat-v7/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ └── Views.kt │ │ │ ├── appcompat-v7-commons/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── appcompat-v7-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── appcompat-v7-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── cardview-v7/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ └── Views.kt │ │ │ ├── common/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── commons/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── constraint-layout/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ └── Views.kt │ │ │ ├── coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── bg.kt │ │ │ │ └── weakReferenceSupport.kt │ │ │ ├── design/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ └── Views.kt │ │ │ ├── design-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── design-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── gridlayout-v7/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ └── Views.kt │ │ │ ├── percent/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ └── Views.kt │ │ │ ├── recyclerview-v7/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ └── Views.kt │ │ │ ├── recyclerview-v7-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── recyclerview-v7-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk15/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk15-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk15-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk19/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk19-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk19-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk21/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk21-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk21-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk23/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk23-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk23-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk25/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk25-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk25-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk27/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk27-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk27-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sdk28/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Properties.kt │ │ │ │ ├── Services.kt │ │ │ │ └── Views.kt │ │ │ ├── sdk28-coroutines/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ListenersWithCoroutines.kt │ │ │ ├── sdk28-listeners/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Listeners.kt │ │ │ ├── sqlite/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── SqlParserHelpers.kt │ │ │ ├── support-v4/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── Layouts.kt │ │ │ │ ├── Listeners.kt │ │ │ │ └── Views.kt │ │ │ └── support-v4-commons/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ └── AndroidManifest.xml │ │ ├── generator/ │ │ │ ├── build.gradle │ │ │ ├── src/ │ │ │ │ └── org/ │ │ │ │ └── jetbrains/ │ │ │ │ └── android/ │ │ │ │ └── anko/ │ │ │ │ ├── ClassProcessor.kt │ │ │ │ ├── annotations/ │ │ │ │ │ ├── AnnotationManager.kt │ │ │ │ │ └── annotationProviders.kt │ │ │ │ ├── artifact/ │ │ │ │ │ └── Artifact.kt │ │ │ │ ├── config/ │ │ │ │ │ ├── AnkoConfiguration.kt │ │ │ │ │ ├── AnkoFile.kt │ │ │ │ │ ├── ArtifactType.kt │ │ │ │ │ ├── ConfigurationKey.kt │ │ │ │ │ ├── DefaultAnkoConfiguration.kt │ │ │ │ │ ├── GeneratorContext.kt │ │ │ │ │ ├── Logger.kt │ │ │ │ │ ├── Props.kt │ │ │ │ │ └── configurationKeys.kt │ │ │ │ ├── generator/ │ │ │ │ │ ├── GenerationState.kt │ │ │ │ │ ├── LayoutGenerator.kt │ │ │ │ │ ├── ListenerGenerator.kt │ │ │ │ │ ├── PropertyGenerator.kt │ │ │ │ │ ├── ServiceGenerator.kt │ │ │ │ │ ├── dslElements.kt │ │ │ │ │ ├── layoutParamsUtils.kt │ │ │ │ │ └── viewClassGenerators.kt │ │ │ │ ├── main.kt │ │ │ │ ├── render/ │ │ │ │ │ ├── LayoutRenderer.kt │ │ │ │ │ ├── ListenerRenderer.kt │ │ │ │ │ ├── PropertyRenderer.kt │ │ │ │ │ ├── RenderFacade.kt │ │ │ │ │ ├── ServiceRenderer.kt │ │ │ │ │ ├── SqlParserHelperRenderer.kt │ │ │ │ │ ├── viewConstructorUtils.kt │ │ │ │ │ └── viewRenderers.kt │ │ │ │ ├── sources/ │ │ │ │ │ ├── SourceManager.kt │ │ │ │ │ └── sourceProviders.kt │ │ │ │ ├── templates/ │ │ │ │ │ ├── JtwigTemplateProvider.kt │ │ │ │ │ ├── MustacheTemplateProvider.kt │ │ │ │ │ └── TemplateManager.kt │ │ │ │ ├── utils/ │ │ │ │ │ ├── Buffer.kt │ │ │ │ │ ├── ClassInfo.kt │ │ │ │ │ ├── ClassTree.kt │ │ │ │ │ ├── ClassTreeUtils.kt │ │ │ │ │ ├── ImportList.kt │ │ │ │ │ ├── KMethod.kt │ │ │ │ │ ├── KType.kt │ │ │ │ │ ├── KVariable.kt │ │ │ │ │ ├── MethodInfo.kt │ │ │ │ │ ├── Property.kt │ │ │ │ │ ├── ReflectionUtils.kt │ │ │ │ │ ├── SignatureParser.kt │ │ │ │ │ ├── Types.kt │ │ │ │ │ ├── stringUtils.kt │ │ │ │ │ └── utils.kt │ │ │ │ └── writer/ │ │ │ │ ├── AbstractWriter.kt │ │ │ │ ├── GeneratorWriter.kt │ │ │ │ └── VerifyWriter.kt │ │ │ └── test/ │ │ │ └── org/ │ │ │ └── jetbrains/ │ │ │ └── android/ │ │ │ └── anko/ │ │ │ └── ClassTreeTest.java │ │ ├── library.gradle │ │ ├── robolectricTests/ │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── local.properties │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── AndroidLayoutParamsTestActivity.kt │ │ │ │ ├── AndroidLayoutsTestActivity.kt │ │ │ │ ├── AndroidListenerHelpersTestActivity.kt │ │ │ │ ├── AndroidMultiMethodListenersActivity.kt │ │ │ │ ├── AndroidPropertiesTestActivity.kt │ │ │ │ ├── AndroidSimpleTestActivity.kt │ │ │ │ ├── AndroidWidgetTestActivity.kt │ │ │ │ └── README.md │ │ │ └── test/ │ │ │ └── java/ │ │ │ ├── AnkoLoggerTest.kt │ │ │ ├── AnkoSQliteTest.kt │ │ │ ├── AttemptTest.kt │ │ │ ├── BuildSpannedTest.kt │ │ │ ├── BundleOfTest.kt │ │ │ ├── ChildrenSequenceTest.kt │ │ │ ├── ClassParserTest.kt │ │ │ ├── CollectionsTest.kt │ │ │ ├── CreateIntentTest.kt │ │ │ ├── DialogsTest.kt │ │ │ ├── FindViewTest.kt │ │ │ ├── IntentForTest.kt │ │ │ ├── RelativeLayoutHelpersTest.kt │ │ │ ├── ServiceTest.kt │ │ │ ├── SimpleTest.kt │ │ │ ├── SparseArraysTest.kt │ │ │ └── WithArgumentsTest.kt │ │ ├── static/ │ │ │ ├── appcompatV7/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── SupportAlertBuilder.kt │ │ │ ├── commons/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── AnkoContext.kt │ │ │ │ ├── Async.kt │ │ │ │ ├── ContextUtils.kt │ │ │ │ ├── Custom.kt │ │ │ │ ├── Deprecated.kt │ │ │ │ ├── Dimensions.kt │ │ │ │ ├── Helpers.kt │ │ │ │ ├── Intents.kt │ │ │ │ ├── Internals.kt │ │ │ │ ├── Logging.kt │ │ │ │ ├── RelativeLayoutLayoutParamsHelpers.kt │ │ │ │ ├── SharedPreferences.kt │ │ │ │ ├── Theme.kt │ │ │ │ ├── Ui.kt │ │ │ │ ├── buildSpanned.kt │ │ │ │ ├── collections/ │ │ │ │ │ ├── Arrays.kt │ │ │ │ │ ├── Collections.kt │ │ │ │ │ └── SparseArrays.kt │ │ │ │ ├── dialogs/ │ │ │ │ │ ├── AlertBuilder.kt │ │ │ │ │ ├── AlertDialogBuilder.kt │ │ │ │ │ ├── AndroidAlertBuilder.kt │ │ │ │ │ ├── AndroidDialogs.kt │ │ │ │ │ ├── AndroidSelectors.kt │ │ │ │ │ ├── Dialogs.kt │ │ │ │ │ ├── Selectors.kt │ │ │ │ │ └── Toasts.kt │ │ │ │ ├── menuItemsSequences.kt │ │ │ │ └── viewChildrenSequences.kt │ │ │ ├── constraint-layout/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── ConstraintLayout.kt │ │ │ ├── design/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── Snackbar.kt │ │ │ ├── platform/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── CustomLayoutProperties.kt │ │ │ │ ├── CustomServices.kt │ │ │ │ ├── CustomViewProperties.kt │ │ │ │ ├── CustomViews.kt │ │ │ │ ├── InputConstraints.kt │ │ │ │ └── Menus.kt │ │ │ ├── sqlite/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ ├── ClassParser.kt │ │ │ │ ├── Database.kt │ │ │ │ ├── SelectQueryBuilder.kt │ │ │ │ ├── SqlParsers.kt │ │ │ │ ├── UpdateQueryBuilder.kt │ │ │ │ ├── org/ │ │ │ │ │ └── jetbrains/ │ │ │ │ │ └── anko/ │ │ │ │ │ └── db/ │ │ │ │ │ └── JavaSqliteUtils.java │ │ │ │ └── sqlTypes.kt │ │ │ └── supportV4/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ ├── Support.kt │ │ │ ├── SupportAsync.kt │ │ │ ├── SupportContextUtils.kt │ │ │ ├── SupportDialogs.kt │ │ │ ├── SupportDimensions.kt │ │ │ └── SupportIntents.kt │ │ ├── stubs/ │ │ │ ├── build.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── Stubs.kt │ │ └── testUtils/ │ │ ├── build.gradle │ │ └── src/ │ │ ├── com/ │ │ │ └── intellij/ │ │ │ └── rt/ │ │ │ └── execution/ │ │ │ └── junit/ │ │ │ ├── FileComparisonFailure.java │ │ │ └── KnownException.kt │ │ └── org/ │ │ └── jetbrains/ │ │ └── anko/ │ │ └── test/ │ │ └── testUtils.kt │ └── props/ │ ├── annotations/ │ │ └── android/ │ │ ├── support/ │ │ │ └── v7/ │ │ │ └── widget/ │ │ │ └── annotations.xml │ │ ├── view/ │ │ │ └── annotations.xml │ │ └── widget/ │ │ └── annotations.xml │ ├── configuration.json │ ├── excluded_methods.txt │ ├── excluded_properties.txt │ ├── helper_constructors.txt │ ├── imports_properties.txt │ ├── imports_sqliteparserhelpers.txt │ ├── imports_views.txt │ ├── kotlin-android-sdk-annotations-1.0.0.jar │ ├── properties_without_getters.txt │ └── templates/ │ ├── complex_listener.twig │ ├── complex_listener_coroutines.twig │ ├── layout.twig │ ├── services.twig │ ├── simple_listener.mustache │ ├── simple_listener_coroutines.twig │ ├── sql_parser_helpers.twig │ └── view.mustache ├── build.gradle ├── download_android_sdk.xml ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── update_dependencies.xml └── update_dependencies_idea.xml
SYMBOL INDEX (23 symbols across 4 files)
FILE: anko/idea-plugin/xml-converter/test/org/jetbrains/kotlin/android/xmlconverter/BaseXmlConverterTest.java
class BaseXmlConverterTest (line 14) | public class BaseXmlConverterTest {
method doLayoutTest (line 19) | protected void doLayoutTest() {
method decapitalize (line 39) | private String decapitalize(String original) {
FILE: anko/library/generator/test/org/jetbrains/android/anko/ClassTreeTest.java
class ClassTreeTest (line 29) | public class ClassTreeTest extends Assert {
method setUp (line 34) | @Before
method doAdd (line 51) | private void doAdd(ClassTree target) {
method testAdd (line 57) | @Test
method testIsChild (line 63) | @Test
method testIsSuccessorOf (line 72) | @Test
method testNoSuchClassException (line 90) | @Test(expected = NoSuchClassException.class)
method testTreeIterator (line 98) | @Test
method createNode (line 111) | private static ClassNode createNode(String name, String superName) {
FILE: anko/library/static/sqlite/src/main/java/org/jetbrains/anko/db/JavaSqliteUtils.java
class JavaSqliteUtils (line 7) | class JavaSqliteUtils {
method JavaSqliteUtils (line 8) | private JavaSqliteUtils() {}
method wrap (line 10) | @SuppressWarnings("unchecked")
method newInstance (line 30) | static <T> T newInstance(Constructor<T> constructor, Object[] argument...
FILE: anko/library/testUtils/src/com/intellij/rt/execution/junit/FileComparisonFailure.java
class FileComparisonFailure (line 10) | public class FileComparisonFailure extends ComparisonFailure implements ...
method FileComparisonFailure (line 16) | public FileComparisonFailure(String message, String expected, String a...
method FileComparisonFailure (line 20) | public FileComparisonFailure(String message, String expected, String a...
method getFilePath (line 28) | public String getFilePath() {
method getActualFilePath (line 32) | public String getActualFilePath() {
method getExpected (line 36) | public String getExpected() {
method getActual (line 40) | public String getActual() {
Condensed preview — 396 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,051K chars).
[
{
"path": ".gitignore",
"chars": 111,
"preview": "/dependencies/\n/ideaSDK/\nbuild/\n.DS_Store\n*.iml\n.gradle\n/out\n.idea/*\n!.idea/runConfigurations\nlocal.properties\n"
},
{
"path": ".idea/runConfigurations/Android_Studio.xml",
"chars": 3163,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"Android Studio\" type=\"Applica"
},
{
"path": "CHANGELOG.md",
"chars": 15123,
"preview": "## Change Log\n\n### Anko 0.10.5 *(2018-04-28)*\n\n- [DSL for ConstraintLayout](https://github.com/Kotlin/anko/wiki/Constrai"
},
{
"path": "GOODBYE.md",
"chars": 2812,
"preview": "# Discontinuing Anko\n\nOver the last few months, we have received quite a few questions from our users regarding the futu"
},
{
"path": "LICENSE",
"chars": 11325,
"preview": "Apache License\n Version 2.0, January 2004\n http://www.apache.org/licens"
},
{
"path": "README.md",
"chars": 7342,
"preview": "[](https://confluence.jetbrains.com/display/ALL/JetBrain"
},
{
"path": "anko/idea-plugin/attrs/build.gradle",
"chars": 247,
"preview": "apply plugin: 'kotlin'\n\nsourceSets {\n main {\n java.srcDirs = ['src']\n kotlin.srcDirs = ['src']\n }\n}\n"
},
{
"path": "anko/idea-plugin/attrs/src/org/jetbrains/kotlin/android/Attrs.kt",
"chars": 1362,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/build.gradle",
"chars": 317,
"preview": "subprojects {\n apply plugin: 'kotlin'\n\n sourceSets {\n main {\n java.srcDirs = ['src', 'resources'"
},
{
"path": "anko/idea-plugin/idea-runner/build.gradle",
"chars": 126,
"preview": "apply plugin: 'java'\n\ndependencies {\n compile fileTree(dir: new File(project.rootDir, \"ideaSDK/lib\"), include: ['*.ja"
},
{
"path": "anko/idea-plugin/intentions/build.gradle",
"chars": 247,
"preview": "apply plugin: 'kotlin'\n\nsourceSets {\n main {\n java.srcDirs = ['src']\n kotlin.srcDirs = ['src']\n }\n}\n"
},
{
"path": "anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/AnkoIntention.kt",
"chars": 6129,
"preview": "package org.jetbrains.anko.idea.intentions\n\nimport com.intellij.openapi.editor.Editor\nimport com.intellij.psi.PsiElement"
},
{
"path": "anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/FindViewByIdIntention.kt",
"chars": 2104,
"preview": "package org.jetbrains.anko.idea.intentions\n\nimport com.intellij.psi.PsiElement\nimport org.jetbrains.kotlin.idea.caches.r"
},
{
"path": "anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/ReplaceColorGrayOpaqueIntention.kt",
"chars": 3456,
"preview": "package org.jetbrains.anko.idea.intentions\n\nimport org.jetbrains.kotlin.psi.*\n\nclass ReplaceColorGrayOpaqueIntention : A"
},
{
"path": "anko/idea-plugin/intentions/src/org/jetbrains/anko/idea/intentions/ToastMakeTextShowIntention.kt",
"chars": 2397,
"preview": "/*\n * Copyright 2010-2015 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you "
},
{
"path": "anko/idea-plugin/plugin-classpath/build.gradle",
"chars": 345,
"preview": "apply plugin: 'java'\n\ndependencies {\n compile fileTree(dir: new File(project.rootDir, \"ideaSDK/lib\"), include: ['*.ja"
},
{
"path": "anko/idea-plugin/preview/build.gradle",
"chars": 715,
"preview": "apply plugin: 'com.github.johnrengelman.shadow'\napply plugin: 'kotlin'\n\nsourceSets {\n main {\n java.srcDirs = ["
},
{
"path": "anko/idea-plugin/preview/resources/META-INF/plugin.xml",
"chars": 2015,
"preview": "<idea-plugin>\n <id>org.jetbrains.kotlin.android.dsl</id>\n <name>Anko Support</name>\n <description>Anko Android "
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/FindViewByIdIntention/after.kt.template",
"chars": 25,
"preview": "find<TextView>(R.id.name)"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/FindViewByIdIntention/before.kt.template",
"chars": 35,
"preview": "findViewById(R.id.name) as TextView"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/FindViewByIdIntention/description.html",
"chars": 129,
"preview": "<html>\n<body>\nThis intention replaces 'findViewById() as T' method call with 'find<T>' that is available in Anko.\n</body"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/ReplaceColorGrayOpaqueIntention/after.kt.template",
"chars": 16,
"preview": "0xCC.gray.opaque"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/ReplaceColorGrayOpaqueIntention/before.kt.template",
"chars": 18,
"preview": "0xFFCCCCCC.toInt()"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/ReplaceColorGrayOpaqueIntention/description.html",
"chars": 164,
"preview": "<html>\n<body>\nThis intention replaces numeric literals representing Android colors with ones that use Anko `gray` and `o"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/ToastMakeTextShowIntention/after.kt.template",
"chars": 16,
"preview": "toast(\"Message\")"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/ToastMakeTextShowIntention/before.kt.template",
"chars": 58,
"preview": "Toast.makeText(this, \"Message\", Toast.LENGTH_SHORT).show()"
},
{
"path": "anko/idea-plugin/preview/resources/intentionDescriptions/ToastMakeTextShowIntention/description.html",
"chars": 175,
"preview": "<html>\n<body>\nThis intention replaces 'Toast.makeText(ctx, text, length).show()' method call with 'toast(text)' or 'long"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/AnkoNlPreviewManager.kt",
"chars": 7970,
"preview": "package org.jetbrains.kotlin.android.dslpreview\n\nimport com.android.tools.idea.common.model.NlModel\nimport com.android.t"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/AnkoViewLoaderExtension.kt",
"chars": 4972,
"preview": "package org.jetbrains.kotlin.android.dslpreview\n\nimport org.jetbrains.android.uipreview.ViewLoaderExtension\nimport org.j"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/DslPreviewClassResolver.kt",
"chars": 7646,
"preview": "package org.jetbrains.kotlin.android.dslpreview\n\nimport com.intellij.openapi.application.ApplicationManager\nimport com.i"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/LayoutPsiFile.kt",
"chars": 28183,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/PreviewClassDescription.kt",
"chars": 1566,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/SourceFileModificationTracker.kt",
"chars": 1760,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/preview/src/org/jetbrains/kotlin/android/dslpreview/UpdateActivityNameTask.kt",
"chars": 2753,
"preview": "package org.jetbrains.kotlin.android.dslpreview\n\nimport com.intellij.openapi.fileEditor.FileEditorManager\nimport com.int"
},
{
"path": "anko/idea-plugin/xml-converter/build.gradle",
"chars": 434,
"preview": "apply plugin: 'kotlin'\n\nsourceSets {\n main {\n java.srcDirs = ['src']\n kotlin.srcDirs = ['src']\n }\n "
},
{
"path": "anko/idea-plugin/xml-converter/resources/attrs.json",
"chars": 222026,
"preview": "{\n \"free\": [\n {\n \"name\": \"textSize\",\n \"format\": [\n \"dimension\"\n ]\n },\n {\n \"name\": \""
},
{
"path": "anko/idea-plugin/xml-converter/resources/views.json",
"chars": 2488,
"preview": "{\"DigitalClock\":[\"TextView\"],\"Chronometer\":[\"TextView\"],\"EditText\":[\"TextView\"],\"Button\":[\"TextView\"],\"CheckedTextView\":"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/AttributeOptimizer.kt",
"chars": 1656,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/AttributeParser.kt",
"chars": 4439,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/ConvertAction.kt",
"chars": 6412,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/LayoutAttributeRenderer.kt",
"chars": 3512,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/Util.kt",
"chars": 2060,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/ViewAttributeRenderer.kt",
"chars": 5626,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/src/org/jetbrains/kotlin/android/xmlconverter/XmlConverter.kt",
"chars": 5569,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/idea-plugin/xml-converter/test/org/jetbrains/kotlin/android/xmlconverter/BaseXmlConverterTest.java",
"chars": 1476,
"preview": "package org.jetbrains.kotlin.android.xmlconverter;\n\nimport static kotlin.collections.SetsKt.setOf;\nimport static kotlin."
},
{
"path": "anko/idea-plugin/xml-converter/test/org/jetbrains/kotlin/android/xmlconverter/XmlConverterTest.kt",
"chars": 369,
"preview": "package org.jetbrains.kotlin.android.xmlconverter\n\nimport org.junit.Test\n\nclass XmlConverterTest : BaseXmlConverterTest("
},
{
"path": "anko/idea-plugin/xml-converter/testData/attributes/layout.kt",
"chars": 758,
"preview": "frameLayout {\n textView(\"Text\") {\n backgroundColor = 0xff0000.opaque\n enabled = false\n hint = \"H"
},
{
"path": "anko/idea-plugin/xml-converter/testData/attributes/layout.xml",
"chars": 1301,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "anko/idea-plugin/xml-converter/testData/dimensions/layout.kt",
"chars": 263,
"preview": "linearLayout {\n button.lparams(width = wrapContent, height = wrapContent) {\n leftMargin = dip(0.5f)\n to"
},
{
"path": "anko/idea-plugin/xml-converter/testData/dimensions/layout.xml",
"chars": 767,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "anko/idea-plugin/xml-converter/testData/linearLayout/layout.kt",
"chars": 295,
"preview": "linearLayout {\n button.lparams(width = matchParent, height = wrapContent) {\n gravity = Gravity.END\n bot"
},
{
"path": "anko/idea-plugin/xml-converter/testData/linearLayout/layout.xml",
"chars": 665,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "anko/idea-plugin/xml-converter/testData/relativeLayout/layout.kt",
"chars": 370,
"preview": "relativeLayout {\n button {\n id = Ids.button1\n }.lparams(width = matchParent, height = wrapContent) {\n "
},
{
"path": "anko/idea-plugin/xml-converter/testData/relativeLayout/layout.xml",
"chars": 821,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "anko/idea-plugin/xml-converter/testData/simple/layout.kt",
"chars": 136,
"preview": "linearLayout {\n orientation = LinearLayout.VERTICAL\n\n textView(\"Hello World\").lparams(width = matchParent, height "
},
{
"path": "anko/idea-plugin/xml-converter/testData/simple/layout.xml",
"chars": 423,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "anko/library/generated/anko/build.gradle",
"chars": 384,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':generate"
},
{
"path": "anko/library/generated/anko/src/main/AndroidManifest.xml",
"chars": 124,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.anko\">\n <application/>\n</manif"
},
{
"path": "anko/library/generated/appcompat-v7/build.gradle",
"chars": 224,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:appcompat-v7:$SUPPORT_ARTIFACT_VERSION\"\n"
},
{
"path": "anko/library/generated/appcompat-v7/src/main/AndroidManifest.xml",
"chars": 131,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.appcompatV7\">\n <application/>\n"
},
{
"path": "anko/library/generated/appcompat-v7/src/main/java/Layouts.kt",
"chars": 34378,
"preview": "@file:JvmName(\"AppcompatV7LayoutsKt\")\npackage org.jetbrains.anko.appcompat.v7\n\n\nimport android.content.Context\nimport an"
},
{
"path": "anko/library/generated/appcompat-v7/src/main/java/Properties.kt",
"chars": 1415,
"preview": "@file:JvmName(\"AppcompatV7PropertiesKt\")\npackage org.jetbrains.anko.appcompat.v7\n\nimport org.jetbrains.anko.*\n\nimport or"
},
{
"path": "anko/library/generated/appcompat-v7/src/main/java/Views.kt",
"chars": 67975,
"preview": "@file:JvmName(\"AppcompatV7ViewsKt\")\npackage org.jetbrains.anko.appcompat.v7\n\nimport org.jetbrains.anko.custom.*\nimport o"
},
{
"path": "anko/library/generated/appcompat-v7-commons/build.gradle",
"chars": 218,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:support-v4:$SUPPORT_ARTIFACT_VERSION\"\n "
},
{
"path": "anko/library/generated/appcompat-v7-commons/src/main/AndroidManifest.xml",
"chars": 137,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.appcompatV7Common\">\n <applicat"
},
{
"path": "anko/library/generated/appcompat-v7-coroutines/build.gradle",
"chars": 319,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/appcompat-v7-coroutines/src/main/AndroidManifest.xml",
"chars": 142,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.appcompatV7.coroutines\">\n <app"
},
{
"path": "anko/library/generated/appcompat-v7-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 6889,
"preview": "@file:JvmName(\"AppcompatV7CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.appcompat.v7.coroutines\n\n\nimp"
},
{
"path": "anko/library/generated/appcompat-v7-listeners/build.gradle",
"chars": 232,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:appcompat-v7:$SUPPORT_ARTIFACT_VERSION\"\n"
},
{
"path": "anko/library/generated/appcompat-v7-listeners/src/main/AndroidManifest.xml",
"chars": 141,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.appcompatV7.listeners\">\n <appl"
},
{
"path": "anko/library/generated/appcompat-v7-listeners/src/main/java/Listeners.kt",
"chars": 3097,
"preview": "@file:JvmName(\"AppcompatV7ListenersListenersKt\")\npackage org.jetbrains.anko.appcompat.v7.listeners\n\n\ninline fun android."
},
{
"path": "anko/library/generated/cardview-v7/build.gradle",
"chars": 164,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:cardview-v7:$SUPPORT_ARTIFACT_VERSION\"\n "
},
{
"path": "anko/library/generated/cardview-v7/src/main/AndroidManifest.xml",
"chars": 130,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.cardviewV7\">\n <application/>\n<"
},
{
"path": "anko/library/generated/cardview-v7/src/main/java/Layouts.kt",
"chars": 4142,
"preview": "@file:JvmName(\"CardviewV7LayoutsKt\")\npackage org.jetbrains.anko.cardview.v7\n\n\nimport android.content.Context\nimport andr"
},
{
"path": "anko/library/generated/cardview-v7/src/main/java/Views.kt",
"chars": 2401,
"preview": "@file:JvmName(\"CardviewV7ViewsKt\")\npackage org.jetbrains.anko.cardview.v7\n\nimport org.jetbrains.anko.custom.*\nimport org"
},
{
"path": "anko/library/generated/common/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/common/src/main/AndroidManifest.xml",
"chars": 126,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.common\">\n <application/>\n</man"
},
{
"path": "anko/library/generated/commons/build.gradle",
"chars": 93,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':static:commons-base')\n}\n"
},
{
"path": "anko/library/generated/commons/src/main/AndroidManifest.xml",
"chars": 127,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.commons\">\n <application/>\n</ma"
},
{
"path": "anko/library/generated/constraint-layout/build.gradle",
"chars": 241,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support.constraint:constraint-layout:$CONSTRAINT"
},
{
"path": "anko/library/generated/constraint-layout/src/main/AndroidManifest.xml",
"chars": 138,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.constraint.layout\">\n <applicat"
},
{
"path": "anko/library/generated/constraint-layout/src/main/java/Layouts.kt",
"chars": 2957,
"preview": "@file:JvmName(\"ConstraintLayoutLayoutsKt\")\npackage org.jetbrains.anko.constraint.layout\n\n\nimport android.support.constra"
},
{
"path": "anko/library/generated/constraint-layout/src/main/java/Views.kt",
"chars": 6018,
"preview": "@file:JvmName(\"ConstraintLayoutViewsKt\")\npackage org.jetbrains.anko.constraint.layout\n\nimport org.jetbrains.anko.custom."
},
{
"path": "anko/library/generated/coroutines/build.gradle",
"chars": 205,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/coroutines/src/main/AndroidManifest.xml",
"chars": 130,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.coroutines\">\n <application/>\n<"
},
{
"path": "anko/library/generated/coroutines/src/main/java/bg.kt",
"chars": 1122,
"preview": "/**\n * Created by yan on 15/03/2017.\n */\n/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, "
},
{
"path": "anko/library/generated/coroutines/src/main/java/weakReferenceSupport.kt",
"chars": 1200,
"preview": "/*\n * Copyright 2016 JetBrains s.r.o.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "anko/library/generated/design/build.gradle",
"chars": 198,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:design:$SUPPORT_ARTIFACT_VERSION\"\n ap"
},
{
"path": "anko/library/generated/design/src/main/AndroidManifest.xml",
"chars": 126,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.design\">\n <application/>\n</man"
},
{
"path": "anko/library/generated/design/src/main/java/Layouts.kt",
"chars": 23246,
"preview": "@file:JvmName(\"DesignLayoutsKt\")\npackage org.jetbrains.anko.design\n\n\nimport android.content.Context\nimport android.util."
},
{
"path": "anko/library/generated/design/src/main/java/Properties.kt",
"chars": 712,
"preview": "@file:JvmName(\"DesignPropertiesKt\")\npackage org.jetbrains.anko.design\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains"
},
{
"path": "anko/library/generated/design/src/main/java/Views.kt",
"chars": 19654,
"preview": "@file:JvmName(\"DesignViewsKt\")\npackage org.jetbrains.anko.design\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrain"
},
{
"path": "anko/library/generated/design-coroutines/build.gradle",
"chars": 246,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/design-coroutines/src/main/AndroidManifest.xml",
"chars": 137,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.design.coroutines\">\n <applicat"
},
{
"path": "anko/library/generated/design-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 4754,
"preview": "@file:JvmName(\"DesignCoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.design.coroutines\n\n\nimport kotlin."
},
{
"path": "anko/library/generated/design-listeners/build.gradle",
"chars": 159,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:design:$SUPPORT_ARTIFACT_VERSION\"\n ap"
},
{
"path": "anko/library/generated/design-listeners/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.design.listeners\">\n <applicati"
},
{
"path": "anko/library/generated/design-listeners/src/main/java/Listeners.kt",
"chars": 3044,
"preview": "@file:JvmName(\"DesignListenersListenersKt\")\npackage org.jetbrains.anko.design.listeners\n\n\ninline fun android.support.des"
},
{
"path": "anko/library/generated/gridlayout-v7/build.gradle",
"chars": 166,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:gridlayout-v7:$SUPPORT_ARTIFACT_VERSION\""
},
{
"path": "anko/library/generated/gridlayout-v7/src/main/AndroidManifest.xml",
"chars": 132,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.gridlayoutV7\">\n <application/>"
},
{
"path": "anko/library/generated/gridlayout-v7/src/main/java/Layouts.kt",
"chars": 3618,
"preview": "@file:JvmName(\"GridlayoutV7LayoutsKt\")\npackage org.jetbrains.anko.gridlayout.v7\n\n\nimport android.support.v7.widget.GridL"
},
{
"path": "anko/library/generated/gridlayout-v7/src/main/java/Views.kt",
"chars": 2507,
"preview": "@file:JvmName(\"GridlayoutV7ViewsKt\")\npackage org.jetbrains.anko.gridlayout.v7\n\nimport org.jetbrains.anko.custom.*\nimport"
},
{
"path": "anko/library/generated/percent/build.gradle",
"chars": 160,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:percent:$SUPPORT_ARTIFACT_VERSION\"\n a"
},
{
"path": "anko/library/generated/percent/src/main/AndroidManifest.xml",
"chars": 127,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.percent\">\n <application/>\n</ma"
},
{
"path": "anko/library/generated/percent/src/main/java/Layouts.kt",
"chars": 7558,
"preview": "@file:JvmName(\"PercentLayoutsKt\")\npackage org.jetbrains.anko.percent\n\n\nimport android.content.Context\nimport android.uti"
},
{
"path": "anko/library/generated/percent/src/main/java/Views.kt",
"chars": 5295,
"preview": "@file:JvmName(\"PercentViewsKt\")\npackage org.jetbrains.anko.percent\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbra"
},
{
"path": "anko/library/generated/recyclerview-v7/build.gradle",
"chars": 168,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:recyclerview-v7:$SUPPORT_ARTIFACT_VERSIO"
},
{
"path": "anko/library/generated/recyclerview-v7/src/main/AndroidManifest.xml",
"chars": 134,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.recyclerviewV7\">\n <application"
},
{
"path": "anko/library/generated/recyclerview-v7/src/main/java/Layouts.kt",
"chars": 3312,
"preview": "@file:JvmName(\"RecyclerviewV7LayoutsKt\")\npackage org.jetbrains.anko.recyclerview.v7\n\n\nimport android.content.Context\nimp"
},
{
"path": "anko/library/generated/recyclerview-v7/src/main/java/Views.kt",
"chars": 2613,
"preview": "@file:JvmName(\"RecyclerviewV7ViewsKt\")\npackage org.jetbrains.anko.recyclerview.v7\n\nimport org.jetbrains.anko.custom.*\nim"
},
{
"path": "anko/library/generated/recyclerview-v7-coroutines/build.gradle",
"chars": 255,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/recyclerview-v7-coroutines/src/main/AndroidManifest.xml",
"chars": 145,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.recyclerviewV7.coroutines\">\n <"
},
{
"path": "anko/library/generated/recyclerview-v7-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 4322,
"preview": "@file:JvmName(\"RecyclerviewV7CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.recyclerview.v7.coroutines"
},
{
"path": "anko/library/generated/recyclerview-v7-listeners/build.gradle",
"chars": 168,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"com.android.support:recyclerview-v7:$SUPPORT_ARTIFACT_VERSIO"
},
{
"path": "anko/library/generated/recyclerview-v7-listeners/src/main/AndroidManifest.xml",
"chars": 144,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.recyclerviewV7.listeners\">\n <a"
},
{
"path": "anko/library/generated/recyclerview-v7-listeners/src/main/java/Listeners.kt",
"chars": 2855,
"preview": "@file:JvmName(\"RecyclerviewV7ListenersListenersKt\")\npackage org.jetbrains.anko.recyclerview.v7.listeners\n\n\nfun android.s"
},
{
"path": "anko/library/generated/sdk15/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk15/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk15\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk15/src/main/java/Layouts.kt",
"chars": 54733,
"preview": "@file:JvmName(\"Sdk15LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk15/src/main/java/Properties.kt",
"chars": 6124,
"preview": "@file:JvmName(\"Sdk15PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk15/src/main/java/Services.kt",
"chars": 5173,
"preview": "@file:JvmName(\"Sdk15ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk15/src/main/java/Views.kt",
"chars": 106313,
"preview": "@file:JvmName(\"Sdk15ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk15-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk15-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk15.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk15-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 34113,
"preview": "@file:JvmName(\"Sdk15CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk15.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk15-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk15-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk15.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk15-listeners/src/main/java/Listeners.kt",
"chars": 18977,
"preview": "@file:JvmName(\"Sdk15ListenersListenersKt\")\npackage org.jetbrains.anko.sdk15.listeners\n\n\ninline fun android.view.View.onL"
},
{
"path": "anko/library/generated/sdk19/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk19/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk19\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk19/src/main/java/Layouts.kt",
"chars": 60211,
"preview": "@file:JvmName(\"Sdk19LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk19/src/main/java/Properties.kt",
"chars": 4159,
"preview": "@file:JvmName(\"Sdk19PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk19/src/main/java/Services.kt",
"chars": 6970,
"preview": "@file:JvmName(\"Sdk19ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk19/src/main/java/Views.kt",
"chars": 107795,
"preview": "@file:JvmName(\"Sdk19ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk19-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk19-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk19.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk19-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 34808,
"preview": "@file:JvmName(\"Sdk19CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk19.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk19-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk19-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk19.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk19-listeners/src/main/java/Listeners.kt",
"chars": 19244,
"preview": "@file:JvmName(\"Sdk19ListenersListenersKt\")\npackage org.jetbrains.anko.sdk19.listeners\n\n\ninline fun android.view.View.onL"
},
{
"path": "anko/library/generated/sdk21/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk21/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk21\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk21/src/main/java/Layouts.kt",
"chars": 67639,
"preview": "@file:JvmName(\"Sdk21LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk21/src/main/java/Properties.kt",
"chars": 5315,
"preview": "@file:JvmName(\"Sdk21PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk21/src/main/java/Services.kt",
"chars": 8495,
"preview": "@file:JvmName(\"Sdk21ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk21/src/main/java/Views.kt",
"chars": 113433,
"preview": "@file:JvmName(\"Sdk21ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk21-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk21-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk21.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk21-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 36453,
"preview": "@file:JvmName(\"Sdk21CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk21.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk21-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk21-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk21.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk21-listeners/src/main/java/Listeners.kt",
"chars": 19894,
"preview": "@file:JvmName(\"Sdk21ListenersListenersKt\")\npackage org.jetbrains.anko.sdk21.listeners\n\n\ninline fun android.view.View.onL"
},
{
"path": "anko/library/generated/sdk23/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk23/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk23\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk23/src/main/java/Layouts.kt",
"chars": 67639,
"preview": "@file:JvmName(\"Sdk23LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk23/src/main/java/Properties.kt",
"chars": 5518,
"preview": "@file:JvmName(\"Sdk23PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk23/src/main/java/Services.kt",
"chars": 9610,
"preview": "@file:JvmName(\"Sdk23ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk23/src/main/java/Views.kt",
"chars": 113433,
"preview": "@file:JvmName(\"Sdk23ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk23-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk23-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk23.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk23-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 37275,
"preview": "@file:JvmName(\"Sdk23CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk23.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk23-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk23-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk23.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk23-listeners/src/main/java/Listeners.kt",
"chars": 20213,
"preview": "@file:JvmName(\"Sdk23ListenersListenersKt\")\npackage org.jetbrains.anko.sdk23.listeners\n\n\ninline fun android.view.View.onL"
},
{
"path": "anko/library/generated/sdk25/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk25/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk25\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk25/src/main/java/Layouts.kt",
"chars": 67639,
"preview": "@file:JvmName(\"Sdk25LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk25/src/main/java/Properties.kt",
"chars": 5749,
"preview": "@file:JvmName(\"Sdk25PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk25/src/main/java/Services.kt",
"chars": 10314,
"preview": "@file:JvmName(\"Sdk25ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk25/src/main/java/Views.kt",
"chars": 113433,
"preview": "@file:JvmName(\"Sdk25ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk25-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk25-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk25.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk25-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 37275,
"preview": "@file:JvmName(\"Sdk25CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk25.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk25-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk25-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk25.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk25-listeners/src/main/java/Listeners.kt",
"chars": 20213,
"preview": "@file:JvmName(\"Sdk25ListenersListenersKt\")\npackage org.jetbrains.anko.sdk25.listeners\n\n\ninline fun android.view.View.onL"
},
{
"path": "anko/library/generated/sdk27/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk27/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk27\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk27/src/main/java/Layouts.kt",
"chars": 67639,
"preview": "@file:JvmName(\"Sdk27LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk27/src/main/java/Properties.kt",
"chars": 5749,
"preview": "@file:JvmName(\"Sdk27PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk27/src/main/java/Services.kt",
"chars": 11297,
"preview": "@file:JvmName(\"Sdk27ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk27/src/main/java/Views.kt",
"chars": 113433,
"preview": "@file:JvmName(\"Sdk27ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk27-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk27-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk27.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk27-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 38145,
"preview": "@file:JvmName(\"Sdk27CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk27.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk27-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk27-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk27.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk27-listeners/src/main/java/Listeners.kt",
"chars": 20576,
"preview": "@file:JvmName(\"Sdk27ListenersListenersKt\")\npackage org.jetbrains.anko.sdk27.listeners\n\n\ninline fun android.view.View.onL"
},
{
"path": "anko/library/generated/sdk28/build.gradle",
"chars": 137,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n api project(':static:p"
},
{
"path": "anko/library/generated/sdk28/src/main/AndroidManifest.xml",
"chars": 125,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk28\">\n <application/>\n</mani"
},
{
"path": "anko/library/generated/sdk28/src/main/java/Layouts.kt",
"chars": 67639,
"preview": "@file:JvmName(\"Sdk28LayoutsKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.util.Attribut"
},
{
"path": "anko/library/generated/sdk28/src/main/java/Properties.kt",
"chars": 5749,
"preview": "@file:JvmName(\"Sdk28PropertiesKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.*\n\nimport org.jetbrains.anko.in"
},
{
"path": "anko/library/generated/sdk28/src/main/java/Services.kt",
"chars": 11493,
"preview": "@file:JvmName(\"Sdk28ServicesKt\")\npackage org.jetbrains.anko\n\n\nimport android.content.Context\nimport android.view.accessi"
},
{
"path": "anko/library/generated/sdk28/src/main/java/Views.kt",
"chars": 113433,
"preview": "@file:JvmName(\"Sdk28ViewsKt\")\npackage org.jetbrains.anko\n\nimport org.jetbrains.anko.custom.*\nimport org.jetbrains.anko.A"
},
{
"path": "anko/library/generated/sdk28-coroutines/build.gradle",
"chars": 183,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_co"
},
{
"path": "anko/library/generated/sdk28-coroutines/src/main/AndroidManifest.xml",
"chars": 136,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk28.coroutines\">\n <applicati"
},
{
"path": "anko/library/generated/sdk28-coroutines/src/main/java/ListenersWithCoroutines.kt",
"chars": 38561,
"preview": "@file:JvmName(\"Sdk28CoroutinesListenersWithCoroutinesKt\")\npackage org.jetbrains.anko.sdk28.coroutines\n\n\nimport kotlin.co"
},
{
"path": "anko/library/generated/sdk28-listeners/build.gradle",
"chars": 96,
"preview": "apply from: '../../library.gradle'\n\ndependencies {\n api project(':generated:anko-commons')\n}\n"
},
{
"path": "anko/library/generated/sdk28-listeners/src/main/AndroidManifest.xml",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"org.jetbrains.anko.generated.sdk28.listeners\">\n <applicatio"
},
{
"path": "anko/library/generated/sdk28-listeners/src/main/java/Listeners.kt",
"chars": 20745,
"preview": "@file:JvmName(\"Sdk28ListenersListenersKt\")\npackage org.jetbrains.anko.sdk28.listeners\n\n\ninline fun android.view.View.onL"
}
]
// ... and 196 more files (download for full content)
About this extraction
This page contains the full source code of the Kotlin/anko GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 396 files (2.8 MB), approximately 754.4k tokens, and a symbol index with 23 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.