Category Archives

24 Articles
Kitkat goût Nexus 4 (toutes MAJ)

Kitkat goût Nexus 4 (toutes MAJ)

by Throrïn 3 Comments

Vous n’êtes pas sans savoir que depuis 4 jours la mise à jour OTA (over the air), vers android Kitkat, est en cours de déploiement. Et bien sachez que depuis hier, des gens de chez XDA ont récupéré ce lien vers le fichier de la mise à jour et, grâce à ça, nous pouvons passer à KitKat via la commande ADB.

Prérequis

Tout d’abord, vous devez avoir le SDK android d’installé et configuré sur votre poste. Pour les utilisateurs d’OSX, je les invite à se rendre sur mon article dédié. Vérifiez ensuite que la commande adb est disponible en tapant juste adb dans votre terminal (pour les plus malchanceux : utilisateurs windows, vous devez le taper dans la console).

Vous devez aussi avoir un nexus 4, toujours en ROM stock avec le recovery de base et non rooté

Liens de l’OTA

Deux liens sont à disposition. Je les indique ici par le numéro de build source vers celui de l’OTA. Le numéro source est pour celui présent sur votre Nexus dans paramètres -> à propos du téléphone -> numéro de build

Mise à jour

Maintenant, suivez les instructions suivantes pour une mise à jour sans risque :

  • Téléchargez le fichier de l’OTA vous concernant
  • Renommez le en update.zip
  • Si vous êtes sous Windows, placez le au même endroit que la commande adb.exe
  • Dans la console/terminal, placez vous dans le répertoire de votre fichier update.zip
  • Vérifiez que le débogage USB est activé sur votre nexus (se trouve dans les options pour développeur)
  • Branchez votre nexus sur votre PC en USB et tapez la commande adb reboot recovery
  • Quand le bugdroid apparaît à l’écran, appuyez sur le bouton Power puis en même temps appuyez brièvement sur le bouton volume Haut
  • Le menu du recovery apparaît, sélectionnez apply update from adb puis validez avec le bouton POWER.
  • Tapez la commande adb sideload update.zip puis allez prendre un café.
  • Quand c’est terminé, sélectionnez reboot puis reprenez un café car vous en avez pour un moment

Et voilà. Vous êtes sur la toute dernière version d’Android.

Source

Updates :

  • 06/12/2013 : Ajout de l’update 4.4.1
  • 09/12/2013 : Ajout de l’update 4.4.2
  • 05/06/2014 : Ajout de la version 4.4.3
Dev, Android et OsX

Dev, Android et OsX

by Throrïn 2 Comments

La semaine dernière, j’ai profité de la sortie d’OSX Maverick pour réinstaller proprement tout mon macbook. Et, venant tout juste de terminer l’installation de l’environnement de développement Android, je me suis dis que j’allais vous partager la bonne méthode pour mettre en place le votre.

Prérequis

  • Avoir une version d’OSX supportant Homebrew.
  • Un mac avec cette version d’OSX (le CD tout seul ou bien la clé ne vous aideront pas).
  • Un mug avec la boisson chaude de votre choix. (Petite préférence pour un thé de Noêl vu le temps).

Homebrew

Qu’est-ce qu’Homebrew? Pour répondre à cette question, je vous laisse lire directement ce qu’ils marquent sur leur site :

Homebrew installe ce dont vous avez besoin et qu’Apple n’a pas installé.

Homebrew va donc nous permettre d’installer tout ce dont nous avons besoin. Il s’agit dun gestionnaire de paquets (en gros), dans le genre d’apt-get sur Ubuntu, permettant d’installer donc facilement certaines librairies, logiciels, … simplement (mongodb, …).

Pour l’installer, rien de plus simple. Il vous suffit de rentrer la ligne suivante dans votre terminal avec un utilisateur disposant des droits d’administration :

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

MAJ, installation du SDK, …

Avant de continuer, il est requis de mettre à jour homebrew grâce à la commande suivante :

brew update

Quand la commande est terminée, nous allons installer tout le nécessaire (et même plus) pour le développement Android :

brew install android ant maven gradle

Cette commande va nous installer :

  • Ant
  • Maven
  • Gradle
  • Android SDK

Une fois que tout est terminé, vous aurez juste à lancer android dans votre terminal pour vous retrouver avec le gestionnaire d’installation des versions, extras, …

Un petit coup de GenyMotion ?

