Coder Social home page Coder Social logo

marcinmoskala / activitystarter Goto Github PK

View Code? Open in Web Editor NEW
431.0 15.0 31.0 697 KB

Simple Android Library, that provides easy way to start the Activities with arguments.

Home Page: http://marcinmoskala.com/ActivityStarter/

License: Apache License 2.0

Java 6.10% Kotlin 93.66% Shell 0.24%
android android-library kotlin kotlin-android activity

activitystarter's People

Contributors

johncarl81 avatar marcinmoskala avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

activitystarter's Issues

Create private String KEY

Make all string keys as constant field public static final

  1. for example in this
    public static final String KEY_ITEM = "com.example.activities.mItemStarterKey"
  2. NB: in activity item is called:
    @Arg MediaMetadataCompat mItem
    So add an annotation to customize prefix to avoid adding prefix to KEY for example:
    like it is in lombok @Accessor(prefix="m") @Arg MediaMetadataCompat mItem
    or
    @Arg(prefix="m") MediaMetadataCompat mItem
// Generated code from ActivityStarter. Do not modify!
public final class FullScreenPlayerActivityStarter {
  /**
   * This is method used to fill fields. Use it by calling ActivityStarter.fill(this). */
  public static void fill(FullScreenPlayerActivity activity, Bundle savedInstanceState) {
    Intent intent = activity.getIntent();
    if(savedInstanceState != null && savedInstanceState.containsKey("com.example.activities.mItemStarterKey")) {
    activity.mItem = (android.support.v4.media.MediaMetadataCompat) savedInstanceState.getParcelable("com.example.activities.mItemStarterKey");
    } else {
    if(intent.hasExtra("com.example.activities.mItemStarterKey")) activity.mItem = (android.support.v4.media.MediaMetadataCompat) intent.getParcelableExtra("com.example.activities.mItemStarterKey");
    }
  }

  public static void save(FullScreenPlayerActivity activity, Bundle bundle) {
    bundle.putParcelable("com.example.activities.mItemStarterKey", activity.mItem);
  }

  public static Intent getIntent(Context context, MediaMetadataCompat mItem) {
    Intent intent = new Intent(context, FullScreenPlayerActivity.class);
    intent.putExtra("com.example.activities.mItemStarterKey", mItem);
    return intent;
  }

  public static void start(Context context, MediaMetadataCompat mItem) {
    Intent intent = getIntent(context, mItem);
    context.startActivity(intent);
  }

  public static void startWithFlags(Context context, MediaMetadataCompat mItem, int flags) {
    Intent intent = getIntent(context, mItem);
    intent.addFlags(flags);
    context.startActivity(intent);
  }

  public static Intent getIntent(Context context) {
    Intent intent = new Intent(context, FullScreenPlayerActivity.class);
    return intent;
  }

  public static void start(Context context) {
    Intent intent = getIntent(context);
    context.startActivity(intent);
  }

  public static void startWithFlags(Context context, int flags) {
    Intent intent = getIntent(context);
    intent.addFlags(flags);
    context.startActivity(intent);
  }
}

w: Runtime JAR files in the classpath should have the same version.

Hi @MarcinMoskala

Thanks for an awesome library ๐Ÿ‘ .

Unfortunately straightforward integration (as described from the README) of this library into the android app project can cause really massive influence on the DEX method count limit.

For example: here is report from the dex-count-gradle-plugin built for for the app after adding ActivityStarter kotlin library
screenshot_1

And whats more, compiler started to send such messages:

w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
    */.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.1.4-2/5d546e5fc95a44ff827425c8a756f5fdf94d79d2/kotlin-reflect-1.1.4-2.jar (version 1.1)
    */.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.2.41/d0cfb3ef897c00449e5e696355db9506225fb507/kotlin-stdlib-jdk7-1.2.41.jar (version 1.2)
    */.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.2.50/66d47b004c5b8a1d2d1df9e463187390ed741316/kotlin-stdlib-1.2.50.jar (version 1.2)
    */.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.2.50/6b19a2fcc29d34878b3aab33fd5fcf70458a73df/kotlin-stdlib-common-1.2.50.jar (version 1.2)
