Problemi Wifi Extender e Android

Di recente ho deciso di collegare la chiavetta Android, che giaceva inutilizzata in un cassetto, alla televisione della camera da letto per poter vedere Netflix.

Purtroppo il segnale wifi nell’angolo dove è posizionato il televisore è debole. Questo, unito al fatto che il chip wifi della mia chiavetta non brilla in potenza, mi impediva di utilizzare Netflix.

Mi sono quindi dotato di un Wifi Extender: un apparecchio economico e semplice da configurare che si collega ad una presa e non fa altro che estendere il segnale wifi facendo da ripetitore.

Il modello che ho acquistato è il TP-LINK Pocket Range Extender N 300Mbps TL-WA854RE

Collegato e configurato in cinque minuti come da istruzioni (ed aspettative) sembra funzionare benissimo: sia il mio cellulare (un Lumia 930) che il portatile (con Windows 10) si collegano senza alcun problema e navigano ad una velocità più che accettabile.

Collego la chiavetta e, con mia grande sorpresa, iniziano i problemi: non riesce neanche a stabilire la connessione bloccandosi su “Acquisizione indirizzo ip” per un po’ per poi ritentare.

Controllo le impostazioni del DHCP e sembra tutto a posto, provo ad attivare il DHCP dell’extender (di default è disattivato perché dovrebbe essere quello del router principale ad assegnare gli ip) ma non cambia nulla: Android proprio non riesce ad ottenere un indirizzo ip.

Arreso all’evidenza che il DHCP per qualche motivo non funziona assegno un indirizzo statico alla chiavetta Android ed imposto manualmente gateway e dns. In questo modo la connessione al wifi funziona, ma internet non va.

Tra tentativi di resettare l’extender, riconfigurarlo, modifiche alla configurazione del wifi del router (AES, TKIP, channel) mi accorgo di una cosa stranissima: con la chiavetta Android collegata al wifi Extender nessun altro device riesce a navigare in internet o riesce a farlo ad una velocità veramente bassa e ad intermittenza, appena disattivato il wifi tutti gli altri device ricominciano a navigare.

Qualche ricerca su Google mi ha dato il giusto consiglio: disattivare le opzioni WMM e Short GI (attive di default).

wifi_extender

Ora tutti i device si collegano correttamente al wifi Extender ed anche la navigazione internet è ottima.

Updating a GitHub fork

To update a GitHub fork with the changes done in the original repository:

  • Add the original source to your fork
    git remote add original git://url-to-original-repo
    You can verify the remotes with the command
    git remote -v
  • Fetch the changes from the original repo
    git fetch original
  • Merge the changes
    git merge original/master
  • Push the changes to your repo
    git push

Wpf and emoticons

How to display emoticons/emoji in a Wpf TextBox/TextBlock?

I made a test project to show how to do this (you can download it at the end of this post).
It is all about playing with Inlines in the TextBox’s FlowDocument and in the TextBlock.
The main code is this:

private static int FindFirstEmoticon(string text, int startIndex, out string emoticonFound)
{
  InitEmoticons();
  emoticonFound = string.Empty;
  int minIndex = -1;
  foreach (string e in m_Emoticons.Keys) {
    int index = text.IndexOf(e, startIndex);
    if (index >= 0) {
      if (minIndex < 0 || index < minIndex) {
        minIndex = index;
        emoticonFound = e;
      }
    }
  }
  return minIndex;
} // FindFirstEmoticon

public static void ParseText(FrameworkElement element)
{
  InitEmoticons();
  TextBlock textBlock = null;
  RichTextBox textBox = element as RichTextBox;
  if (textBox == null)
    textBlock = element as TextBlock;

  if (textBox == null && textBlock == null)
    return;

  if (textBox != null){
    FlowDocument doc = textBox.Document;
    for (int blockIndex=0; blockIndex < doc.Blocks.Count; blockIndex++){
      Block b = doc.Blocks.ElementAt(blockIndex);
      Paragraph p = b as Paragraph;
      if (p != null) {          
        ProcessInlines(textBox, p.Inlines);
      }
    }
  }else{
    ProcessInlines(null, textBlock.Inlines);
  }
} // ParseText

private static void ProcessInlines(RichTextBox textBox, InlineCollection inlines)
{
  for (int inlineIndex=0; inlineIndex < inlines.Count; inlineIndex++){
    Inline i = inlines.ElementAt(inlineIndex);
    if (i is Run) {
      Run r = i as Run;
      string text = r.Text;
      string emoticonFound = string.Empty;
      int index = FindFirstEmoticon(text, 0, out emoticonFound);
      if (index >= 0) {
        TextPointer tp = i.ContentStart;
        bool reposition = false;                
        while (!tp.GetTextInRun(LogicalDirection.Forward).StartsWith(emoticonFound)) 
          tp = tp.GetNextInsertionPosition(LogicalDirection.Forward);
        TextPointer end = tp;
        for (int j=0; j<emoticonFound.Length; j++)
          end = end.GetNextInsertionPosition(LogicalDirection.Forward);
        TextRange tr = new TextRange(tp, end);
        if (textBox != null)
          reposition = textBox.CaretPosition.CompareTo(tr.End) == 0;
        tr.Text = string.Empty;

        string imageFile = m_Emoticons[emoticonFound];
        Image image = new Image();
        BitmapImage bimg = new BitmapImage();
        bimg.BeginInit();
        bimg.UriSource = new Uri(imageFile, UriKind.Relative);
        bimg.EndInit();
        image.Source = bimg;
        image.Width = 24;

        InlineUIContainer iui = new InlineUIContainer(image, tp);
        iui.BaselineAlignment = BaselineAlignment.TextBottom;

        if (textBox != null && reposition)
          textBox.CaretPosition = tp.GetNextInsertionPosition(LogicalDirection.Forward);
      }
    }
  }
} // ProcessInlines

The code parses the current content of the TextBox/TextBlock and replaces the emoticons text (initialized int the InitEmoticons method) with the correct image.
If the element passed is a TextBox it also repositions the cursor in the correct position.

You can download the test project here.