Maintenant, nous allons installer VirtualBox et GenyMotion afin de pouvoir tester nos applications directement sur notre mac sans avoir à jouer à Hearthstone le temps que le simulateur de base ne réagisse à notre action.

Bref, pour revenir sur Genymotion, il faut savoir qu’il permet de simuler, via une machine virtuelle, un device Android du type de votre choix (tablette, phablette, smartphone, nexus 4, 5, 7, …). Donc, je vous conseille fortement de l’installer de de travailler avec pour vos développements.

Pensez aussi à prendre l’intégration de Genymotion pour Eclipse ou Android Studio selon l’IDE que vous utilisez.

Et l’IDE ?

Comme je viens de vous le dire, c’est à vous de choisir entre Eclipse, IntelliJ et Android Studio. Je vous conseillerai quand même de prendre Android Studio ou IntelliJ car Eclipse commence à se faire lourd pour rien et dès qu’un projet devient trop important, il se met à planter trop souvent.

De plus Android Studio et IntelliJ gèrent nativement les projets gradle et possèdent même une intégration avec GitHub.

Android Validator 1.0 Released

Android Validator 1.0 Released

Android-Validator

Form Validator Library for Android

Presentation

Form Validator Library for Android is based on Zend_Validator coded in PHP. This library is intended to simplify and streamline the code to validate a form Android. For the moment, the form can just handle the EditText. Other elements will emerge in future versions.

License

Warning

With Android 4.2, the error display has undergone a display bug. Sometimes, the error fields do not appear in the display. I hope that Google will repair this problem quickly due to Android in itself and not the library.

Use

Form Validator Library is composed of 3 members :

  • Form : Contains all beings validates to treat. This is the Form that manages the display of error messages in the various elements.
  • Validate : Contains all the validators to be treated for a given element.
  • Validator : Can define a validation rule.

Validator

The validator is basic class for this library. It contains specific validation rules. To instanciate validator, you just have to do this (EmailValidator for example):

new EmailValidator(context);

For some validators, functions can change the validation rules. The validator currently contains three basic validation rules:

  • EmailValidator : Ensures that the field does contain a email address. You can also define a regex to check for a particular domain name with the function setDomainName(DomainRegexp). Example for gmail.com domain : setDomainName("gmail\\.com").
  • NotEmptyValidator : Ensures that the field is not empty.
  • UrlValidator : Ensures that the field is a valid url.
  • AlnumValidator : Ensure that the feld has Alnum characters.
  • HexValidator : Ensure that the field has Hex characters.
  • RegExpPattern : Ensure that the field does match setted Pattern.
  • Custom Validator : You can create your own Validator. To do this, you can just create class extends AbstractValidator :

    public class CustomValidator extends AbstractValidator
    {
        // Your custom error message
        private int mErrorMessage = R.string.validator_custom; 
    
        public CustomValidator(Context c) {
            super(c);
        }
    
        @Override
        public boolean isValid(Object value) {
            // Your validation Test is here.
            // Retour true if it's correct, false if it's incorrect
            return true;
        }
    
        @Override
        public String getMessage() {
            return mContext.getString(mErrorMessage);
        }
    }
    

Validate

The pure Validate class is a FIFO validator. It’s test a list of AbstractValidator for specific EditText. For some special cases, Validate is not enough. This is why there are specific validates. This is why there are two individuals with a Validate operation different from that base :

  • ConfirmValidate : Can check whether a value is identical between the two fields. Can be used to confirm the entry of a password.
  • OrTwoRequiredValidate : If one of the two target fields has a value, then it is valid. Can be used if a user must give his phone or fax.
  • Validate : The base Validate. It creates his validators stack.

Basicly, Validate can only handle a single EditText. If you want to manage several at the same time, see if ConfirmValidate or OrTwoRequiredValidate match your problem. If this is not the case, you may need to create your own Validate. To instantiate a Validate, you just have to do this:

Validate emailField = new Validate(email);

And to add Validator stack, for example to add a required Email field, you have to do this:

emailField.addValidator(new NotEmptyValidator(mContext));
emailField.addValidator(new EmailValidator(mContext));

Form

The Form class is the class teacher of the whole Library. It manages the processing of each Validate, Validator and displays the error on the EditText automatically. The Form class stores a Validate stack and then you just have to run the validation with the validate() function. To instanciate Form and add Validates, you have to do this :