w: Consider providing an explicit dependency on kotlin-reflect 1.2 to prevent strange errors
w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath

I found that this was caused by transitive kotlin-reflect dependecy of activitystarter-kotlin.
To fix this you will need to mark activitystarter-kotlin dependencies as NOT transitive

Like:

implementation ("com.marcinmoskala.activitystarter:activitystarter-kotlin:1.11-beta") {
        transitive = false
}

So I will recommend to add some note to the README about this situation to avoid confusion of the the library users.

Hope this was helpful :)

Still have NoSuchElementException in 1.12-beta2

e: [kapt] An exception occurred: java.util.NoSuchElementException: Array contains no element matching the predicate.
	at activitystarter.compiler.model.classbinding.KnownClassType$Companion.getByType(KnownClassType.kt:26)
	at activitystarter.compiler.processing.ClassBindingFactory.getKnownClassType(ClassBindingFactory.kt:35)
	at activitystarter.compiler.processing.ClassBindingFactory.create(ClassBindingFactory.kt:21)
	at activitystarter.compiler.ActivityStarterProcessor.process(ActivityStarterProcessor.kt:42)
	at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:106)
	at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
	at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
	at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
	at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1039)
	at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1180)
	at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
	at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1068)
	at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:58)
	at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing$default(annotationProcessing.kt:31)
	at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.runAnnotationProcessing(Kapt3Extension.kt:223)
	at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:187)
	at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:98)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:96)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:106)
	at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:82)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:384)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:70)
	at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:375)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:123)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:159)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:57)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.java:96)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.java:52)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:93)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$1$2.invoke(CompileServiceImpl.kt:442)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$1$2.invoke(CompileServiceImpl.kt:102)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:1013)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:102)
	at org.jetbrains.kotlin.daemon.common.DummyProfiler.withMeasure(PerfUtils.kt:137)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.checkedCompile(CompileServiceImpl.kt:1055)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.doCompile(CompileServiceImpl.kt:1012)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:441)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)```

Migration to androidx

Version of activitystarter: 1.02

After migrating to androidx I noticed an error with the activitystarter compiler:

e: [kapt] An exception occurred: java.util.NoSuchElementException: Array contains no element matching the predicate.
at activitystarter.compiler.model.classbinding.KnownClassType$Companion.getByType(KnownClassType.kt:26)
at activitystarter.compiler.processing.ClassBindingFactory.getKnownClassType(ClassBindingFactory.kt:35)
at activitystarter.compiler.processing.ClassBindingFactory.create(ClassBindingFactory.kt:21)
at activitystarter.compiler.ActivityStarterProcessor.process(ActivityStarterProcessor.kt:42)`

This means that a new type of androidx.fragment.app should be added to KnownClassType.

Can't fetch data at

I want to re-fetch all args on new intent method, but ActivityStarter doesn't have method ActivityStarter.fill(Activity activity, Intent intent); , please add the method ASAP. Thanks for your lib.

  @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        ActivityStarter.fill(this,intent);

Activity State not getting restored when the activity is killed and restored

Hi

I've find a bug in the library when using ActivityStarter.save(this) in the onSaveInstanceState that causes the state to not be saved and instead restoring the App with the original Intent when setting the debug option Don't keep activities, this setting only forces the system to kill the activity, but it's a behaviour that happens in the wild.

You can see the code reproducing the bug here https://gist.github.com/danieldisu/692c11c1e9eb26a1f27a895c57209a75

Ways to reproduce:

Set "Don't keep activities" in the emulator
Init activity with 2 arguments.
Modify one argument.
Navigate to another app and go back to the app

Expected behaviour
The changed argument is changed and the other one is untouched.

Real behaviour
The arguments are the original ones

Incremental processor

Any plans for implementing incremental compilation support?
Right now it seems there are no obstacles for this. The processor can define isolating in most cases or aggregating (if there is @ActivityStarterConfig defined somewhere within the project) dynamically using the latest Gradle support.

According to this processor satisfies all the rules.

