Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Sortie de ma dernière application

24 septembre 2017 à 22:03:08

Salut tout le monde ! Dernièrement, histoire de prendre en main kotlin, je me suis lancé dans une petite application qui avait pour but de recenser les conférences parlant de la programmation histoire d'avoir un truc sous la main pour faire un peu de veille technologique.


Au final, l'application a pris un peu plus d'ampleur que prévu, que ce soit au niveau du contenu mais également du côté apprentissage car en plus de m'essayer à kotlin, j'ai également décidé de tester les librairies "architecture components" : https://developer.android.com/topic/libraries/architecture/index.html et surtout d'utiliser plus intensément RxJava. Pour infos, côté backend j'utilise Laravel.

Du coup l'application comporte maintenant en plus des conférences, des articles, des tutos et des bouquins. 

Si vous voulez l'essayer, voici le lien :

https://play.google.com/store/apps/details?id=justme.application.com.newconfapp

Ciao et bonne journée ;) !

-
Edité par IpProg 26 septembre 2017 à 15:35:15

  • Partager sur Facebook
  • Partager sur Twitter
26 septembre 2017 à 12:57:25

Salut IpProg,

Je trouve ton application géniale!

Passer par un moteur de recherche pour avoir accès au savoir, c'est trop long et on s'y perd souvent.

Je pense avoir plaisir à l'ouvrir régulièrement! J'aime particulièrement le medium "livre" qui à mon sens permet de vraiment progresser dans le domaine qui nous plait.

La vidéo est un bon moyen de rester alerte et curieux en terme de développement. Le point fort est la variété des mots clefs. Souvent Youtube propre une ribambelle de vidéos en rapport avec celle que l'on regarde en terme de mots clef, c'est pas mal mais cela confine. 

  • Partager sur Facebook
  • Partager sur Twitter
26 septembre 2017 à 15:38:31

Merci ! Content qu'elle te plaise ;)

Il devrait y avoir pas mal d'amélioration au fil du temps car elle est encore assez "brute" et vu que c'était pour tester le langage kotlin, j'espère que j'aurais pas trop de crash dans un premier temps :D.

Ciao ! ;)

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2017 à 11:55:28

Salut,

Bien joué pour ton application ! Peux-tu nous faire un mini retour sur les points forts et les points faibles, pour toi, de kotlin par rapport au java ? Nous donner ton ressenti ?

Bonne journée !

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2017 à 17:39:30

Alors, je suis allé lire le retour de Roland et j'ai pas grand chose à ajouter :D. Le seul truc qui est sûr, c'est que c'est dur de repasser à java ensuite ;).

Après un truc que j'ai remarqué mais j'sais pas si Roland l'a remarqué c'est que j'ai eu l'impression que les temps de build étaient plus long.

Mais ayant codé ça sous android studio 3 avec les nouveaux outils de profiling et la désactivation de l'instant run, c'est peut-être qu'une impression :D

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2017 à 18:27:28

@IpProg,

Je n'ai pas spécialement remarqué pour les temps de build. Après plusieurs choses peuvent l'expliquer comme l'utilisation de Room qui fait de la génération de classe. Les annotations processeurs - il me semble - ne sont pas compatibles avec les builds incrémentales de gradle ce qui fait que tu recompiles tout ton projet à chaque fois.

Il faudrait cependant vérifier mes dires car j'ignore si c'est tjrs le cas pour gradle 4.

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2017 à 20:37:06

Je suis pas arrivé a trouver l'info pour gradle 4 mais en effet ça m'étonnerait pas que ça vienne de là. Sans parler également du fait que j'ai utilisé Dagger 2 également.

Après, faut aussi dire que mon ordinateur n'est plus de toute première jeunesse et après quelques heures ça se sent :D.

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2017 à 22:00:00

Hello all !

Très sympa comme application, j'ai cependant des retours à faire :)

Au niveau de la liste des "ressources", concernant le FAB, tu devrais peut être le faire disparaitre au scroll down et le faire apparaitre de nouveau au scroll up. Ca t'évite de rajouter un padding bottom à ta recyclerView pour laisser assez de place au FAB sans gêner quoi que ce soit.

Y-a-t-il besoin de forcer le landscape pour la lecture des vidéos ? Tu peux rajouter les mêmes informations que sur l'item de ta recycler en dessous de celle-ci en mode portrait, non ?

Pouvoir accéder à la liste des resources par catégorie serait pas mal (lors d'un click sur le label par exemple).

Question design, pour mettre en favoris on a un coeur mais dans le menu c'est une étoile, une raison particulière ? C'est dommage que ce ne soit pas uniformiser (après je ne suis pas designer, il y a peut être une réelle raison de faire comme ça :) )

