text: package com.survivingwithandroid.weathermap;
  
  import android.support.v4.app.FragmentActivity;
  import android.os.Bundle;
  import android.view.View;
  import android.widget.AdapterView;
  import android.widget.ArrayAdapter;
  import android.widget.Spinner;
  
  import com.google.android.gms.maps.GoogleMap;
  import com.google.android.gms.maps.SupportMapFragment;
  import com.google.android.gms.maps.model.LatLng;
  import com.google.android.gms.maps.model.MarkerOptions;
  import com.google.android.gms.maps.model.TileOverlay;
  import com.google.android.gms.maps.model.TileOverlayOptions;
  import com.google.android.gms.maps.model.TileProvider;
  import com.google.android.gms.maps.model.UrlTileProvider;
  
  import java.net.MalformedURLException;
  import java.net.URL;
  
  public class MapsActivity extends FragmentActivity {
  
      private GoogleMap mMap; // Might be null if Google Play services APK is not available.
      private static String OWM_TILE_URL = "http://tile.openweathermap.org/map/%s/%d/%d/%d.png";
      private Spinner spinner;
      private String tileType = "clouds";
      private TileOverlay tileOver;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_maps);
          spinner = (Spinner) findViewById(R.id.tileType);
  
          String[] tileName = new String[]{"Clouds", "Temperature", "Precipitations", "Snow", "Rain", "Wind", "Sea level press."};
  
          ArrayAdapter<String> adpt = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tileName);
  
          spinner.setAdapter(adpt);
          spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  
              @Override
              public void onNothingSelected(AdapterView<?> parent) {
  
              }
  
              @Override
              public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                   // Check click
                  switch (position) {
                      case 0:
                          tileType = "clouds";
                          break;
                      case 1:
                          tileType = "temp";
                          break;
                      case 2:
                          tileType = "precipitation";
                          break;
                      case 3:
                          tileType = "snow";
                          break;
                      case 4:
                          tileType = "rain";
                          break;
                      case 5:
                          tileType = "wind";
                          break;
                      case 6:
                          tileType = "pressure";
                          break;
  
                  }
  
                  if (mMap != null) {
                      tileOver.remove();
                      setUpMap();
                  }
  
  
              }
          });
          setUpMapIfNeeded();
      }
  
      @Override
      protected void onResume() {
          super.onResume();
          setUpMapIfNeeded();
      }
  
      /**
       * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
       * installed) and the map has not already been instantiated.. This will ensure that we only ever
       * call {@link #setUpMap()} once when {@link #mMap} is not null.
       * <p/>
       * If it isn't installed {@link SupportMapFragment} (and
       * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
       * install/update the Google Play services APK on their device.
       * <p/>
       * A user can return to this FragmentActivity after following the prompt and correctly
       * installing/updating/enabling the Google Play services. Since the FragmentActivity may not
       * have been completely destroyed during this process (it is likely that it would only be
       * stopped or paused), {@link #onCreate(Bundle)} may not be called again so we should call this
       * method in {@link #onResume()} to guarantee that it will be called.
       */
      private void setUpMapIfNeeded() {
          // Do a null check to confirm that we have not already instantiated the map.
          if (mMap == null) {
              // Try to obtain the map from the SupportMapFragment.
              mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                      .getMap();
              // Check if we were successful in obtaining the map.
              if (mMap != null) {
                  setUpMap();
              }
          }
      }
  
      /**
       * This is where we can add markers or lines, add listeners or move the camera. In this case, we
       * just add a marker near Africa.
       * <p/>
       * This should only be called once and when we are sure that {@link #mMap} is not null.
       */
      private void setUpMap() {
         // Add weather tile
         //tileOver = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(createTilePovider()));
  
          tileOver = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(createTransparentTileProvider()));
      }
  
      private TileProvider createTransparentTileProvider() {
          return new TransparentTileOWM(tileType);
      }
  
  
      private TileProvider createTilePovider() {
          TileProvider tileProvider = new UrlTileProvider(256, 256) {
              @Override
              public URL getTileUrl(int x, int y, int zoom) {
                  String fUrl = String.format(OWM_TILE_URL, tileType == null ? "clouds" : tileType, zoom, x, y);
                  URL url = null;
                  try {
                      url = new URL(fUrl);
                  }
                  catch(MalformedURLException mfe) {
                      mfe.printStackTrace();
                  }
  
                  return url;
              }
          } ;
  
          return tileProvider;
      }
  }
  