Working with new sample application
50
app-sample/build.gradle
Normal file
@ -0,0 +1,50 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
|
||||
compileSdkVersion config['compile-sdk']
|
||||
buildToolsVersion config['build-tools']
|
||||
|
||||
defaultConfig {
|
||||
applicationId 'io.noties.markwon.app'
|
||||
minSdkVersion 23
|
||||
targetSdkVersion config['target-sdk']
|
||||
versionCode 1
|
||||
versionName version
|
||||
|
||||
resConfig 'en'
|
||||
|
||||
javaCompileOptions {
|
||||
annotationProcessorOptions {
|
||||
arguments = [
|
||||
// cannot cast GString...
|
||||
// cannot use `-`
|
||||
'markwon.samples.file': "\"${projectDir}/samples.json\"".toString()
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dexOptions {
|
||||
preDexLibraries true
|
||||
javaMaxHeapSize '5g'
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
java.srcDirs += '../sample-utils/annotations'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'io.noties:debug:5.1.0'
|
||||
annotationProcessor project(':sample-utils:processor')
|
||||
}
|
24
app-sample/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="io.noties.markwon.app">
|
||||
|
||||
<application
|
||||
android:name=".App"
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="AllowBackup,GoogleAppIndexingWarning">
|
||||
|
||||
<activity android:name=".MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
16
app-sample/src/main/java/io/noties/markwon/app/App.java
Normal file
@ -0,0 +1,16 @@
|
||||
package io.noties.markwon.app;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import io.noties.debug.AndroidLogDebugOutput;
|
||||
import io.noties.debug.Debug;
|
||||
|
||||
public class App extends Application {
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
Debug.init(new AndroidLogDebugOutput(true));
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package io.noties.markwon.app;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public class MainActivity extends Activity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
|
||||
}
|
||||
}
|
15
app-sample/src/main/java/io/noties/markwon/app/Test.java
Normal file
@ -0,0 +1,15 @@
|
||||
package io.noties.markwon.app;
|
||||
|
||||
import io.noties.markwon.sample.annotations.MarkwonArtifact;
|
||||
import io.noties.markwon.sample.annotations.MarkwonSample;
|
||||
|
||||
@MarkwonSample(
|
||||
id = "202006163161416",
|
||||
title = "The first sample title",
|
||||
description = "This is description",
|
||||
artifacts = {MarkwonArtifact.CORE, MarkwonArtifact.EDITOR},
|
||||
tags = "none"
|
||||
)
|
||||
public class Test {
|
||||
|
||||
}
|
24
app-sample/src/main/res/drawable/ic_launcher_background.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="512"
|
||||
android:viewportHeight="512">
|
||||
<path
|
||||
android:pathData="M0,0h512v256h-512z"
|
||||
android:strokeAlpha="0.94117647"
|
||||
android:strokeWidth="0.40000001"
|
||||
android:fillColor="#d7d7d7"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="1"
|
||||
android:strokeLineCap="butt"/>
|
||||
<path
|
||||
android:pathData="M0,256h512v256h-512z"
|
||||
android:strokeAlpha="0.94117647"
|
||||
android:strokeWidth="0.40000001"
|
||||
android:fillColor="#eeeeee"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="1"
|
||||
android:strokeLineCap="butt"/>
|
||||
</vector>
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
BIN
app-sample/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
app-sample/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
app-sample/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
app-sample/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
app-sample/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 6.2 KiB |
BIN
app-sample/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
app-sample/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
app-sample/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
app-sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 11 KiB |
4
app-sample/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="accent">#5CB85C</color>
|
||||
</resources>
|
4
app-sample/src/main/res/values/strings.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Markwon</string>
|
||||
</resources>
|
8
app-sample/src/main/res/values/styles.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="AppThemeBase" parent="android:Theme.Material.Light.NoActionBar">
|
||||
|
||||
</style>
|
||||
|
||||
<style name="AppTheme" parent="AppThemeBase" />
|
||||
</resources>
|
@ -0,0 +1,21 @@
|
||||
package io.noties.markwon.sample.annotations;
|
||||
|
||||
public enum MarkwonArtifact {
|
||||
CORE,
|
||||
EDITOR,
|
||||
EXT_LATEX,
|
||||
EXT_STRIKETHROUGH,
|
||||
EXT_TABLES,
|
||||
EXT_TASKLIST,
|
||||
HTML,
|
||||
IMAGE,
|
||||
IMAGE_COIL,
|
||||
IMAGE_GLIDE,
|
||||
IMAGE_PICASSO,
|
||||
INLINE_PARSER,
|
||||
LINKIFY,
|
||||
RECYCLER,
|
||||
RECYCLER_TABLE,
|
||||
SIMPLE_EXT,
|
||||
SYNTAX_HIGHLIGHT
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package io.noties.markwon.sample.annotations;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface MarkwonSample {
|
||||
/**
|
||||
* Actual format is not important, but this key must be set in order to persist sample.
|
||||
* This key should not change during lifetime of sample
|
||||
* <p>
|
||||
* {@code id} date in `YYYYMMDDHHmmss` format (UTC),
|
||||
* a simple live template can be used:
|
||||
* {@code
|
||||
* groovyScript("new Date().format('YYYYMMDDHHmmss', TimeZone.getTimeZone('UTC'))")
|
||||
* }
|
||||
*/
|
||||
String id();
|
||||
|
||||
String title();
|
||||
|
||||
String description();
|
||||
|
||||
MarkwonArtifact[] artifacts();
|
||||
|
||||
String[] tags();
|
||||
}
|
12
sample-utils/processor/build.gradle
Normal file
@ -0,0 +1,12 @@
|
||||
apply plugin: 'java-library'
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += '../annotations'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation deps['x-annotations']
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
package io.noties.markwon.sample.processor;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.processing.AbstractProcessor;
|
||||
import javax.annotation.processing.Messager;
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
import javax.annotation.processing.RoundEnvironment;
|
||||
import javax.lang.model.SourceVersion;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.tools.Diagnostic;
|
||||
|
||||
import io.noties.markwon.sample.annotations.MarkwonSample;
|
||||
|
||||
public class MarkwonSampleProcessor extends AbstractProcessor {
|
||||
|
||||
private static final String KEY_SAMPLES_FILE = "markwon.samples.file";
|
||||
|
||||
private Messager messager;
|
||||
private String samplesFilePath;
|
||||
|
||||
@Override
|
||||
public Set<String> getSupportedOptions() {
|
||||
return Collections.singleton(KEY_SAMPLES_FILE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SourceVersion getSupportedSourceVersion() {
|
||||
return SourceVersion.latest();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getSupportedAnnotationTypes() {
|
||||
return Collections.singleton(MarkwonSample.class.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void init(ProcessingEnvironment processingEnvironment) {
|
||||
super.init(processingEnvironment);
|
||||
|
||||
messager = processingEnvironment.getMessager();
|
||||
samplesFilePath = processingEnvironment.getOptions().get(KEY_SAMPLES_FILE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
|
||||
if (!roundEnvironment.processingOver()) {
|
||||
final Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(MarkwonSample.class);
|
||||
if (elements != null) {
|
||||
for (Element element : elements) {
|
||||
process(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void process(@NonNull Element element) {
|
||||
messager.printMessage(Diagnostic.Kind.WARNING, samplesFilePath, element);
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
io.noties.markwon.sample.processor.MarkwonSampleProcessor
|
@ -18,3 +18,6 @@ include ':app', ':sample',
|
||||
':markwon-simple-ext',
|
||||
':markwon-syntax-highlight',
|
||||
':markwon-test-span'
|
||||
|
||||
include ':app-sample'
|
||||
include ':sample-utils:processor'
|
||||
|