/***
 * Wyciąg z książki "Hello, Android!",
 * opublikowanej przez wydawnictwo Helion S.A.
 * Niniejszy kod jest chroniony prawami autorskimi. Nie może zostać wykorzystany do utworzenia 
 * materiałów treningowych, kursów, książek, artykułów, itp. Prosimy o kontakt w razie
 * pojawienia się wątpliwości.
 * Nie gwarantujemy, że niniejszy kod będzie się nadawał do jakiegokolwiek celu. 
 * Więcej informacji można znaleźć na stronie http://www.pragmaticprogrammer.com/titles/eband.
***/
package org.przyklad.testpolozenia;

import java.util.List;

import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;

public class TestPolozenia extends Activity implements
    LocationListener {
                 
    private static final String[] A = { "nieprawidłowa" , "niedostępna" , "dokładna" , 
        "zgrubna" };
    private static final String[] P = { "nieprawidłowa" , "niedostępna" , "niska" , 
        "średnia" , "wysoka" };
    private static final String[] S = { "nieczynny" ,
        "tymczasowo niedostępny" , "dostępny" };
    
    private LocationManager menedzer;
    private TextView wyjscie;
    private String najlepszy;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        menedzer = (LocationManager) getSystemService(LOCATION_SERVICE);
        wyjscie = (TextView) findViewById(R.id.wyjscie);

        dziennik("Dostawcy położenia:" );
        wyrzucDostawcow();

        Criteria kryteria = new Criteria();
        najlepszy = menedzer.getBestProvider(kryteria, true);
        dziennik("\nNajlepszym dostawcą jest: " + najlepszy);

        dziennik("\nLokalizacja (począwszy od ostatniej znanej):" );
        Location lokacja = menedzer.getLastKnownLocation(najlepszy);
        wyrzucLokacje(lokacja);
    }
                
    @Override
    protected void onResume() {
        super.onResume();
        // Uruchamia aktualizacje (dokumentacja zaleca opóźnienie >= 60000 ms)
        menedzer.requestLocationUpdates(najlepszy, 15000, 1, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Zatrzymuje aktualizacje podczas wstrzymania aplikacji
        menedzer.removeUpdates(this);
    }
                
    public void onLocationChanged(Location lokacja) {
        wyrzucLokacje(lokacja);
    }

    public void onProviderDisabled(String dostawca) {
        dziennik("\nWyłączony dostawca: " + dostawca);
    }

    public void onProviderEnabled(String dostawca) {
        dziennik("\nWłączony dostawca: " + dostawca);
    }

    public void onStatusChanged(String dostawca, int status,
            Bundle dodatki) {
        dziennik("\nZmiana stanu dostawcy: " + dostawca + ", status="
                + S[status] + ", dodatkowe=" + dodatki);
    }
                
    /** Wyświetla ciąg znaków w oknie wynikowym */
    private void dziennik(String string) {
        wyjscie.append(string + "\n" );
    }

    /** Wyświetla informajce od wszystkich dostawców położenia */
    private void wyrzucDostawcow() {
        List<String> dostawcy = menedzer.getAllProviders();
        for (String dostawca : dostawcy) {
            wyrzucDostawce(dostawca);
        }
    }

    /** Wyświetla informacje od jednego dostawcy położenia */
    private void wyrzucDostawce(String dostawca) {
        LocationProvider info = menedzer.getProvider(dostawca);
        StringBuilder konstruktor = new StringBuilder();
        konstruktor.append("LocationProvider[" )
            .append("nazwa=" )
            .append(info.getName())
            .append(",uruchomiony=" )
            .append(menedzer.isProviderEnabled(dostawca))
            .append(",Dokładność (getAccuracy)=" )
            .append(A[info.getAccuracy() + 1])
            .append(",Koszty energetyczne (getPowerRequirement)=" )
            .append(P[info.getPowerRequirement() + 1])
            .append(",Koszty pieniężne (hasMonetaryCost)=" )
            .append(info.hasMonetaryCost())
            .append(",Wieża nadawcza (requiresCell)=" )
            .append(info.requiresCell())
            .append(",Sieć (requiresNetwork)=" )
            .append(info.requiresNetwork())
            .append(",Satelita (requiresSatellite)=" )
            .append(info.requiresSatellite())
            .append(",Obsługa wysokości (supportsAltitude)=" )
            .append(info.supportsAltitude())
            .append(",Obsługa pelengu (supportsBearing)=" )
            .append(info.supportsBearing())
            .append(",Obsługa prędkości (supportsSpeed)=" )
            .append(info.supportsSpeed())
            .append("]" );
        dziennik(konstruktor.toString());
    }

    /** Opisuje daną lokalizację, może przyjąć wartość null */
    private void wyrzucLokacje(Location lokacja) {
        if (lokacja == null)
            dziennik("\nLokacja[nieznana]" );
        else
            dziennik("\n" + lokacja.toString());
    }
}