Form mForm = new Form();
mForm.addValidates(emailField);
mForm.addValidates(confirmFields);
mForm.addValidates(urlField);

// ...

// Launch Validation
if(mForm.validate()){
    // success statement
}else{
    // error statement like toast, crouton, ...
}

Changelog

  • 0.1 : Create library
  • 0.2 : Add ConfirmValidate and OrTwoRequiredValidate
  • 0.3 : Extends EmailValidator with setDomainName()
  • 0.4 : Replace Validator by AbstractValidator
  • 0.5 : Fix bug in UrlValidator
  • 1.0 : Add AlnumValidator, HexValidator, RegExpValidator, ValidatorException. Fix Validate class.
Migrer sur IntelliJ ses projets Android

Migrer sur IntelliJ ses projets Android

Juste avant vos fêtes de Noël, je vous propose un petit article tout simple vous présentant l’IDE alternatif IntelliJ. Nous allons voir ses fonctions principales et comment migrer votre développement dessus. Bien entendu, cet IDE est disponible gratuitement au téléchargement si vous optez pour la version Community Edition. Heureusement pour nous, elle suffit amplement au développement Android mais, si vous voulez aller plus loin dans le développement JAVA en utilisant certains frameworks, vous devriez certainement opter pour la version Ultimate.

Présentation

IntelliJ est un IDE java développé par la société JetBrains. Cet IDE est, comme Eclipse, Netbean, … codé en JAVA et disponible sur toutes les plateformes (Windows, Mac et Linux). Comparé aux autres IDE, IntelliJ est pensé pour développer QUE des applications JAVA et Android (bon ok, Android c’est aussi du JAVA mais passons). Depuis sa dernière version  en date, la 12.0, IntelliJ se dote d’un thème Dark et d’une meilleure compatibilité avec le développement Android. Il intègre un outil de création de vues aussi complet que celui fourni par l’ADT dans Eclipse. De plus, cet éditeur comprend la compatibilité avec la plupart des frameworks JAVA ainsi qu’une compatibilité avec ANT.

Enfin un IDE qui ne flash pas quand on développe dans une cave.

Enfin un IDE qui ne flash pas quand on développe dans une cave.

Personnellement, cet IDE semple beaucoup plus léger qu’Eclipse et consort. De plus, sur de gros projets Android, nous n’avons plus d’OOM lors de la compilation (arrivée plusieurs fois sur Eclipse si je laisse le .ini de base). Bref, si vous devez choisir un IDE, je vous conseillerai de tester celui-ci avant votre choix définitif (et qui sait, peut-être qu’un nouvel IDE mettra la barre encore plus haut dans un futur proche). Si vous voulez des renseignements supplémentaires, au lieu de bêtement copier/coller la présentation du site via Google Trad, je vous conseille de vous rendre ICI.

Importation de mes anciens projets

Maintenant, nous allons nous attaquer à ce que vous allez certainement faire si vous voulez continuer vos projets en cours sur cet IDE. Pour cela, vous avez plusieurs possibilités :

  • Ouvrir directement le répertoire du projet sur votre PC
  • Checkout depuis différents dépôts de version : Git/GitHub/SVN/Mercurial/CVS

Après avoir importé votre projet, vous devez indiquer quel SDK est utilisé pour votre projet. Pour cela, vous devez aller dans les paramètres du projet disponibles directement dans la barre d’actions.

Le bouton est entouré en rouge

Le bouton est entouré en rouge

Ensuite allez dans la partie Project puis sélectionnez votre SDK. De base, vous devriez en avoir aucun. Il va faloir les rajouter. Cliquez donc sur le bouton New et ajoutez d’abord le JDK puis ensuite rajoutez le ou les SDK Android dont vous avez besoin.

Quand vous avez votre SDK, sélectionnez le.

Quand vous avez votre SDK, sélectionnez le.

Il vous fautra aller ensuite dans la partie Module puis rajouter le module Android à votre projet. Si vous oubliez cette partie le projet ne compilera jamais car il manquera la partie gen, la classe R et toutes les libraries externes.

Voilà, notre module est ajouté

Voilà, notre module est ajouté

Si votre projet vient d’Eclipse, il se peut que vous ayez deux libraries vous notifiant une erreur. Il s’agit de libraries rajoutées automatiquement par ADT pour qu’Eclipse puisse parcourir le SDK. Supprimez les simplement puis validez. Normalement votre projet devrait compiler.

