com.monkey.entonado.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.monkey.entonado.MainActivity.java

Source

// RockolApp/JukeboxApp -Add songs to the playlist queue of the player from the mobile app
//     Copyright (C) 2016  Edgard Collante
//
//     This program is free software: you can redistribute it and/or modify
//     it under the terms of the GNU Affero General Public License as published
//     by the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
//
//     This program is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU Affero General Public License for more details.
//
//     You should have received a copy of the GNU Affero General Public License
//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
package com.monkey.entonado;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;

import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBarActivity;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity implements OnClickListener, OnMenuItemClickListener {
    //---------------------------
    //Constantes
    //---------------------------

    public final static String INFO_USUARIO = "informacion usuario";

    public final static String BUSCAR_POR_NOMBRE = "buscar por nombre";

    public final static String BUSCAR_POR_ARTISTA = "buscar por artista";

    public final static String AGREGAR_CANCION = "agregar cancion";

    public final static String AGREGAR_LISTA = "agregar lista";

    public final static String EXTRA_CANCIONES = "com.example.entonado.MESSAGE";

    public final static String EXTRA_LISTA = "com.example.entonado.LISTA";

    public final static int RESULT_BOTON = 1994;

    public final static String TAG = "Entonado";

    //---------------------------
    //Atributos
    //---------------------------
    /**
     * Boton buscar
     */
    private TextView btnBuscar;

    /**
     * Campo busqueda
     */
    private EditText campoBusqueda;

    /**
     * Radio boton artista
     */
    private Button radioArtista;

    /**
     * Radio boton titulo
     */
    private Button radioTitulo;

    /**
     * Texto Que indica el metodo de busaueda
     */
    private TextView busqueda;

    /**
     * Socket de este cliente
     */
    private Socket canal;

    /**
     * Canal para escribir hacia el servidor
     */
    private PrintWriter out;

    /**
     * Canal para recibir del servidor
     */
    private BufferedReader in;

    /**
     * Arreglo de canciones resultantes de una busqueda
     */
    private ArrayList canciones;

    /**
     * Wifi p2p manager
     */
    private WifiP2pManager mManager;

    /**
     * Canal para conexion a hardware wifip2p
     */
    private Channel mChannel;

    /**
     * Broadcast reciever, recibe informacion de el estado del wifi
     */
    private WiFiDirectBroadCastReceiver mReceiver;

    /**
     * Filtro de mensajes del broadcast receiver
     */
    private IntentFilter mIntentFilter;

    /**
     * Mensaje de exito de coneccion
     */
    private String mensajeConexion;

    /**
     * Indica si se ha intentado conectar
     */
    private boolean intentoConectar;

    /**
     * Indica si se ha intentado enviar la lista
     */
    private boolean intentoEnviarLista;

    /**
     * Direccion ip del servidor
     */
    private String ip;

    /**
     * Canciones aadidas a la lista de reproduccion
     */
    private ArrayList milista;

    //---------------------------------
    //Metodos De la Actividad
    //---------------------------------
    /**
     * Inicializa la actividad
     */
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        mChannel = mManager.initialize(this, getMainLooper(), null);
        mReceiver = new WiFiDirectBroadCastReceiver(mManager, mChannel, this);

        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

        btnBuscar = (TextView) findViewById(R.id.btnBuscar);
        btnBuscar.setOnClickListener(this);

        radioTitulo = (Button) findViewById(R.id.btnTitulo);
        radioArtista = (Button) findViewById(R.id.btnArtista);

        campoBusqueda = (EditText) findViewById(R.id.campoBusqueda);

        busqueda = (TextView) findViewById(R.id.txtBusqueda);

        out = null;
        in = null;

        canciones = new ArrayList();
        milista = new ArrayList();

        mensajeConexion = "No se estableci la conexion";
        intentoConectar = false;
        ip = "";

    }

    /**
     * OnResume
     * register the broadcast receiver with the intent values to be matched
     */
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(mReceiver, mIntentFilter);
        CountDownTimer t = new CountDownTimer(1000, 500) {

            public void onTick(long millisUntilFinished) {

            }

            public void onFinish() {
                if (intentoConectar) {
                    mostrarMensaje(mensajeConexion);
                    intentoConectar = false;
                } else if (intentoEnviarLista) {
                    String mensaje = "";
                    boolean entro = false;
                    if (mensajeConexion == null) {
                        mensaje = "Estas desconectado";

                    } else if (mensajeConexion.equals("desconectado")) {
                        mensaje = "Estas desconectado";

                    } else if (mensajeConexion.equals("Estas conectado!")) {
                        mensaje = "La lista ha sido enviada";
                        Intent in = new Intent(MainActivity.this, AlarmReciever.class);
                        PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, in,
                                PendingIntent.FLAG_ONE_SHOT);
                        entro = true;
                        System.out.println("puso alarma");

                        AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(Context.ALARM_SERVICE);
                        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000 * 60, pi);
                    } else {
                        mensaje = mensajeConexion;
                    }
                    if (!entro)
                        mostrarMensaje(mensaje);
                    intentoEnviarLista = false;
                }
            }
        }.start();
    }

    /**
     *OnPause
     * unregister the broadcast receiver
     */
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);
        menu.getItem(0).setOnMenuItemClickListener(this);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            Intent intent = new Intent(this, MiLista.class);
            intent.putParcelableArrayListExtra(EXTRA_LISTA, milista);
            startActivityForResult(intent, 999);
            intentoEnviarLista = false;
            return true;

        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * Recibe el resultado de intentar escanear un codigo QR
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                ip = data.getStringExtra("SCAN_RESULT");

                Conectar conectar = new Conectar(this);
                conectar.start();

            } else if (resultCode == RESULT_CANCELED) {

                if (canal == null) {
                    mensajeConexion = "No te conectaste";
                    intentoConectar = true;
                }
            }
        } else if (requestCode == 999) {
            if (resultCode == RESULT_OK) {
                milista = data.getParcelableArrayListExtra("LISTA_ACTUALIZADA");
            } else if (resultCode == RESULT_BOTON) {
                milista = data.getParcelableArrayListExtra("LISTA_ACTUALIZADA");

                if (canal != null && canal.isConnected() && mensajeConexion != null
                        && !mensajeConexion.equals("desconectado")) {
                    ThreadEnviarLista enviar = new ThreadEnviarLista(this);
                    enviar.start();

                    while (enviar.isAlive()) {

                    }
                    mostrarMensaje(mensajeConexion);
                }

                intentoEnviarLista = true;

            } else if (resultCode == RESULT_CANCELED) {
                System.out.println("Lista actualizada : cancel");
            }
        }
    }

    /**
     * Maneja los clicks a los botones
     * escanear docdigo QR
     * y Buscar
     */
    @Override
    public void onClick(View v) {
        canciones = new ArrayList();

        if (v.getId() == R.id.btnBuscar) {
            String mensaje = campoBusqueda.getText().toString();

            if (mensaje == null || mensaje.equals("")) {
                AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
                builder1.setMessage("Debe introducir algo para buscar...");
                builder1.setCancelable(false);
                builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });

                AlertDialog alert11 = builder1.create();
                alert11.show();

            } else if (radioTitulo.getText().equals("por Titulo") || radioArtista.getText().equals("por Artista")) {
                if (canal != null && canal.isConnected() && mensajeConexion != null
                        && !mensajeConexion.equals("desconectado")) {
                    ConsultarCanciones consultar = new ConsultarCanciones(this);
                    consultar.start();

                    ThreadRecibir recibir = new ThreadRecibir(this);
                    recibir.start();

                    while (recibir.isAlive()) {

                    }

                    if (!recibir.darMensaje().equals(""))
                        mostrarMensaje(recibir.darMensaje());
                } else {
                    AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
                    builder1.setMessage(
                            "Todava no estas conectado a un computador con Entonado. Debes escanear un cdigo QR");
                    builder1.setCancelable(false);
                    builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });

                    AlertDialog alert11 = builder1.create();
                    alert11.show();
                }
            }

        }
    }

    //-----------------------------
    //Metodos De Conexion
    //-----------------------------

    /**
     * Establece el estado de la coneccion wifi
     * @param b
     */
    public void setIsWifiP2pEnabled(boolean b) {
        String mensaje = "";

        if (b)
            mensaje = "Conexion WiFi: Disponible";
        else
            mensaje = "Conexion WiFI: No Encendido";
        if (!b) {
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
            builder1.setMessage(mensaje);
            builder1.setCancelable(false);
            builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });

            AlertDialog alert11 = builder1.create();
            alert11.show();
        }
    }

    /**
     * Realiza la conexion al servidor
     * @return mensaje Indica si la conexion fue exitosa
     */
    @SuppressLint("NewApi")
    public String conectar() {
        intentoConectar = true;
        try {
            System.out.println("Conectado en 4 ");
            canal = new Socket();
            /**
             * Create a client socket with the host,
             * port, and timeout information.
             */
            System.out.println("Conectado en 3");
            canal.bind(null);
            System.out.println("Conectado en 2");
            canal.connect((new InetSocketAddress(ip, 10052)));
            System.out.println("Conectado en 1");
            out = new PrintWriter(canal.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(canal.getInputStream()));

            String info = "";

            AccountManager aManager = AccountManager.get(this);
            Account[] accounts = aManager.getAccountsByType("com.google");

            for (Account account : accounts) {
                String accountId = account.name;
                info += accountId + " : ";
            }

            out.println(INFO_USUARIO + ";" + "U:" + info);

            String mens = in.readLine();

            System.out.println("Estas conectado! " + mens + " : " + canal.getInetAddress());
            mensajeConexion = "Estas conectado!";
            return "Estas Conectado!";
        } catch (SocketException e) {
            System.out.println("No se establecio la conexion");
            mensajeConexion = "No se estableci la conexin: " + e.getMessage();
            return "No se establecio la conexin";
        } catch (Exception e) {
            System.out.println("No se establecio la conexion");
            mensajeConexion = "No se estableci la conexin: " + e.getMessage();
            return "No se establecio la conexin";
        }
    }

    /**
     * Manda mensaje al servidor para pedir canciones
     * @return
     */
    public void consultarCanciones() {
        if (busqueda.getText().equals("Por Titulo")) {
            out.println(BUSCAR_POR_NOMBRE + ";" + campoBusqueda.getText());
            System.out.println(BUSCAR_POR_NOMBRE + " - pidiendo canciones");
        } else if (busqueda.getText().equals("Por Artista")) {
            out.println(BUSCAR_POR_ARTISTA + ";" + campoBusqueda.getText());
            System.out.println(BUSCAR_POR_NOMBRE + " - pidiendo canciones");
        }
    }

    /**
     * Recibe la informacion del servidor con las canciones
     * o cualcquier informacion   `
     * @return Mensaje
     */
    public String recibir() {
        String mensajeRecibir = "";
        try {
            System.out.println("recibiendo canciones metodo recibir");
            String linea = in.readLine();
            if (linea == null) {
                mensajeConexion = "desconectado";
                mensajeRecibir = mensajeConexion;
            }
            System.out.println("-----" + linea + "-----");

            int i = 0;
            while (linea != null && !linea.equals("TERMINO")) {
                i++;
                System.out.println(linea);

                if (linea.split(";").length > 1) {
                    String[] lineaSp = linea.split(";");

                    if (lineaSp[0].equals(AGREGAR_CANCION)) {
                        String[] infoCancion = lineaSp[1].split(" : ");
                        Cancion cancion = new Cancion(infoCancion[0], infoCancion[1], infoCancion[2]);
                        System.out.println("agrega cancion : " + cancion);
                        canciones.add(cancion);
                    } else {
                        mensajeRecibir = lineaSp[1];
                        System.out.println("mensaje no == AGREGAR_CANCION");
                    }
                }

                System.out.println("No entro AGREGAR");
                linea = in.readLine();
            }
            System.out.println("linae al final es: " + linea);

            Intent intent = new Intent(this, Resultados.class);
            intent.putParcelableArrayListExtra(EXTRA_CANCIONES, canciones);
            intent.putParcelableArrayListExtra(EXTRA_LISTA, milista);
            startActivityForResult(intent, 999);
        } catch (SocketException e) {
            mensajeRecibir = e.getMessage();
            e.printStackTrace();
        } catch (IOException e) {
            mensajeRecibir = e.getMessage();
            e.printStackTrace();
        } catch (Exception e) {
            mensajeRecibir = e.getMessage();
            e.printStackTrace();
        }
        return mensajeRecibir;
    }

    /**
     * Envia las canciones de la lista al servidor
     */
    public void enviarCanciones() {
        mensajeConexion = "Estas conectado!";
        for (int i = 0; i < milista.size(); i++) {
            Cancion c = (Cancion) milista.get(i);
            out.println(AGREGAR_CANCION + ";" + c.toString());
        }
        if (milista.size() > 0)
            out.println(AGREGAR_LISTA);
    }

    /**
     * Muestra mensaje de resultado de intento de conexion cuando
     * se resume la aplicacion
     * o cuando se envia la lista
     */
    private void mostrarMensaje(String mensaje) {
        AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
        builder1.setMessage(mensaje);
        builder1.setCancelable(false);
        builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });

        AlertDialog alert11 = builder1.create();
        alert11.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem arg0) {
        if (canal == null || !canal.isConnected() || canal.isClosed() || canal.isInputShutdown()
                || (mensajeConexion != null && mensajeConexion.equals("desconectado")) || mensajeConexion == null) {
            try {

                Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes

                startActivityForResult(intent, 0);

            } catch (Exception e) {

                Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
                Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
                startActivity(marketIntent);
            }
        } else {
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
            builder1.setMessage("Ya estas conectado, no necesitas escanear");
            builder1.setCancelable(false);
            builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });

            AlertDialog alert11 = builder1.create();
            alert11.show();
        }

        return true;
    }

    //------------------------------------
    //Metodos Privados
    //------------------------------------
}