I'm just not sure if it is possible to make a processor dynamic based on the presence of an annotation. Why is it important - isolating processors are much faster. Probably a compiler flag (by a user) can signal that a user doesn't use config.

How to parse list of enum?

Error:(63, 8) error: @Arg com.example.OptionsActivity fields must extend from Serializable, Parcelable or beof typeName String, int, float, double, char or boolean. (mOptionList)

enum:

public enum Option {
FIRST(R.string.first), SECOND(R.string.second);
int titleId;
}

Activity

@MakeActivityStarter
public class OptionsActivity extends Activity{
 @Arg List<Option> mOptionList;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  ActivityStarter.fill(this);
}
}

var ArrayList of Parcelable problem

Library version 1.11-beta

There is an issue if you would try to pass an ArrayList with this library, CustomElement has annotation @parcelize and extends Parcelable.

For single element it's correctly generating fill method in x*Starter class for example it would look like:
activity.setCustomElement((CustomElement)savedInstanceState.getParcelable(CUSTOM_ELEMENT_KEY));
But for an ArrayList of this CustomElement it look like:
activity.setCustomElements(savedInstanceState.getParcelableArrayList(CUSTOM_ELEMENTS_KEY));
And Android Studio marks it as error.

MultiDex error

my build.gradle:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 26
    defaultConfig {
     ...
        minSdkVersion 19
        targetSdkVersion 26
     ...

        multiDexEnabled true

    }
  
}

dependencies {
   ...
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
...
    implementation 'com.marcinmoskala.activitystarter:activitystarter:1.00'//java
    implementation 'com.github.marcinmoskala.activitystarter:activitystarter-kotlin:1.00'//kotlin
    kapt 'com.marcinmoskala.activitystarter:activitystarter-compiler:1.00'
  ...
    implementation 'com.android.support:multidex:1.0.2'

}

Application file:

class TheApplication:MultiDexApplication() {
}

Error:

Error:Execution failed for task ':app:transformClassesWithMultidexlistForDebug'.
> java.io.IOException: Can't write [D:\AndroidProjects\sportyandroid\app\build\intermediates\multi-dex\debug\componentClasses.jar] (Can't read [C:\Users\PC\.gradle\caches\modules-2\files-2.1\com.github.marcinmoskala.activitystarter\activitystarter-annotations\1.00\b06eeff98299f198faba65192664412a26a32162\activitystarter-annotations-1.00.jar(;;;;;;**.class)] (Duplicate zip entry [activitystarter-annotations-1.00.jar:activitystarter/MakeActivityStarter.class]))

Crash on SupportFragment.onSaveInstanceState in Kotlin

Hi,

I'm getting crash like that

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putAll(android.os.Bundle)' on a null object reference
                      at pl.ownvision.habitstracker.views.fragments.GoalsFragmentStarter.save(GoalsFragmentStarter.java:14)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at activitystarter.ActivityStarter.invokeMethod(ActivityStarter.java:103)
                      at activitystarter.ActivityStarter.save(ActivityStarter.java:61)
                      at pl.ownvision.habitstracker.views.fragments.BaseFragment.onSaveInstanceState(BaseFragment.kt:32)

When trying to save InstantState of fragment in my base fragment class. Seems like ActivityStarter doesn't check if getArguments() returns null.

public static void save(GoalsFragment fragment) {
    Bundle bundle = new Bundle();
    fragment.getArguments().putAll(bundle);
  }

I'm using support libraries v27.0.1, newest stable Kotlin and newest version (1.00) of ActivityStarter.

Implement support for Parcels lib

Parcels lib:

   compile 'org.parceler:parceler-api:1.1.5'
    apt 'org.parceler:parceler:1.1.5'

For example this lib:

compile 'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
    apt 'com.hannesdorfmann.fragmentargs:processor:3.0.2'
 compile 'com.hannesdorfmann.fragmentargs:bundler-parceler:2.1.2'

Supports the parceler lib like this:

   @Arg(bundler = ParcelerArgsBundler.class) public AnyItem item;

Add please support of lib parceler