Maintenant il faut aussi faire une configuration pour lancer vos applications sur l’émulateur et/ou un appareil Android. Pour cela, cliquez sur la flèche à gauche de Play puis sur « Edit Configurations ». Une nouvelle fenêtre apparaît. Cliquez sur le « + » puis sur Android Application. Sélectionnez en Module votre projet puis ensuite réglez le reste comme bon vous semble. Appliquez et c’est bon. Maintenant vous pouvez lancer votre projet.

Simple non?

Simple non?

Vous avez autant de réglages que sur Eclipse

Vous avez autant de réglages que sur Eclipse

Conclusion

Vous savez maintenant continuer vos différents projets Android sur IntelliJ. Seul défaut, cet IDE ne gère qu’un seul projet par fenêtre. De plus, je n’ai pas encore essayé les Libraries Projets donc je ne peux pas dire si ça marche ou non. Espérons que Google fournisse enfin un outil pour convertir ses projects libraries avec ressources en JAR comme pour son SDK et les googleAPI.

Bref, si vous ne savez pas quel IDE utiliser ou si vous en avez marre d’Eclipse, de ses bugs et de ses lenteurs légendaires, je vous conseille vivement d’essayer et d’adopter IntelliJ comme je viens de le faire. 

Fritte et moi nous vous souhaitons un Joyeux Noël

Envoyer un mail sans application tierce.

Envoyer un mail sans application tierce.

Bonjour à tous, Aujourd’hui nous allons nous attaquer à l’envoi de mail sans passer par une application tierce. Tout cela sera réalisé avec la librairie JavaMail.

Dans quel cas utiliser cette méthode ?

Plutôt que d’utiliser des applications beaucoup plus optimisées, moi je l’utilise au travail, pour envoyer les crash de mes applications en background (caché de mon utilisateur). Vous allez me dire, il y a bien ACRA, mais il demande une interaction utilisateur, et parfois les personnes ne prennent pas le temps de faire « send report »… 

Il est possible de recevoir/envoyer des mails, ajouter des pièces jointes etc. Très complète comme librairie. Mais je ne vais vous présenter que l’envoi via une petite application très rapide.

Bien entendu, c’est un tuto, beaucoup de tests (adresse mail, etc), de gestion de spam de clique « envoyé » ne sont pas présents.

Nous allons nous pencher légèrement sur la classe Mail, elle défini en gros toutes les options et les paramètres de l’envoi de mail.

public class Mail extends javax.mail.Authenticator {

    private String _user;
    private String _pass;
    private String[] _to;
    private String _from;
    private String _port;
    private String _sport;
    private String _host;
    private String _subject;
    private String _body;
    private boolean _auth;
    private boolean _debuggable;
    private Multipart _multipart;

    public Mail() {
        _host = "smtp.gmail.com";
        _port = "25";
        _sport = "465";
        _subject = "";
        _body = "";
        _debuggable = false;
        _auth = true;
        _multipart = new MimeMultipart();

        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
    }

    public Mail(String user, String pass) {
        this();
        _user = user;
        _pass = pass;
    }

    public boolean send() throws Exception {
        Properties props = _setProperties();
        if (!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
            Session session = Session.getInstance(props, this);
            Transport transport = session.getTransport("smtp");
            if (!transport.isConnected()) {
                /** ouvre la connexion si elle ne l'est pas faite ! */
                transport.connect(_user, _pass);
            }
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(_from));
            InternetAddress[] addressTo = new InternetAddress[_to.length];
            for (int i = 0; i < _to.length; i++) {
                addressTo[i] = new InternetAddress(_to[i]);
            }
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
            msg.setSubject(_subject);
            msg.setSentDate(new Date());
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(_body);
            _multipart.addBodyPart(messageBodyPart);
            msg.setContent(_multipart);
            //   Transport.send(msg);
            transport.sendMessage(msg, msg.getAllRecipients());
            System.out.println("envoyé");
            return true;
        } else {
            return false;
        }
    }

    public void addAttachment(String filename) throws Exception {
        BodyPart messageBodyPart = new MimeBodyPart();
        FileDataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(filename);

        _multipart.addBodyPart(messageBodyPart);
    }

    @Override
    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(_user, _pass);
    }

    private Properties _setProperties() {
        Properties props = new Properties();
        props.put("mail.smtp.host", _host);
        if (_debuggable) {
            props.put("mail.debug", "true");
        }
        if (_auth) {
            props.put("mail.smtp.auth", "true");
        }
        props.put("mail.smtp.port", _port);
        props.put("mail.smtp.socketFactory.port", _sport);
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        return props;
    }