En tout cas elle est très chouette, assez fluide :) Bravo !

PS : Je viens d'avoir un crash sur l'écran de vidéo en faisant le monkey :p 

09-27 21:56:17.179 17897-17897/? E/ActivityThread: Activity justme.application.com.newconfapp.ui.main.tutos.SingleTutoActivity has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@c5c8fc that was originally bound here
                                                   android.app.ServiceConnectionLeaked: Activity justme.application.com.newconfapp.ui.main.tutos.SingleTutoActivity has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@c5c8fc that was originally bound here
                                                       at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1514)
                                                       at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1406)
                                                       at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1589)
                                                       at android.app.ContextImpl.bindService(ContextImpl.java:1541)
                                                       at android.content.ContextWrapper.bindService(ContextWrapper.java:678)
                                                       at com.google.android.youtube.player.internal.r.e(Unknown Source:72)
                                                       at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source:67)
                                                       at com.google.android.youtube.player.YouTubePlayerSupportFragment.a(Unknown Source:29)
                                                       at com.google.android.youtube.player.YouTubePlayerSupportFragment.onCreateView(Unknown Source:15)
                                                       at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
                                                       at android.support.v4.app.FragmentManagerImpl.ensureInflatedFragmentView(FragmentManager.java:1645)
                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1390)
                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1640)
                                                       at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3702)
                                                       at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
                                                       at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:338)
                                                       at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:39)
                                                       at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:67)
                                                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
                                                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
                                                       at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
                                                       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
                                                       at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
                                                       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
                                                       at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
                                                       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
                                                       at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
                                                       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
                                                       at justme.application.com.newconfapp.base.BaseVideoActivity.onCreate(BaseVideoActivity.kt:34)
                                                       at justme.application.com.newconfapp.ui.main.tutos.SingleTutoActivity.onCreate(SingleTutoActivity.kt:36)
                                                       at android.app.Activity.performCreate(Activity.java:6975)
                                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
                                                       at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4754)
                                                       at android.app.ActivityThread.-wrap18(Unknown Source:0)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1599)
                                                       at android.os.Handler.dispatchMessage(Handler.java:105)
                                                       at android.os.Looper.loop(Looper.java:164)
                                                       at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
09-27 21:56:17.445 17897-17897/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: justme.application.com.newconfapp, PID: 17897
                                                   kotlin.TypeCastException: null cannot be cast to non-null type com.google.android.youtube.player.YouTubePlayer.OnFullscreenListener
                                                       at justme.application.com.newconfapp.ui.main.VideoFragment.onInitializationSuccess(VideoFragment.kt:71)
                                                       at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source:70)
                                                       at com.google.android.youtube.player.YouTubePlayerView$1.a(Unknown Source:12)
                                                       at com.google.android.youtube.player.internal.r.g(Unknown Source:70)
                                                       at com.google.android.youtube.player.internal.r$c.a(Unknown Source:66)
                                                       at com.google.android.youtube.player.internal.r$b.a(Unknown Source:4)
                                                       at com.google.android.youtube.player.internal.r$a.handleMessage(Unknown Source:95)
                                                       at android.os.Handler.dispatchMessage(Handler.java:105)
                                                       at android.os.Looper.loop(Looper.java:164)
                                                       at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
09-27 21:56:17.466 22921-5671/? E/YouTubeAndroidPlayerAPI: Failed to construct CronetEngine
                                                           java.lang.IllegalStateException: Disk cache storage path already in use
                                                               at org.chromium.net.impl.CronetUrlRequestContext.<init>(SourceFile:28)
                                                               at ajba.a(SourceFile:9)
                                                               at aiwd.a(SourceFile:8)
                                                               at rap.a(SourceFile:36)
                                                               at rar.get(SourceFile:14)
                                                               at aijj.get(SourceFile:10)
                                                               at iqm.N(SourceFile:178)
                                                               at qqa.get(SourceFile:6)
                                                               at aijj.get(SourceFile:10)
                                                               at ray.a(SourceFile:91)
                                                               at xdo.b(SourceFile:19)
                                                               at xdd.a(SourceFile:18)
                                                               at xdc.a(SourceFile:15)
                                                               at xdk.a(SourceFile:41)
                                                               at xdy.a(SourceFile:19)
                                                               at xdd.b(SourceFile:24)
                                                               at xdd.a(SourceFile:18)
                                                               at xcx.run(SourceFile:4)
                                                               at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
                                                               at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                                                               at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                                                               at qsw.run(SourceFile:24)
                                                               at java.lang.Thread.run(Thread.java:764)



  • Partager sur Facebook
  • Partager sur Twitter