Implement method .startActivityForResult

Implement method .startActivityForResult()

for ex:

public static final int requestCode = 100;
AnyActivityStarter.startActivityForResult(this, anyItem,requestCode);

Create any IntentBuilder to avoid generation of methods

for example in activity:

    @Arg @Optional String text;
    @Arg @Optional Lond id;
    @Arg @Optional Boolean success;

sometimes is needed two of this variables, so how to create intent for two values?
you added to 0.50 generation of the methods but you can make this:

Intent intent = MusicPlayerActivityStarter.getIntentBuilder(context).text(text).id(id).build();

@Arg arguments

Why you using extra arguments for @arg annotation (for example @optional) as another annotation?
Is there a way to change it for something like

 @Arg(required = false, key = "key", etc....)
 @Arg(optional = true, etc....)

I think this way much better, because in future if you need a few more parameters for @arg you don't need to see something like this

 @Arg
 @Optional
 @ParcelerArgBundler
 @Andonemore
int variable;

Crash when using Proguard

Version: 1.12-beta-2
Log:

2021-06-14 16:30:02.682 14827-14827/com.myapp.abc E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myapp.abc, PID: 14827
    kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Property 'tab' (JVM signature: getTab()Lcom/toantran/leadership/development/ui/tab/TabFragment$Tab;) not resolved in class com.myapp.abc.ui.tab.TabFragment
        at kotlin.reflect.jvm.internal.KDeclarationContainerImpl.q(SourceFile:86)
        at kotlin.reflect.jvm.internal.KPropertyImpl$_descriptor$1.a(SourceFile:102)
        at kotlin.reflect.jvm.internal.KPropertyImpl$_descriptor$1.b(SourceFile:27)
        at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.b(SourceFile:92)
        at kotlin.reflect.jvm.internal.KPropertyImpl.x(SourceFile:105)
        at kotlin.reflect.jvm.internal.KPropertyImpl$Getter$descriptor$2.a(SourceFile:152)
        at kotlin.reflect.jvm.internal.KPropertyImpl$Getter$descriptor$2.b(SourceFile:147)
        at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.b(SourceFile:92)
        at kotlin.reflect.jvm.internal.ReflectProperties$Val.c(SourceFile:31)
        at kotlin.reflect.jvm.internal.KPropertyImpl$Getter.w(Unknown Source:7)
        at kotlin.reflect.jvm.internal.KPropertyImpl$Getter.q(SourceFile:147)
        at kotlin.reflect.jvm.internal.KCallableImpl$_annotations$1.a(SourceFile:36)
        at kotlin.reflect.jvm.internal.KCallableImpl$_annotations$1.b(SourceFile:23)
        at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.b(SourceFile:92)
        at kotlin.reflect.jvm.internal.KCallableImpl.k(SourceFile:38)
        at com.marcinmoskala.activitystarter.BoundToArgValueDelegateProvider.a(SourceFile:103)
        at com.myapp.abc.ui.tab.TabFragment.<init>(SourceFile:14)
        at com.myapp.abc.ui.tab.TabFragmentStarter.newInstance(SourceFile:30)
        at com.myapp.abc.ui.main.MainActivity.b0(SourceFile:102)
        at com.myapp.abc.ui.main.MainActivity.onCreate(SourceFile:89)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
        ```

Replace @ActivityStarterConfig(converters = { ParcelarArgConverter.class }) to @Arg(bundler = ParcelarArgConverter.class)

#4
Seems like you didn't see last answers and advices. Can you refactoring code to make this support:

@Arg(bundler = ParcelarArgConverter.class) StudentParceler mItem;

@org.parceler.Parcel
public class StudentParceler {
    private int id;
    private String name;
    private char grade;

    public StudentParceler() {
    }
}

instead of using this:

@ActivityStarterConfig(converters = { ParcelarArgConverter.class })
class MyActivity extends Activity {
@Arg StudentParceler student;
//...
}

@org.parceler.Parcel
public class StudentParceler implements IsParcel {

    private int id;
    private String name;
    private char grade;

    public StudentParceler() {
    }

//...
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.