//getter and setter
}

Ensuite elle réalise déjà pas mal de test, sur les paramètres obligatoires d’un mail, et renverra faux à l’envoi. Donc elle réalisé déjà le gros de votre travail si vous oubliez des champs… Transport a deux méthodes send. Une send et une autre sendMessage. Il y a une grosse différence entres les deux.

Tout d’abord send() est une static, et dans l’API il est dit « unlike this method »… En plus, juste avant l’appel de l’envoi, nous instancions Transport, pour tester si l’utilisateur (user dans l’app) est bien connecté, si non, il le ferra. Donc autant utiliser la meilleure méthode qui n’appellera pas le saveChanges et donc ira plus vite à l’envoi.

Encore une idée d’apparence de formulaire 😀

Ensuite, pour en revenir à l’application tuto, nous réalisons qu’il est très facile d’utilisation la création de mail. N’oubliez pas qu’elle doit être envoyé dans un Thread a part. Sinon l’application freezera jusqu’à ce que l’envoi soit réalisé.

public class TutoSendMail extends Activity implements OnClickListener{

    public Mail m;

    private EditText mailEdit;
    private EditText pwdEdit;
    private EditText toEdit;
    private EditText subjectEdit;
    private Button sendMail;

    private String user;
    private String pwd;
    private String to;
    private String subject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.tutosendmail_view);

        mailEdit = (EditText) findViewById(R.id.editMail);
        pwdEdit  = (EditText) findViewById(R.id.editMdp);
        toEdit = (EditText) findViewById(R.id.editTo);
        subjectEdit = (EditText) findViewById(R.id.editSubject);
        sendMail = (Button) findViewById(R.id.buttonSend);
        /** surtout pas oublier d'assigner le onclick au bouton */
        sendMail.setOnClickListener(this);
    }

    /**
     * AsyncTask pour envoyer le mail
     * @author fritte
     *
     */
    private class SendMail extends AsyncTask<Void, Void, String[]> {
        private boolean envoye;

        @Override
        protected String[] doInBackground(Void... params) {

            /** user et pwd de qui envoie */
            m = new Mail(user, pwd);
            /** a qui j'envoie */
            String[] toArr = {
                to
            };
            m.set_to(toArr);
            /** le 'from' de qui vient le mail */
            m.set_from(user);
            /** le sujet */
            m.set_subject("Test envoi mail via javamail");
            /** et le message */
            m.set_body(subject);
            try {
                /** l'envoi */
                if (m.send()) {
                    envoye = true;
                } else {
                    envoye = false;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String[] result) {
            super.onPostExecute(result);
            if (envoye) {
                Crouton.makeText(TutoSendMail.this, getString(R.string.envoye), Style.CONFIRM).show();
            } else {
                Crouton.makeText(TutoSendMail.this, getString(R.string.pasenvoye), Style.ALERT).show();
            }
        }
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.buttonSend:
                if (testIfNull()) {
                    /** on pourrait même lancer une progressDialogue dans l'action barre, comme pour le refresh G+ etc */
                    new SendMail().execute();
                }
                break;
        }
    }

    /**
     * on peut tester aussi avec un regex les mails s'ils sont correct etc...
     * @return
     */
    private boolean testIfNull() {
        boolean OK;
        if (mailEdit.getText().toString().length() > 0
            && pwdEdit.getText().toString().length() > 0
            && toEdit.getText().toString().length() > 0
            && subjectEdit.getText().toString().length() > 0) {

            user = mailEdit.getText().toString();
            pwd = pwdEdit.getText().toString();
            to = toEdit.getText().toString();
            subject = subjectEdit.getText().toString();
            OK = true;
        } else {
            OK = false;
            Crouton.makeText(TutoSendMail.this, getString(R.string.erreur_champs_vides), Style.ALERT).show();
        }
        return OK;
    }
}

Si vous avez des questions, n’hésitez pas. Voici le lien vers le code source de l’application avec le tutorial d’avant, Crouton et Toast  https://code.google.com/p/fritte-tuto-master/