[Android] Punch | [Android] Jessie Ryan Music | [Android] Fanfic-FR | Github | @Joadar_ |
28 septembre 2017 à 8:45:48

Salut ! Merci Joadar pour ton retour ;)

Pour le FAB, j'ai testé ça ( version en cours de déploiement ) mais par contre dans la version actuelle il me faut toujours le padding car je détecte le scroll up / down mais pas la fin du recycler view :D. Mais j'aime bien l'effet donc j'ai laissé comme ça pour le moment ;).

Alors pour la vidéo en mode Landscape c'est plus un problème avec la librairie youtube ( en espérant qu'elle soit un jour mise à jour notamment en utilisant l'exoplayer ... ). Y'a pas mal de soucis avec, notamment lors d'une rotation lorsqu'une pub est en cours. Cela entraînait souvent des erreurs et les forums google sont souvent restés sans réponses... Du coup, j'ai choisi cette solution en attendant d'en trouver une meilleure ( les samples fournis avec la librairie bug aussi pour info ).

Ceci dit, pour le crash, ça devrait être bon. Si cependant t'arrivais à reproduire l'erreur sur la version 0.3, j'veux bien que tu me dises ce que t'as fait exactement ;)

Pour l'icone des favoris dans le menu c'est une inattention de ma part et c'est corrigé :D.

Quand tu dis : "Pouvoir accéder à la liste des resources par catégorie serait pas mal (lors d'un click sur le label par exemple)."

Tu parles en cliquant sur un label directement dans une "CardView" ?

Autrement niveau design, c'est également pas mon point fort du tout :/. L'application reste assez générique de ce point de vue là. C'est le défaut d'avoir fait ça tout seul :D.

Sinon pour terminer, j'ai rajouté un fadeIn pour le chargement des images car j'avais pas fait gaffe que ce comportement avait été supprimé par défaut pour Glide 4.

J'ai publié la nouvelle version donc elle devrait être bientôt dispo ;)

Bye

-
Edité par IpProg 28 septembre 2017 à 10:26:54

  • Partager sur Facebook
  • Partager sur Twitter
15 décembre 2017 à 14:18:30

Quelqu'un saurait comment me dire pourquoi cette erreur arrive: Failed to construct CronetEngine or Disk cache storage path already in use using YouTubeAndroidPlayerAPI

E/MyFragment: onInitializationSuccess: https://www.youtube.com/watch?v=_7T7XnkJP3M
E/YouTubeAndroidPlayerAPI: Failed to construct CronetEngine. Using fallback Java implementation.

          java.lang.IllegalStateException: Disk cache storage path already in use
                   at org.chromium.net.impl.CronetUrlRequestContext.<init>(SourceFile:28)
                   at alph.a(SourceFile:9)
                   at alko.a(SourceFile:8)
                   at sdv.a(SourceFile:36)
                   at sdx.get(SourceFile:14)
                   at akxn.get(SourceFile:10)
                   at jim.M(SourceFile:174)
                   at jfs.get(SourceFile:6)
                   at akxn.get(SourceFile:10)
                   at seq.d(SourceFile:98)
                   at seq.run(SourceFile:33)
                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                   at rvu.run(SourceFile:24)
                   at java.lang.Thread.run(Thread.java:818)
E/YouTubeAndroidPlayerAPI: Unhandled ErrorReason in onError

Mise en œuvre de la bibliothèque:

    private void initializeYoutubePlayer(final String videoUrl) {
        YouTubePlayerSupportFragment youTubePF = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.fpd_youtube_fragment);
        youTubePF.initialize(getString(R.string.google_oauth_key), new YouTubePlayer.OnInitializedListener() {

                    @Override
                    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
                        Log.e(TAG, "onInitializationSuccess: " + videoUrl);
                        youTubePlayer.cueVideo(videoUrl);
                    }

                    @Override
                    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
                        Log.e(TAG, "onInitializationFailure: " + provider.toString() + " " + youTubeInitializationResult.toString());
                    }
        });
    }



-
Edité par JavierApAp 15 décembre 2017 à 14:27:21

  • Partager sur Facebook
  • Partager sur Twitter
10 mars 2018 à 15:51:41

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.

Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pouce en haut pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre. Si vous avez une question similaire, créez plutôt votre propre sujet en détaillant votre contexte

Je ferme ce topic.

  • Partager sur Facebook
  • Partager sur Twitter

Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script