commit 934134621d1bedf001bcb2b40f827086902fc2c6 Author: hmalik144 Date: Sun Dec 30 13:59:29 2018 +1100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd45b12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/caches/build_file_checksums.ser +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/h_mal.xml b/.idea/dictionaries/h_mal.xml new file mode 100644 index 0000000..23aca1d --- /dev/null +++ b/.idea/dictionaries/h_mal.xml @@ -0,0 +1,7 @@ + + + + retreived + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b0c7b20 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..e4fb3aa --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.appttude.h_mal.exchangemap" + minSdkVersion 23 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:design:28.0.0' + implementation 'com.google.android.gms:play-services-maps:16.0.0' + implementation 'com.google.android.gms:play-services-places:16.0.0' + implementation "com.google.android.gms:play-services-location:16.0.0" + implementation 'com.android.support:support-v4:28.0.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/appttude/h_mal/exchangemap/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/appttude/h_mal/exchangemap/ExampleInstrumentedTest.java new file mode 100644 index 0000000..ad32e9c --- /dev/null +++ b/app/src/androidTest/java/com/appttude/h_mal/exchangemap/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.appttude.h_mal.exchangemap; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.appttude.h_mal.exchangemap", appContext.getPackageName()); + } +} diff --git a/app/src/debug/res/values/google_maps_api.xml b/app/src/debug/res/values/google_maps_api.xml new file mode 100644 index 0000000..e505be8 --- /dev/null +++ b/app/src/debug/res/values/google_maps_api.xml @@ -0,0 +1,24 @@ + + + AIzaSyA8DdDZvG6ihSrR5TlkG4FXb6ffyt19_Pg + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e44dc01 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..ff81caa Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/CustomDialogClass.java b/app/src/main/java/com/appttude/h_mal/exchangemap/CustomDialogClass.java new file mode 100644 index 0000000..413e396 --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/CustomDialogClass.java @@ -0,0 +1,96 @@ +package com.appttude.h_mal.exchangemap; + +import android.app.Dialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.TextView; + +public class CustomDialogClass extends Dialog implements android.view.View.OnClickListener{ + + Context context; + ListView listView; + TextView textView; + EditText editText; + int selection; + + public CustomDialogClass(@NonNull Context context, TextView textView) { + super(context); + this.context = context; + this.textView = textView; + if (textView.getId() == R.id.currency_one){ + selection = 1; + }else{ + selection = 2; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.custom_dialog); + +// getWindow().setBackgroundDrawableResource(android.R.color.transparent); +// +// getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); +// +// listView = (ListView) findViewById(R.id.list_view); +// editText = (EditText) findViewById(R.id.search_text) ; +// +// final ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(context,R.array.currency_arrays,android.R.layout.simple_list_item_1); +// listView.setAdapter(arrayAdapter); +// +// editText.addTextChangedListener(new TextWatcher() { +// @Override +// public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { +// +// } +// +// @Override +// public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { +// arrayAdapter.getFilter().filter(charSequence); +// } +// +// @Override +// public void afterTextChanged(Editable editable) { +// +// } +// }); +// +// listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { +// @Override +// public void onItemClick(AdapterView adapterView, View view, int i, long l) { +// textView.setText(adapterView.getItemAtPosition(i).toString()); +// SharedPreferences.Editor editor = pref.edit(); +// if (selection == 1) { +// editor.putString(CURRENCY_ONE,adapterView.getItemAtPosition(i).toString()); +// }else{ +// editor.putString(CURRENCY_TWO,adapterView.getItemAtPosition(i).toString()); +// } +// editor.apply(); +// currencyOneEditText.setText(""); +// currencyTwoEditText.setText(""); +// String stringURL = UriBuilder(currencyOne.getText().toString().substring(0,3), +// currencyTwo.getText().toString().substring(0,3)); +// MyAsyncTask task = new MyAsyncTask(); +// task.execute(stringURL); +// dismiss(); +// } +// }); + } + + @Override + public void onClick(View view) { + + } +} + diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/FragmentMap.java b/app/src/main/java/com/appttude/h_mal/exchangemap/FragmentMap.java new file mode 100644 index 0000000..8e4ed9f --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/FragmentMap.java @@ -0,0 +1,367 @@ +package com.appttude.h_mal.exchangemap; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.text.TextPaint; +import android.text.style.CharacterStyle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.google.android.gms.common.data.DataBufferUtils; +import com.google.android.gms.location.places.AutocompleteFilter; +import com.google.android.gms.location.places.AutocompletePrediction; +import com.google.android.gms.location.places.AutocompletePredictionBufferResponse; +import com.google.android.gms.location.places.GeoDataClient; +import com.google.android.gms.location.places.Place; +import com.google.android.gms.location.places.PlaceBufferResponse; +import com.google.android.gms.location.places.PlaceDetectionClient; +import com.google.android.gms.location.places.PlaceLikelihood; +import com.google.android.gms.location.places.PlaceLikelihoodBufferResponse; +import com.google.android.gms.location.places.Places; +import com.google.android.gms.maps.CameraUpdate; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.MapView; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.RuntimeExecutionException; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static android.content.ContentValues.TAG; +import static com.appttude.h_mal.exchangemap.MapsJsonCall.*; + +import static com.google.android.gms.location.places.AutocompleteFilter.TYPE_FILTER_ADDRESS; +import static com.google.android.gms.location.places.AutocompleteFilter.TYPE_FILTER_ESTABLISHMENT; + +public class FragmentMap extends Fragment implements OnMapReadyCallback { + + private GoogleMap mMap; + private GeoDataClient mGeoDataClient; + private PlaceDetectionClient mPlaceDetectionClient; + LatLngBounds bounds; + + private String TAG = getClass().getSimpleName(); + + public FragmentMap() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View rootview = inflater.inflate(R.layout.fragment_maps, container, false); + + + FloatingActionButton fab = rootview.findViewById(R.id.floatingActionButton); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FragmentTransaction fragmentTransaction = (MapsActivity.fragmentManager).beginTransaction(); + fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) + .replace(R.id.container,new FragmentSearch()) + .addToBackStack("search").commit(); + } + }); + + return rootview; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); + supportMapFragment.getMapAsync(this); + } + + @Override + public void onMapReady(GoogleMap googleMap) { + mMap = googleMap; + + // Add a marker in Sydney and move the camera + LatLng current = new LatLng(getLatLong.latitude, getLatLong.longitude); + if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + return; + }else{ + mMap.setMyLocationEnabled(true); + } + + + mMap.addCircle(new CircleOptions().center(current)); +// mMap.addMarker(new MarkerOptions().position(current).title("Marker in Sydney")); + mMap.moveCamera(CameraUpdateFactory.newLatLng(current)); + + double radiusDegrees = 0.; + LatLng northEast = new LatLng(current.latitude + radiusDegrees, current.longitude + radiusDegrees); + LatLng southWest = new LatLng(current.latitude - radiusDegrees, current.longitude - radiusDegrees); + bounds = LatLngBounds.builder() + .include(northEast) + .include(southWest) + .build(); + mGeoDataClient = Places.getGeoDataClient(getContext()); + + getLocationOnMap locationOnMap = new getLocationOnMap(); + locationOnMap.execute(current); + +// AutocompleteFilter typeFilter = new AutocompleteFilter.Builder() +// .setTypeFilter(TYPE_FILTER_ESTABLISHMENT ) +// .build(); +// +// Task results = +// mGeoDataClient.getAutocompletePredictions("currency", bounds, typeFilter); +// +// +// LocationAsyncTask locationAsyncTask = new LocationAsyncTask(); +// locationAsyncTask.execute(results); + + + } + + private void showCurrentPlace() { + if (mMap == null) { + return; + } + +// final LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); +// LatLngBounds newBounds = null; + + try{ + @SuppressWarnings("MissingPermission") final + Task placeResult = + mPlaceDetectionClient.getCurrentPlace(null); + placeResult.addOnCompleteListener + (new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful() && task.getResult() != null) { + PlaceLikelihoodBufferResponse likelyPlaces = task.getResult(); + + + for (PlaceLikelihood placeLikelihood : likelyPlaces) { + // Build a list of likely places to show the user. + Place myPlace = placeLikelihood.getPlace(); + Log.i(TAG, "Place found: " + myPlace.getName()); + mMap.addMarker(new MarkerOptions().position(myPlace.getLatLng()).title(myPlace.getName().toString())); +// boundsBuilder.include(placeLikelihood.getPlace().getLatLng()); + } + + // Release the place likelihood buffer, to avoid memory leaks. + likelyPlaces.release(); + + + } else { + Log.e(TAG, "Exception: %s", task.getException()); + } + } + + }); +// newBounds = boundsBuilder.build(); + }catch (Exception e){ + Log.e(TAG, "showCurrentPlace: ", e); + }finally { +// try { +// CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 10); +// mMap.animateCamera(cameraUpdate); +// }catch (Exception e){ +// Log.e(TAG, "onPostExecute: ", e); +// }finally { +// if (newBounds == null){ +// mMap.animateCamera( CameraUpdateFactory.newLatLngBounds(bounds, 0) ); +// } +// } + } + + + } + + private class getLocationOnMap extends AsyncTask{ + + @Override + protected MapItem doInBackground(LatLng... latLngs) { + String json = null; + MapItem mapItem = null; + + try { + Log.i(TAG, "doInBackground: " + UriBuilder(latLngs[0]) ); + URL url = createUrl(UriBuilder(latLngs[0])); + json = makeHttpRequest(url); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if (json != null){ + mapItem = extractFeatureFromJson(json); + } + } + + return mapItem; + } + + @Override + protected void onPostExecute(MapItem mapItem) { + super.onPostExecute(mapItem); + + LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); + LatLngBounds newBounds = null; + + try { + + ArrayList results = mapItem.getResults(); + + for (int i=0; i () { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + PlaceBufferResponse places = task.getResult(); + Place myPlace = places.get(0); + + Log.i(TAG, "Place found: " + myPlace.getName()); + mMap.addMarker(new MarkerOptions().position(myPlace.getLatLng()).title(myPlace.getName().toString())); + places.release(); + } else { + Log.e(TAG, "Place not found."); + } + } + }); + } + newBounds = boundsBuilder.build(); + }catch (Exception e){ + Log.e(TAG, "onPostExecute: ",e ); + }finally { + try { + CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(newBounds, 10); + mMap.animateCamera(cameraUpdate); + }catch (Exception e){ + Log.e(TAG, "onPostExecute: ", e); + }finally { + if (newBounds == null){ + mMap.animateCamera( CameraUpdateFactory.newLatLngBounds(bounds, 0) ); + } + } + + } + + } + } + + private class LocationAsyncTask extends AsyncTask, Void, AutocompletePredictionBufferResponse>{ + + @Override + protected AutocompletePredictionBufferResponse doInBackground(Task... tasks) { + + try { + Tasks.await(tasks[0], 60, TimeUnit.SECONDS); + } catch (ExecutionException | InterruptedException | TimeoutException e) { + e.printStackTrace(); + } + + return tasks[0].getResult(); + } + + @Override + protected void onPostExecute(AutocompletePredictionBufferResponse response) { + super.onPostExecute(response); + + try { + + Log.i(TAG, "Query completed. Received " + response.getCount() + + " predictions."); + + String [] ids = {"ChIJndkxNgNakWsRjHGZBzHxu8M","ChIJUcxf7YxbkWsRsndgEcBNlLQ","ChIJk-7r9ARakWsRv16cDh3GXzU","ChIJh4SRLgNakWsRuyWBDLouw-4","ChIJL533ngRakWsRUp51ucHAp5Q","ChIJy1uXvQRakWsRT6xLCK9LmzY","ChIJcTZWngRakWsRm8Cz7egsDm8","ChIJDfur3xxakWsR4WP10zl01Hg"}; + + for (int i=0; i () { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + PlaceBufferResponse places = task.getResult(); + Place myPlace = places.get(0); + Log.i(TAG, "Place found: " + myPlace.getName()); + mMap.addMarker(new MarkerOptions().position(myPlace.getLatLng()).title(myPlace.getName().toString())); + places.release(); + } else { + Log.e(TAG, "Place not found."); + } + } + }); + } + +// for (int i = 0; i < response.getCount(); i++){ +// final String retrievedId = response.get(i).getPlaceId(); +// +// mGeoDataClient.getPlaceById(retrievedId).addOnCompleteListener(new OnCompleteListener() { +// @Override +// public void onComplete(@NonNull Task task) { +// if (task.isSuccessful()) { +// PlaceBufferResponse places = task.getResult(); +// Place myPlace = places.get(0); +// Log.i(TAG, "Place found: " + myPlace.getName()); +// mMap.addMarker(new MarkerOptions().position(myPlace.getLatLng()).title(myPlace.getName().toString())); +// places.release(); +// } else { +// Log.e(TAG, "Place not found."); +// } +// } +// }); +// } + +// // Freeze the results immutable representation that can be stored safely. +// ArrayList al = DataBufferUtils.freezeAndClose(response); +// +// for (AutocompletePrediction p : al) { +// CharSequence cs = p.getFullText(new CharacterStyle() { +// @Override +// public void updateDrawState(TextPaint tp) { +// mMap.addMarker(new MarkerOptions().position().title("Marker in Sydney")); +// } +// }); +// Log.i(TAG, cs.toString()); +// } + + } catch (RuntimeExecutionException e) { + // If the query did not complete successfully return null + Log.e(TAG, "Error getting autocomplete prediction API call", e); + } finally { + mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds,0)); + } + } + } + +} diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/FragmentSearch.java b/app/src/main/java/com/appttude/h_mal/exchangemap/FragmentSearch.java new file mode 100644 index 0000000..354efd1 --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/FragmentSearch.java @@ -0,0 +1,101 @@ +package com.appttude.h_mal.exchangemap; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.EdgeEffect; +import android.widget.EditText; +import android.widget.ImageView; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.location.places.AutocompleteFilter; +import com.google.android.gms.location.places.AutocompletePrediction; +import com.google.android.gms.location.places.PlaceDetectionClient; +import com.google.android.gms.location.places.Places; +import com.google.android.gms.location.places.ui.PlaceAutocomplete; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; + +import static com.appttude.h_mal.exchangemap.MapsActivity.getLocationName; +import static com.google.android.gms.location.places.AutocompleteFilter.TYPE_FILTER_ADDRESS; +import static com.google.android.gms.location.places.AutocompleteFilter.TYPE_FILTER_CITIES; +import static com.google.android.gms.location.places.AutocompleteFilter.TYPE_FILTER_ESTABLISHMENT; + + +public class FragmentSearch extends Fragment implements GoogleApiClient.OnConnectionFailedListener { + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + + } + + private GoogleApiClient googleApiClient; + private PlaceAutocompleteAdapter mAutocompleteAdapter; + public static final LatLngBounds LAT_LNG_BOUNDS = new LatLngBounds( + new LatLng(-40,-160),new LatLng(71,136) + ); + + + public FragmentSearch() { + // Required empty public constructor + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View rootView = inflater.inflate(R.layout.fragment_search, container, false); + + String[] airports = getResources().getStringArray(R.array.airports); + ArrayAdapter adapter = + new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, airports); + + final AutoCompleteTextView homeLocationEditText = rootView.findViewById(R.id.location_home); + + ImageView myLocation = rootView.findViewById(R.id.my_loc); + myLocation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String myLocation = getLocationName(getContext(),getLatLong.latitude,getLatLong.longitude); + homeLocationEditText.setText(myLocation); + } + }); + + AutoCompleteTextView departureEditText = rootView.findViewById(R.id.location_home_departure); + departureEditText.setAdapter(adapter); + + AutoCompleteTextView arrivalEditText = rootView.findViewById(R.id.location_arrival_airport); + arrivalEditText.setAdapter(adapter); + + googleApiClient = new GoogleApiClient.Builder(getContext()) + .addApi(Places.GEO_DATA_API) + .addApi(Places.PLACE_DETECTION_API) + .enableAutoManage(getActivity(),this) + .build(); + + AutocompleteFilter typeFilter = new AutocompleteFilter.Builder() + .setTypeFilter(TYPE_FILTER_CITIES ) +// .setTypeFilter(TYPE_FILTER_ADDRESS) + .build(); + + mAutocompleteAdapter = new PlaceAutocompleteAdapter(getContext(),googleApiClient,LAT_LNG_BOUNDS,typeFilter); + + AutoCompleteTextView destinationEditText = rootView.findViewById(R.id.location_arrival_); + + destinationEditText.setAdapter(mAutocompleteAdapter); + homeLocationEditText.setAdapter(mAutocompleteAdapter); + + return rootView; + } + + + +} diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/MapItem.java b/app/src/main/java/com/appttude/h_mal/exchangemap/MapItem.java new file mode 100644 index 0000000..dd88b8f --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/MapItem.java @@ -0,0 +1,197 @@ +package com.appttude.h_mal.exchangemap; + +import android.support.annotation.Nullable; + +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; + +import java.net.URL; +import java.util.ArrayList; + +public class MapItem { + + private String next_page_token; + private ArrayList results; + + public static class result{ + private String formatted_Address; + private Geometry geometry; + private URL icon; + private String placeId; + private String name; + private OpeningHours openingHours; + private ArrayList photos; + private String place_id; + private PlusCode plusCode; + private Double rating; + private String reference; + private ArrayList types; + + public result(String formatted_Address, Geometry geometry, URL icon, String placeId, String name, + @Nullable OpeningHours openingHours, @Nullable ArrayList photos, String place_id, PlusCode plusCode, Double rating, + String reference, ArrayList types) { + this.formatted_Address = formatted_Address; + this.geometry = geometry; + this.icon = icon; + this.placeId = placeId; + this.name = name; + this.openingHours = openingHours; + this.photos = photos; + this.place_id = place_id; + this.plusCode = plusCode; + this.rating = rating; + this.reference = reference; + this.types = types; + } + + public String getFormatted_Address() { + return formatted_Address; + } + + public Geometry getGeometry() { + return geometry; + } + + public URL getIcon() { + return icon; + } + + public String getPlaceId() { + return placeId; + } + + public String getName() { + return name; + } + + public OpeningHours getOpeningHours() { + return openingHours; + } + + public ArrayList getPhotos() { + return photos; + } + + public String getPlace_id() { + return place_id; + } + + public PlusCode getPlusCode() { + return plusCode; + } + + public Double getRating() { + return rating; + } + + public String getReference() { + return reference; + } + + public ArrayList getTypes() { + return types; + } + } + + private String status; + + public MapItem(String next_page_token, ArrayList results, String status) { + this.next_page_token = next_page_token; + this.results = results; + this.status = status; + } + + public String getNext_page_token() { + return next_page_token; + } + + public ArrayList getResults() { + return results; + } + + public String getStatus() { + return status; + } + + public static class Geometry{ + private LatLng location; + private LatLngBounds viewport; + + public Geometry(LatLng location, LatLngBounds viewport) { + this.location = location; + this.viewport = viewport; + } + + public LatLng getLocation() { + return location; + } + + public LatLngBounds getViewport() { + return viewport; + } + } + + public static class OpeningHours{ + private Boolean openNow; + + public OpeningHours(Boolean openNow) { + this.openNow = openNow; + } + + public Boolean getOpenNow() { + return openNow; + } + } + + public static class Photo{ + private int height; + private String htmlAttributions; + private String photoReference; + private int width; + + public Photo(int height, String htmlAttributions, String photoReference, int width) { + this.height = height; + this.htmlAttributions = htmlAttributions; + this.photoReference = photoReference; + this.width = width; + } + + public int getHeight() { + return height; + } + + public String getHtmlAttributions() { + return htmlAttributions; + } + + public String getPhotoReference() { + return photoReference; + } + + public int getWidth() { + return width; + } + } + + public static class PlusCode { + + private String globalCode; + private String compoundCode; + + public PlusCode(String globalCode, String compoundCode) { + this.globalCode = globalCode; + this.compoundCode = compoundCode; + } + + public String getGlobalCode() { + return globalCode; + } + + public String getCompoundCode() { + return compoundCode; + } + + } +} + + diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/MapsActivity.java b/app/src/main/java/com/appttude/h_mal/exchangemap/MapsActivity.java new file mode 100644 index 0000000..6715d9e --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/MapsActivity.java @@ -0,0 +1,172 @@ +package com.appttude.h_mal.exchangemap; + +import android.Manifest; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.location.Address; +import android.location.Geocoder; +import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.Toast; + +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; + +import java.io.IOException; +import java.util.List; +import java.util.Locale; + +public class MapsActivity extends FragmentActivity { + + + public static int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1; + public static FragmentManager fragmentManager; + private String currentFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main_layout); + + if (ActivityCompat.checkSelfPermission(this, + android.Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + + if (!ActivityCompat.shouldShowRequestPermissionRationale(this, + android.Manifest.permission.ACCESS_FINE_LOCATION)) { + requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, + MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); + } + } + getLatLong.configLatLong(this); + // Obtain the SupportMapFragment and get notified when the map is ready to be used. +// SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() +// .findFragmentById(R.id.map); +// mapFragment.getMapAsync(this); + + fragmentManager = getSupportFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.container,new FragmentMap()).addToBackStack("main") +// .setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left) + .commit(); + + fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { + @Override + public void onBackStackChanged() { + List f = fragmentManager.getFragments(); + Fragment frag = f.get(0); + currentFragment = frag.getClass().getSimpleName(); + } + }); + + } + + public static String getLocationName(Context context, Double latitude, Double longitude) { + Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); + String result = ""; + List
list = null; + try { + list = geoCoder.getFromLocation(latitude, longitude, 1); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if (list != null & list.size() > 0) { + Address address = list.get(0); + result = address.getLocality(); + } + } + + return result; + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION) { + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + try { + getLatLong.configLatLong(this); + } catch (Exception e) { + System.out.println("error msg: " + e); + } + + Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show(); + + } else { + Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show(); + } + } + + } + + @Override + public void onBackPressed() { + + switch (currentFragment) { + case "FragmentMap": + new AlertDialog.Builder(this) + .setTitle("Leave?") + .setMessage("Are you sure you want to exit?") + .setNegativeButton(android.R.string.no, null) + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.addCategory(Intent.CATEGORY_HOME); + startActivity(intent); + finish(); + System.exit(0); + } + }).create().show(); + return; +// case "FragmentAddItem": +// if(FragmentAddItem.mRadioGroup.getCheckedRadioButtonId() == -1) { +// fragmentManager.popBackStack(); +// }else{ +// new AlertDialog.Builder(this) +// .setTitle("Discard Changes?") +// .setMessage("Are you sure you want to discard changes?") +// .setNegativeButton(android.R.string.no, null) +// .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface arg0, int arg1) { +// fragmentManager.popBackStack(); +// } +// }).create().show(); +// +// } +// return; + default: + if (fragmentManager.getBackStackEntryCount() > 1) { + fragmentManager.popBackStack(); + } + } + + } + /** + * Manipulates the map once available. + * This callback is triggered when the map is ready to be used. + * This is where we can add markers or lines, add listeners or move the camera. In this case, + * we just add a marker near Sydney, Australia. + * If Google Play services is not installed on the device, the user will be prompted to install + * it inside the SupportMapFragment. This method will only be triggered once the user has + * installed Google Play services and returned to the app. + */ + +} diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/MapsJsonCall.java b/app/src/main/java/com/appttude/h_mal/exchangemap/MapsJsonCall.java new file mode 100644 index 0000000..ccb3c96 --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/MapsJsonCall.java @@ -0,0 +1,217 @@ +package com.appttude.h_mal.exchangemap; + +import android.content.Context; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +import com.appttude.h_mal.exchangemap.MapItem.*; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; + +public class MapsJsonCall { + + private static String TAG = MapsJsonCall.class.getSimpleName(); + + private static Context context; + + protected static String UriBuilder(LatLng l){ + + Uri.Builder builder = new Uri.Builder(); + builder.scheme("https") + .authority("maps.googleapis.com") + .appendPath("maps") + .appendPath("api") + .appendPath("place") + .appendPath("textsearch") + .appendPath("json") + .appendQueryParameter("query","currency exchange") + .appendQueryParameter("location",l.latitude+","+l.longitude) + .appendQueryParameter("radius","3") + .appendQueryParameter("key","QUl6YVN5QThEZERadkc2aWhTclI1VGxrRzRGWGI2ZmZ5dDE5X1Bn"); + + return builder.build().toString().replace("%2C",",").replace("%20", "+"); + + } + + public static URL createUrl(String stringUrl) { + URL url = null; + try { + url = new URL(stringUrl); + } catch (MalformedURLException e) { + Log.e("ERROR", "Error with creating URL ", e); + } + return url; + } + + public static String makeHttpRequest(URL url) throws IOException { + String jsonResponse = null; + + if (url == null) { + return jsonResponse; + } + + HttpURLConnection urlConnection = null; + InputStream inputStream = null; + try { + urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setReadTimeout(30000); + urlConnection.setConnectTimeout(30000); + urlConnection.setRequestMethod("GET"); + urlConnection.connect(); + + if (urlConnection.getResponseCode() == 200) { + inputStream = urlConnection.getInputStream(); + jsonResponse = readFromStream(inputStream); + } else { + Log.e("", "Error response code: " + urlConnection.getResponseCode()); + } + } catch (IOException e) { + Log.e("", "Problem retrieving the JSON results.", e); + } finally { + if (urlConnection != null) { + urlConnection.disconnect(); + } + if (inputStream != null) { + inputStream.close(); + } + } + + return jsonResponse; + } + + private static String readFromStream(InputStream inputStream) throws IOException { + StringBuilder output = new StringBuilder(); + if (inputStream != null) { + InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8")); + BufferedReader reader = new BufferedReader(inputStreamReader); + String line = ""; + while (line != null) { + output.append(line); + line = reader.readLine(); + } + } + Log.d("", output.toString()); + return output.toString(); + + } + + public static MapItem extractFeatureFromJson(String newsJSON) { + + if (TextUtils.isEmpty(newsJSON)) { + return null; + } + + String next_page_token = ""; + ArrayList results = new ArrayList<>(); + String status = ""; + + try { + JSONObject baseJsonResponse = new JSONObject(newsJSON); +// next_page_token = baseJsonResponse.getString("next_page_token"); + + JSONArray resultsArray = baseJsonResponse.getJSONArray("results"); + + for (int i = 0; i < resultsArray.length(); i++) { + JSONObject currentResult = resultsArray.getJSONObject(i); + + String formatted_Address = currentResult.getString("formatted_address"); + + JSONObject geometryObject = currentResult.getJSONObject("geometry"); + JSONObject locationObject = geometryObject.getJSONObject("location"); + LatLng location = new LatLng(locationObject.getDouble("lat"),locationObject.getDouble("lng")); + + JSONObject viewPointObject = geometryObject.getJSONObject("viewport"); +// LatLngBounds viewPort= new LatLngBounds( + LatLng northEast = new LatLng(viewPointObject.getJSONObject("northeast").getDouble("lat"), + viewPointObject.getJSONObject("northeast").getDouble("lng")); + LatLng southWest = new LatLng(viewPointObject.getJSONObject("southwest").getDouble("lat"), + viewPointObject.getJSONObject("southwest").getDouble("lng")); + LatLngBounds viewPort = LatLngBounds.builder().include(northEast).include(southWest).build(); + + MapItem.Geometry geometry = new Geometry(location,viewPort); + + URL icon = createUrl(currentResult.getString("icon")); + String placeId = currentResult.getString("id"); + String name = currentResult.getString("name"); + + JSONObject openingHoursObject = null; + OpeningHours openingHours = null; + try { + openingHoursObject = currentResult.getJSONObject("opening_hours"); + }catch (Exception e){ + Log.i(TAG, "extractFeatureFromJson: " + "no opening hours"); + }finally { + if (openingHoursObject != null){ + openingHours = new OpeningHours(openingHoursObject.getBoolean("open_now")); + } + } + + + + JSONArray photosArray = null; + ArrayList photos = null; + try { + photosArray = currentResult.getJSONArray("photos"); + }catch (Exception e){ + Log.i(TAG, "extractFeatureFromJson: " + "no photo"); + }finally { + if (photosArray != null){ + photos = new ArrayList<>(); + for (int p = 0; p < photosArray.length(); p++) { + JSONObject photoObject = photosArray.getJSONObject(p); + + int height = photoObject.getInt("height"); + String htmlAttributions = photoObject.getString("html_attributions"); + String photoReference = photoObject.getString("photo_reference"); + int width = photoObject.getInt("width"); + + photos.add(new Photo(height,htmlAttributions,photoReference,width)); + } + } + } + + + + String place_id = currentResult.getString("place_id"); + JSONObject plusCodeObject = currentResult.getJSONObject("plus_code"); + PlusCode plusCode = new PlusCode(plusCodeObject.getString("compound_code"), + plusCodeObject.getString("global_code")); + + Double rating = currentResult.getDouble("rating"); + String reference = currentResult.getString("reference"); + JSONArray typesObject = currentResult.getJSONArray("types"); + ArrayList types = new ArrayList<>(); + for (int t = 0; t < typesObject.length(); t++) { + types.add(typesObject.get(t).toString()); + } + + + MapItem.result result = new MapItem.result(formatted_Address,geometry,icon,placeId,name,openingHours,photos,place_id,plusCode,rating,reference,types); + results.add(result); + } + + status = baseJsonResponse.getString("status"); + + } catch (JSONException e) { + Log.e("Error", "Problem parsing the book JSON results", e); + } + + return new MapItem(next_page_token, results, status); + } +} diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/PlaceAutocompleteAdapter.java b/app/src/main/java/com/appttude/h_mal/exchangemap/PlaceAutocompleteAdapter.java new file mode 100644 index 0000000..2fa6ba2 --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/PlaceAutocompleteAdapter.java @@ -0,0 +1,242 @@ +package com.appttude.h_mal.exchangemap;/* + * Copyright (C) 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.PendingResult; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.common.data.DataBufferUtils; +import com.google.android.gms.location.places.AutocompleteFilter; +import com.google.android.gms.location.places.AutocompletePrediction; +import com.google.android.gms.location.places.AutocompletePredictionBuffer; +import com.google.android.gms.location.places.Places; +import com.google.android.gms.maps.model.LatLngBounds; + + +import android.content.Context; +import android.graphics.Typeface; +import android.text.style.CharacterStyle; +import android.text.style.StyleSpan; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.concurrent.TimeUnit; + +/** + * Adapter that handles Autocomplete requests from the Places Geo Data API. + * {@link AutocompletePrediction} results from the API are frozen and stored directly in this + * adapter. (See {@link AutocompletePrediction#freeze()}.) + *

+ * Note that this adapter requires a valid {@link com.google.android.gms.common.api.GoogleApiClient}. + * The API client must be maintained in the encapsulating Activity, including all lifecycle and + * connection states. The API client must be connected with the {@link Places#GEO_DATA_API} API. + */ +public class PlaceAutocompleteAdapter + extends ArrayAdapter implements Filterable { + + private static final String TAG = "PlaceAutoCompleteAd"; + private static final CharacterStyle STYLE_BOLD = new StyleSpan(Typeface.BOLD); + /** + * Current results returned by this adapter. + */ + private ArrayList mResultList; + + /** + * Handles autocomplete requests. + */ + private GoogleApiClient mGoogleApiClient; + + /** + * The bounds used for Places Geo Data autocomplete API requests. + */ + private LatLngBounds mBounds; + + /** + * The autocomplete filter used to restrict queries to a specific set of place types. + */ + private AutocompleteFilter mPlaceFilter; + + /** + * Initializes with a resource for text rows and autocomplete query bounds. + * + * @see android.widget.ArrayAdapter#ArrayAdapter(android.content.Context, int) + */ + public PlaceAutocompleteAdapter(Context context, GoogleApiClient googleApiClient, + LatLngBounds bounds, AutocompleteFilter filter) { + super(context, android.R.layout.simple_expandable_list_item_2, android.R.id.text1); + mGoogleApiClient = googleApiClient; + mBounds = bounds; + mPlaceFilter = filter; + } + + /** + * Sets the bounds for all subsequent queries. + */ + public void setBounds(LatLngBounds bounds) { + mBounds = bounds; + } + + /** + * Returns the number of results received in the last autocomplete query. + */ + @Override + public int getCount() { + return mResultList.size(); + } + + /** + * Returns an item from the last autocomplete query. + */ + @Override + public AutocompletePrediction getItem(int position) { + return mResultList.get(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = super.getView(position, convertView, parent); + + // Sets the primary and secondary text for a row. + // Note that getPrimaryText() and getSecondaryText() return a CharSequence that may contain + // styling based on the given CharacterStyle. + + AutocompletePrediction item = getItem(position); + + TextView textView1 = (TextView) row.findViewById(android.R.id.text1); + TextView textView2 = (TextView) row.findViewById(android.R.id.text2); + textView1.setText(item.getPrimaryText(STYLE_BOLD)); + textView2.setText(item.getSecondaryText(STYLE_BOLD)); + + return row; + } + + /** + * Returns the filter for the current set of autocomplete results. + */ + @Override + public Filter getFilter() { + return new Filter() { + @Override + protected FilterResults performFiltering(CharSequence constraint) { + FilterResults results = new FilterResults(); + + // We need a separate list to store the results, since + // this is run asynchronously. + ArrayList filterData = new ArrayList<>(); + + // Skip the autocomplete query if no constraints are given. + if (constraint != null) { + // Query the autocomplete API for the (constraint) search string. + filterData = getAutocomplete(constraint); + } + + results.values = filterData; + if (filterData != null) { + results.count = filterData.size(); + } else { + results.count = 0; + } + + return results; + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + + if (results != null && results.count > 0) { + // The API returned at least one result, update the data. + mResultList = (ArrayList) results.values; + notifyDataSetChanged(); + } else { + // The API did not return any results, invalidate the data set. + notifyDataSetInvalidated(); + } + } + + @Override + public CharSequence convertResultToString(Object resultValue) { + // Override this method to display a readable result in the AutocompleteTextView + // when clicked. + if (resultValue instanceof AutocompletePrediction) { + return ((AutocompletePrediction) resultValue).getFullText(null); + } else { + return super.convertResultToString(resultValue); + } + } + }; + } + + /** + * Submits an autocomplete query to the Places Geo Data Autocomplete API. + * Results are returned as frozen AutocompletePrediction objects, ready to be cached. + * objects to store the Place ID and description that the API returns. + * Returns an empty list if no results were found. + * Returns null if the API client is not available or the query did not complete + * successfully. + * This method MUST be called off the main UI thread, as it will block until data is returned + * from the API, which may include a network request. + * + * @param constraint Autocomplete query string + * @return Results from the autocomplete API or null if the query was not successful. + * @see Places#GEO_DATA_API#getAutocomplete(CharSequence) + * @see AutocompletePrediction#freeze() + */ + private ArrayList getAutocomplete(CharSequence constraint) { + if (mGoogleApiClient.isConnected()) { + Log.i(TAG, "Starting autocomplete query for: " + constraint); + + // Submit the query to the autocomplete API and retrieve a PendingResult that will + // contain the results when the query completes. + PendingResult results = + Places.GeoDataApi + .getAutocompletePredictions(mGoogleApiClient, constraint.toString(), + mBounds, mPlaceFilter); + + // This method should have been called off the main UI thread. Block and wait for at most 60s + // for a result from the API. + AutocompletePredictionBuffer autocompletePredictions = results + .await(60, TimeUnit.SECONDS); + + // Confirm that the query completed successfully, otherwise return null + final Status status = autocompletePredictions.getStatus(); + if (!status.isSuccess()) { + Toast.makeText(getContext(), "Error contacting API: " + status.toString(), + Toast.LENGTH_SHORT).show(); + Log.e(TAG, "Error getting autocomplete prediction API call: " + status.toString()); + autocompletePredictions.release(); + return null; + } + + Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount() + + " predictions."); + + // Freeze the results immutable representation that can be stored safely. + return DataBufferUtils.freezeAndClose(autocompletePredictions); + } + Log.e(TAG, "Google API client is not connected for autocomplete query."); + return null; + } + + +} diff --git a/app/src/main/java/com/appttude/h_mal/exchangemap/getLatLong.java b/app/src/main/java/com/appttude/h_mal/exchangemap/getLatLong.java new file mode 100644 index 0000000..b7aa84f --- /dev/null +++ b/app/src/main/java/com/appttude/h_mal/exchangemap/getLatLong.java @@ -0,0 +1,68 @@ +package com.appttude.h_mal.exchangemap; + +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.location.Location; +import android.location.LocationManager; +import android.support.v4.app.ActivityCompat; +import android.util.Log; +import android.widget.Toast; + +import com.google.android.gms.location.FusedLocationProviderClient; +import com.google.android.gms.location.LocationServices; + +/** + * Created by h_mal on 05/05/2018. + */ + +public class getLatLong { + static Location location; + public static Double longitude; + public static Double latitude; + + private static String TAG = getLatLong.class.getSimpleName(); + + public getLatLong(){ + super(); + } + + public static void configLatLong(Context context) { + + LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context); + if(ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) + !=PackageManager.PERMISSION_GRANTED) { + Toast.makeText(context, "Location permission denied", Toast.LENGTH_SHORT).show(); + } else { + try { + location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); + }catch (Exception e){ + Log.e("latlong error", "configLatLong: ", e); + }finally { + if (location == null){ + Log.i(TAG, "configLatLong: location initially was null"); + try{ + LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + }catch (Exception e){ + Log.e(TAG, "configLatLong: ", e); + }finally { + if (location != null){ + latitude = location.getLatitude(); + longitude = location.getLongitude(); + + Log.i(TAG, "onSuccess: Latitude:" + location.getLatitude() + + "\n longitude: " + location.getLongitude()); + } + } + + }else{ + latitude = location.getLatitude(); + longitude = location.getLongitude(); + } + } + } + } + +} diff --git a/app/src/main/res/anim/enter_from_left.xml b/app/src/main/res/anim/enter_from_left.xml new file mode 100644 index 0000000..b02f7e4 --- /dev/null +++ b/app/src/main/res/anim/enter_from_left.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/enter_from_right.xml b/app/src/main/res/anim/enter_from_right.xml new file mode 100644 index 0000000..dfe4c2a --- /dev/null +++ b/app/src/main/res/anim/enter_from_right.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/exit_to_left.xml b/app/src/main/res/anim/exit_to_left.xml new file mode 100644 index 0000000..e7da89f --- /dev/null +++ b/app/src/main/res/anim/exit_to_left.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/exit_to_right.xml b/app/src/main/res/anim/exit_to_right.xml new file mode 100644 index 0000000..a61c7db --- /dev/null +++ b/app/src/main/res/anim/exit_to_right.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/custom_dialog.xml b/app/src/main/res/layout/custom_dialog.xml new file mode 100644 index 0000000..78ac018 --- /dev/null +++ b/app/src/main/res/layout/custom_dialog.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_maps.xml b/app/src/main/res/layout/fragment_maps.xml new file mode 100644 index 0000000..9133786 --- /dev/null +++ b/app/src/main/res/layout/fragment_maps.xml @@ -0,0 +1,34 @@ + + + + + + + + diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml new file mode 100644 index 0000000..6cdd6e7 --- /dev/null +++ b/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_layout.xml b/app/src/main/res/layout/main_layout.xml new file mode 100644 index 0000000..9c72dad --- /dev/null +++ b/app/src/main/res/layout/main_layout.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_home.png b/app/src/main/res/mipmap-hdpi/ic_home.png new file mode 100644 index 0000000..d0bd9b1 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_home.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..898f3ed Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..dffca36 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_notif.png b/app/src/main/res/mipmap-hdpi/ic_notif.png new file mode 100644 index 0000000..4f3a70a Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_notif.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_world.png b/app/src/main/res/mipmap-hdpi/ic_world.png new file mode 100644 index 0000000..4dbf1ae Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_world.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_home.png b/app/src/main/res/mipmap-mdpi/ic_home.png new file mode 100644 index 0000000..a3aad31 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_home.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..64ba76f Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..dae5e08 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_notif.png b/app/src/main/res/mipmap-mdpi/ic_notif.png new file mode 100644 index 0000000..adcdda9 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_notif.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_world.png b/app/src/main/res/mipmap-mdpi/ic_world.png new file mode 100644 index 0000000..93cbca7 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_world.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_home.png b/app/src/main/res/mipmap-xhdpi/ic_home.png new file mode 100644 index 0000000..b018b30 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_home.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e5ed465 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..14ed0af Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_notif.png b/app/src/main/res/mipmap-xhdpi/ic_notif.png new file mode 100644 index 0000000..aafe9b9 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_notif.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_world.png b/app/src/main/res/mipmap-xhdpi/ic_world.png new file mode 100644 index 0000000..582c020 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_world.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_home.png b/app/src/main/res/mipmap-xxhdpi/ic_home.png new file mode 100644 index 0000000..ab1e681 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_home.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0907ca Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..d8ae031 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_notif.png b/app/src/main/res/mipmap-xxhdpi/ic_notif.png new file mode 100644 index 0000000..d5e043d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_notif.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_world.png b/app/src/main/res/mipmap-xxhdpi/ic_world.png new file mode 100644 index 0000000..f737ebd Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_world.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_home.png b/app/src/main/res/mipmap-xxxhdpi/ic_home.png new file mode 100644 index 0000000..96a39fb Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_home.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2c18de9 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..beed3cd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_notif.png b/app/src/main/res/mipmap-xxxhdpi/ic_notif.png new file mode 100644 index 0000000..c4c7ffc Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_notif.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_world.png b/app/src/main/res/mipmap-xxxhdpi/ic_world.png new file mode 100644 index 0000000..ea3f46f Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_world.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..69b2233 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..9f0dbc1 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 200 + diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..beab31f --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #000000 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..2d45f26 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,1999 @@ + + Exchange Map + Map + + + Hello blank fragment + + + Jalalabad - JAA - Afghanistan + Kabul - Khwaja Rawash Airport - KBL - Afghanistan + Uruzgan - URZ - Afghanistan + Tirana - Rinas - TIA - Albania + Algiers, Houari Boumediene Airport - ALG - Algeria + Annaba - AAE - Algeria + Constantine - CZL - Algeria + Jijel - GJL - Algeria + Oran (Ouahran) - ORN - Algeria + Pago Pago - PPG - American Samoa + Andorra La Vella - Heliport - ALV + Benguela - BUG - Angola + Cabinda - CAB - Angola + Jamba - JMB - Angola + Luanda - 4 de Fevereiro - LAD - Angola + Uige - UGO - Angola + Anguilla - AXA + Antigua, V.C. Bird International - ANU + Buenos Aires - BUE - Argentina + Buenos Aires, Ezeiza International Airport - EZE - Argentina + Buenos Aires, Jorge Newbery - AEP - Argentina + Cordoba - COR - Argentina + Iguazu, Cataratas - IGR - Argentina + Jose De San Martin - JSM - Argentina + Jujuy - El Cadillal Airport - JUJ - Argentina + Junin - JNI - Argentina + Mar del Plata - MDQ - Argentina + Mendoza - MDZ - Argentina + Rosario - ROS - Argentina + Salta, Gen Belgrano - SLA - Argentina + San Carlos de Bariloche - BRC - Argentina + Santa Rosa - RSA - Argentina + Ushuaia - Islas Malvinas Airport - USH - Argentina + Eriwan (Yerevan, Jerevan) - EVN - Armenia + Aruba - Reina Beatrix International, Oranjestad - AUA + Oranjestad - Reina Beatrix International - AUA - Aruba + Adelaide - ADL - Australia + Albany - ALH - Australia + Albury - ABX - Australia + Alice Springs - ASP - Australia + Ayers Rock - Connellan - AYQ - Australia + Ayr - AYR - Australia + Ballina - BNK - Australia + Bamaga - ABM - Australia + Blackwater - BLT - Australia + Bowen - ZBO - Australia + Brampton Island - BMP - Australia + Brisbane - BNE - Australia + Broken Hill - BHQ - Australia + Broome - BME - Australia + Bundaberg - BDB - Australia + Burnie (Wynyard) - BWT - Australia + Cairns - CNS - Australia + Canberra - Canberra Airport - CBR - Australia + Carnarvon - CVQ - Australia + Casino - CSI - Australia + Ceduna - CED - Australia + Cessnock - CES - Australia + Charters Towers - CXT - Australia + Clermont - CMQ - Australia + Coffs Harbour - CFS - Australia + Collinsville - KCE - Australia + Coober Pedy - CPD - Australia + Cooktown - CTN - Australia + Cooma - OOM - Australia + Dalby - DBY - Australia + Darwin - DRW - Australia + Daydream Island - DDI - Australia + Derby - DRB - Australia + Devonport - DPO - Australia + Dubbo - DBO - Australia + Dunk Island - DKI - Australia + Dysart - DYA - Australia + Emerald - EDR - Australia + Emerald - EMD - Australia + Esperance - EPR - Australia + Geelong - GEX - Australia + Geraldton - GET - Australia + Gladstone - GLT - Australia + Gold Coast - OOL - Australia + Goondiwindi - GOO - Australia + Gove (Nhulunbuy) - GOV - Australia + Great Keppel Island - GKL - Australia + Griffith - GFF - Australia + Groote Eylandt - Alyangula - GTE - Australia + Gympie - GYP - Australia + Hamilton - HLT - Australia + Hamilton Island - HTI - Australia + Hayman Island - HIS - Australia + Hervey Bay - HVB - Australia + Hinchinbrook Island - HNK - Australia + Hobart - HBA - Australia + Home Hill - HMH - Australia + Ingham - IGH - Australia + Innisfail - IFL - Australia + Jandakot - JAD - Australia + Julia Creek - JCK - Australia + Jundah - JUN - Australia + Kalgoorlie - KGI - Australia + Karratha - KTA - Australia + Karumba - KRB - Australia + Katherine - KTR - Australia + Kingscote - KGC - Australia + Kowanyama - KWM - Australia + Kununurra - KNX - Australia + Launceston - LST - Australia + Laverton - LVO - Australia + Learmouth (Exmouth) - LEA - Australia + Leinster - LER - Australia + Leonora - LNO - Australia + Lindeman Island - LDC - Australia + Lismore - LSY - Australia + Lizard Island - LZR - Australia + Lockhart River - IRG - Australia + Longreach - LRE - Australia + Mackay - MKY - Australia + Maitland - MTL - Australia + Maryborough - MBH - Australia + Meekatharra - MKR - Australia + Melbourne - Tullamarine - MEL - Australia + Merimbula - MIM - Australia + Middlemount - MMM - Australia + Mildura - MQL - Australia + Moranbah - MOV - Australia + Moree - MRZ - Australia + Moruya - MYA - Australia + Mount Gambier - MGB - Australia + Mount Magnet - MMG - Australia + Mt. Isa - ISA - Australia + Narrabri - NAA - Australia + Narrandera - NRA - Australia + Newcastle - Belmont - BEO - Australia + Newcastle - Williamtown - NTL - Australia + Newman - ZNE - Australia + Noosa - NSA - Australia + Norfolk Island - NLK - Australia + Olympic Dam - OLP - Australia + Orange - OAG - Australia + Orpheus Island - ORS - Australia + Paraburdoo - PBO - Australia + Perth International - PER - Australia + Port Augusta - PUG - Australia + Port Hedland - PHE - Australia + Portland - PTJ - Australia + Port Lincoln - PLO - Australia + Port Macquarie - PQQ - Australia + Prosperpine - PPP - Australia + Queenstown - UEE - Australia + Rockhampton - ROK - Australia + Scone - NSO - Australia + Shute Harbour - JHQ - Australia + Singleton - SIX - Australia + South Molle Island - SOI - Australia + Streaky Bay - KBY - Australia + Sunshine Coast - MCY - Australia + Sydney - SYD - Australia + Tamworth - TMW - Australia + Taree - TRO - Australia + Temora - TEM - Australia + Tennant Creek - TCA - Australia + Thursday Island - TIS - Australia + Tom Price - TPR - Australia + Toowoomba - TWB - Australia + Townsville - TSV - Australia + Wagga - WGA - Australia + Warrnambool - WMB - Australia + Weipa - WEI - Australia + Whitsunday Resort - HAP - Australia + Whyalla - WYA - Australia + Wickham - WHM - Australia + Wiluna - WUN - Australia + Wollongong - WOL - Australia + Woomera - UMR - Australia + Wyndham - WYN - Australia + Graz - GRZ - Austria + Innsbruck - Kranebitten - INN - Austria + Klagenfurt - KLU - Austria + Linz - Hoersching - LNZ - Austria + Salzburg - W.A. Mozart - SZG - Austria + Wien (Vienna) - Vienna International - VIE - Austria + Baku - Heydar Aliyev International Airport - BAK - Azerbaijan + Nakhichevan - NAJ - Azerbaijan + Chub Cay - CCZ - Bahamas + Freeport - Grand Bahama International Airport - FPO - Bahamas + Govenors Harbour - GHB - Bahamas + Grand Bahama International - FPO - Bahamas + Marsh Harbour - MHH - Bahamas + Nassau - NAS - Bahamas + North Eleuthera - ELH - Bahamas + Rock Sound - RSD - Bahamas + San Salvador - ZSA - Bahamas + Treasure Cay - TCB - Bahamas + Bahrain - Bahrain International Airport - BAH + Barisal - BZL - Bangladesh + Chittagong - CGP - Bangladesh + Dhaka - Zia International Airport - DAC - Bangladesh + Jessore - Jessore Airport - JSR - Bangladesh + Sylhet - ZYL - Bangladesh + Bridgetown - Grantley Adams International - BGI - Barbados + Minsk, International - MSQ - Belarus + Antwerp - ANR - Belgium + Brussels - Brussels Airport - BRU - Belgium + Ghent (Gent) - GNE - Belgium + Liege - LGG - Belgium + Belize City - Philip S.W.Goldson International - BZE + Cotonou - Cotonou Cadjehoun Airport - COO - Benin + Bermuda - L.F. Wade International Airport - BDA + Paro - PBH - Bhutan + Cochabamba - CBB - Bolivia + La Paz - El Alto - LPB - Bolivia + Santa Cruz de la Sierra - SRZ - Bolivia + Santa Rosa - SRB - Bolivia + Mostar - OMO - Bosnia and Herzegovina + Sarajevo - SJJ - Bosnia and Herzegovina + Francistown - FRW - Botswana + Gaborone - Sir Seretse Khama International Airport - GBE - Botswana + Jwaneng - JWA - Botswana + Maun - MUB - Botswana + Selibi Phikwe - PKW - Botswana + Aracaju - AJU - Brazil + Belem - Val de Cans International Airport - BEL - Brazil + Belo Horizonte - Tancredo Neves International Airport - CNF - Brazil + Boa Vista - BVB - Brazil + Brasilia - President Juscelino Kubitschek International - BSB - Brazil + Campo Grande - CGR - Brazil + Cuiaba - Marechal Rondon International Airport - CGB - Brazil + Curitiba - Afonso Pena International Airport - CWB - Brazil + Florianopolis - FLN - Brazil + Fortaleza - Pinto Martins Airport - FOR - Brazil + Goiania, Santa Genoveva Airport - GYN - Brazil + Sao Paulo - Guarulhos International - GRU - Brazil + Jacobina    - JCM - Brazil + Jales - JLS - Brazil + Januaria - JNA - Brazil + Jatai - JTI - Brazil + Joacaba - JCB - Brazil + Joao Pessoa - Castro Pinto Airport - JPA - Brazil + Joinville - Cubatao Airport - JOI - Brazil + Juiz De Fora - Francisco De Assis Airport - JDF - Brazil + Macapa - Alberto Alcolumbre International Airport - MCP - Brazil + Maceio - Zumbi dos Palmares International Airport - MCZ - Brazil + Manaus - Eduardo Gomes International Airport - MAO - Brazil + Montenegro - QGF - Brazil + Natal - Augusto Severo International Airport - NAT - Brazil + Palmas - PMW - Brazil + Porto Alegre - Salgado Filho International Airport - POA - Brazil + Porto Velho - PVH - Brazil + Recife - Guararapes-Gilberto Freyre International - REC - Brazil + Rio Branco - Plácido de Castro International Airport - RBR - Brazil + Rio de Janeiro - Galeao - GIG - Brazil + Rio de Janeiro - Santos Dumont - SDU - Brazil + Rio de Janeiro - RIO - Brazil + Salvador - Salvador International Airport - SSA - Brazil + Santa Rosa - SRA - Brazil + Sao Luis - Marechal Cunha Machado International - SLZ - Brazil + Sao Paulo - SAO - Brazil + Sao Paulo - Congonhas - CGH - Brazil + Sao Paulo - Guarulhos - GRU - Brazil + Sao Paulo - Viracopos - VCP - Brazil + Teresina - THE - Brazil + Uberaba - UBA - Brazil + Uberlandia - Eduardo Gomes Airport - UDI - Brazil + Urubupunga - Ernesto Pochler Airport - URB - Brazil + Uruguaiana - Ruben Berta Airport - URG - Brazil + Vitoria - Eurico de Aguiar Salles Airport - VIX - Brazil + Tortola - TOV - British Virgin Islands + Bandar Seri Begawan - Brunei International Airport - BWN + Bourgas/Burgas - BOJ - Bulgaria + Gorna - GOZ - Bulgaria + Jambol - JAM - Bulgaria + Ruse - ROU - Bulgaria + Silistra - SLS - Bulgaria + Sofia - Vrazhdebna - SOF - Bulgaria + Targovishte - TGV - Bulgaria + Varna - VAR - Bulgaria + Vidin - VID - Bulgaria + Bobo/Dioulasso - BOY - Burkina Faso + Ouagadougou - OUA - Burkina Faso + Bujumbura - Bujumbura International Airport - BJM - Burundi + Phnom Penh - Pochentong - PNH - Cambodia + Douala - DLA - Cameroon + Garoua - GOU - Cameroon + Maroua - MVR - Cameroon + N\'Gaoundere - NGE - Cameroon + Yaounde - YAO - Cameroon + Attawapiskat, NT - YAT - Canada + Bonaventure, PQ - YVB - Canada + Calgary - Calgary International Airport - YYC - Canada + Cambridge Bay - YCB - Canada + Churchill - YYQ - Canada + Deer Lake/Corner Brook - YDF - Canada + Edmonton - YEA - Canada + Edmonton, International - YEG - Canada + Edmonton, Municipal - YXD - Canada + Flin Flon - YFO - Canada + Fort Albert - YFA - Canada + Fort McMurray - YMM - Canada + Fort Smith - YSM - Canada + Fort St. John - YXJ - Canada + Fredericton - YFC - Canada + Gander - YQX - Canada + Gillam - YGX - Canada + Goose Bay - YYR - Canada + Halifax International - YHZ - Canada + Hall Beach - YUX - Canada + Hamilton - YHM - Canada + Harrington Harbour, PQ - YHR - Canada + Inuvik - YEV - Canada + Iqaluit (Frobisher Bay) - YFB - Canada + Kamloops, BC - YKA - Canada + Kaschechawan, PQ - ZKE - Canada + Kelowna, BC - YLW - Canada + Kuujjuaq (FortChimo) - YVP - Canada + Kuujjuarapik - YGW - Canada + Lac Brochet, MB - XLB - Canada + La Grande - YGL - Canada + Leaf Rapids - YLR - Canada + London - YXU - Canada + Moncton - YQM - Canada + Montreal - YMQ - Canada + Montreal - Dorval (Montréal-Trudeau) - YUL - Canada + Montreal - Mirabel - YMX - Canada + Nanisivik - YSR - Canada + Norman Wells - YVQ - Canada + Ottawa - Hull - YOW - Canada + Port Menier, PQ - YPN - Canada + Prince George - YXS - Canada + Prince Rupert/Digby Island - YPR - Canada + Pukatawagan - XPK - Canada + Quebec - Quebec International - YQB - Canada + Rainbow Lake, AB - YOP - Canada + Regina - YQR - Canada + Resolute Bay - YRB - Canada + Saint John - YSJ - Canada + Sandspit - YZP - Canada + Saskatoon - YXE - Canada + Shamattawa, MB - ZTM - Canada + Smithers - YYD - Canada + South Indian Lake, MB - XSI - Canada + St. Augustin, PQ - YIF - Canada + St. John\'s - YYT - Canada + St. Pierre, NF - FSP - Canada + Terrace - YXT - Canada + The Pas - YQD - Canada + Thompson - YTH - Canada + Thunder Bay - YQT - Canada + Toronto - Billy Bishop Toronto City Airport - YTZ - Canada + Toronto - Toronto Pearson International Airport - YYZ - Canada + Toronto - YTO - Canada + Umiujaq - YUD - Canada + Uranium City - YBE - Canada + Val d\'Or - YVO - Canada + Vancouver - Vancouver International - YVR - Canada + Victoria - YYJ - Canada + Wabush - YWK - Canada + Whale Cove, NT - YXN - Canada + Whitehorse - YXY - Canada + Windsor Ontario - YQG - Canada + Winnipeg International - YWG - Canada + Yellowknife - YZF - Canada + Praia - RAI - Cape Verde + Sal - SID - Cape Verde + Grand Cayman - Owen Roberts International - GCM - Cayman Islands + Bambari - BBY - Central African Republic + Bangassou - BGU - Central African Republic + Bangui - M\'Poko International Airport - BGF - Central African Republic + Berberati - BBT - Central African Republic + Biraro - IRO - Central African Republic + Bria - BIV - Central African Republic + Carnot - CRF - Central African Republic + Ouadda - ODA - Central African Republic + Abeche - AEH - Chad + Moundou - MQQ - Chad + N\'Djamena - NDJ - Chad + Alderney - ACI - United Kingdom + Guernsey - GCI - United Kingdom + Jersey - JER - United Kingdom + Calama - El Loa - CJC - Chile + Easter Island - IPC - Chile + Punta Arenas - Presidente Carlos Ibáñez del Campo - PUQ - Chile + Santiago de Chile - Arturo Merino Benitez - SCL + Valparaiso - VAP - Chile + Beijing - PEK - China + Beijing - Nanyuan Airport - NAY - China + Xiamen - XMN - China + Guangzhou (Canton) - Baiyun International Airport - CAN - China + Shenzhen - Baoan - SZX - China + Guilin - Liangjiang - KWL - China + Nanning - NNG - China + Harbin (Haerbin) - HRB - China + Wuhan - WUH - China + Yichang - YIH - China + Ji\'an - JGS - China + Changchun - CGQ - China + Dalian - Zhoushuizi International Airport - DLC - China + Shenyang - SHE - China + Macau - MFM - China + Altay - AAT - China + Chaoyang, Beijing - Chaoyang Airport - CHG - China + Jiamusi - Jiamusi Airport - JMU - China + Jiayuguan - Jiayuguan Airport - JGN - China + Jilin - JIL - China + Jingdezhen - JDZ - China + Jinghong - Gasa Airport - JHG - China + Jining - JNG - China + Jinjiang - JJN - China + Jinzhou - Jinzhou Airport - JNZ - China + Jiujiang - Jiujiang Lushan Airport - JIU - China + Ulanhot - HLH - China + Xi\'an - Xianyang - XIY - China + Jinan - TNA - China + Qingdao - TAO - China + Taiyuan - TYN - China + Chengdu - Shuangliu - CTU - China + Chongqing - Jiangbei International Airport - CKG - China + Shanghai - Hongqiao - SHA - China + Shanghai - Pu Dong - PVG - China + Tianjin - TSN - China + Urumqi - URC - China + Luxi - Mangshi - LUM - China + Hangchow (Hangzhou) - HGH - China + Barranquilla - BAQ - Colombia + Bogota - El Nuevo Dorado International Airport - BOG - Colombia + Bucaramanga - BGA - Colombia + Cali - CLO - Colombia + Cartagena - Rafael Núñez International Airport - CTG - Colombia + Medellin - MDE - Colombia + Pereira - PEI - Colombia + San Andres - ADZ - Colombia + Santa Rosalia - SSL - Colombia + Anjouan - Anjouan Airport - AJN - Comoros (Comores) + Moroni - Prince Said Ibrahim - HAH - Comoros (Comores) + Moroni - Iconi - YVA - Comoros (Comores) + Kinshasa - N\'Djili - FIH - Congo (DRC) + Kisangani - FKI - Congo (DRC) + Lisala - LIQ - Congo (DRC) + Lumbumbashi - FBM - Congo (DRC) + Brazzaville - Maya-Maya Airport - BZV - Congo (ROC) + Pointe Noire - PNR - Congo (ROC) + Rarotonga - RAR - Cook Islands + San Jose - SJO - Costa Rica + Upala - UPL - Costa Rica + Abidjan - ABJ - Cote d\'Ivoire + Bouake - BYK - Cote d\'Ivoire + Daloa - DJO - Cote d\'Ivoire + Korhogo - HGO - Cote d\'Ivoire + Man - MJC - Cote d\'Ivoire + San Pedro - SPY - Cote d\'Ivoire + Sassandra - ZSS - Cote d\'Ivoire + Yamoussoukro - ASK - Cote d\'Ivoire + Dubrovnik - DBV - Croatia (Hrvatska) + Losinj - Losinj Arpt - LSZ - Croatia (Hrvatska) + Osijek - OSI - Croatia (Hrvatska) + Pula - PUY - Croatia (Hrvatska) + Rijeka - RJK - Croatia (Hrvatska) + Split - SPU - Croatia (Hrvatska) + Zadar - ZAD - Croatia (Hrvatska) + Zagreb - Pleso - ZAG - Croatia (Hrvatska) + Cienfuegos - Jaime González Airport - CFG - Cuba + Havana - José Martí International - HAV - Cuba + Holguin - HOG - Cuba + Santiago - Antonio Maceo Airport - SCU - Cuba + Varadero - VRA - Cuba + Akrotiri - RAF - AKT - Cyprus + Larnaca - LCA - Cyprus + Limassol - QLI - Cyprus + Nicosia - NIC - Cyprus + Paphos - PFO - Cyprus + Prague - Ruzyne - PRG - Czech Republic + Uherske Hradiste - UHE - Czech Republic + Aarhus - AAR - Denmark + Alborg - AAL - Denmark + Billund - BLL - Denmark + Copenhagen - Copenhagen Airport - CPH - Denmark + Esbjerg - EBJ - Denmark + Faroer - Vágar Airport - FAE - Denmark + Karup - KRP - Denmark + Odense - ODE - Denmark + Roenne - RNN - Denmark + Skrydstrup - SKS - Denmark + Soenderborg - SGD - Denmark + Thisted - TED - Denmark + Djibouti (city) - Djibouti-Ambouli International Airport - JIB + Melville Hall - DOM - Dominica + La Romana - La Romana International Airport - LRM - Dominican Republic + Samana - Samaná El Catey International Airport - AZS - Dominican Republic + Puerto Plata - POP - Dominican Republic + Punta Cana - Punta Cana International - PUJ - Dominican Republic + Santo Domingo - SDQ - Dominican Republic + Guayaquil - Simon Bolivar - GYE - Ecuador + Jipijapa - JIP - Ecuador + Quito - Mariscal Sucre International Airport - UIO - Ecuador + Salinas - SNC - Ecuador + Abu Rudeis - AUE - Egypt + Abu Simbel - ABS - Egypt + Al Arish - AAC - Egypt + Alexandria - Borg el Arab Airport - HBH - Egypt + Alexandria - El Nhouza Airport - ALY - Egypt + Assiut - ATZ - Egypt + Aswan - Daraw Airport - ASW - Egypt + Cairo - Cairo International Airport - CAI - Egypt + El Minya - EMY - Egypt + Hurghada International - HRG - Egypt + Kharga - New Valley - UVL - Egypt + Luxor - LXR - Egypt + Marsa Alam - RMF - Egypt + Marsa Matrah (Marsa Matruh) - MUH - Egypt + New Valley - Kharga - UVL - Egypt + Port Said - PSD - Egypt + Santa Katarina - Mount Sinai - SKV - Egypt + Sharm El Sheikh - SSH - Egypt + Siwa - SEW - Egypt + San Salvador - SAL - El Salvador + Malabo - SSG - Equatorial Guinea + Asmara - Asmara International - ASM - Eritrea + Tallinn - Pirita Harbour - QUF - Estonia + Tallinn - Ulemiste - TLL - Estonia + Addis Ababa - Bole International Airport - ADD - Ethiopia + Jijiga - JIJ - Ethiopia + Jimma - JIM - Ethiopia + Jinka - Baco/Jinka Airport - BCO - Ethiopia + Castaway - CST - Fiji + Nadi - NAN - Fiji + Suva/Nausori - SUV - Fiji + Nausori - SUV - Fiji + Enontekioe - ENF - Finland + Helsinki - Vantaa - HEL - Finland + Ivalo - IVL - Finland + Joensuu - JOE - Finland + Jyväskylä (Jyvaskyla) - JYV - Finland + Kajaani - KAJ - Finland + Kauhajoki - KHJ - Finland + Kemi/Tornio - KEM - Finland + Kittilä - KTT - Finland + Kokkola/Pietarsaari - KOK - Finland + Kuopio - KUO - Finland + Kuusamo - KAO - Finland + Lappeenranta - LPP - Finland + Mariehamn (Maarianhamina) - MHQ - Finland + Mikkeli - MIK - Finland + Oulu - OUL - Finland + Pori - POR - Finland + Rovaniemi - RVN - Finland + Savonlinna - SVL - Finland + Seinaejoki - SJY - Finland + Sodankylae - SOT - Finland + Tampere - TMP - Finland + Turku - TKU - Finland + Vaasa - VAA - Finland + Varkaus - VRK - Finland + Ajaccio - AJA - France + Albi - LBI - France + Annecy - NCY - France + Aurillac - AUR - France + Bastia - BIA - France + Bergerac - Roumanieres - EGC - France + Biarritz - BIQ - France + Bordeaux - Bordeaux Airport - BOD - France + Brest - BES - France + Calvi - CLY - France + Cannes – Mandelieu Airport - CEQ - France + Chambery - CMF - France + Clermont Ferrand - CFE - France + Dinard - DNR - France + Disneyland Paris - DLP - France + Figari - FSC - France + Frejus - FRJ - France + Grenoble - GNB - France + La Rochelle - LRH - France + Lannion - LAI - France + Lille - Lille Airport - LIL - France + Limoges - LIG - France + Lorient - LRT - France + Lourdes/Tarbes - LDE - France + Lyon - Lyon-Saint Exupéry Airport official website - LYS - France + Marseille - Marseille Provence Airport - MRS - France + Metz -  Frescaty - MZM - France + Metz/Nancy Metz-Nancy-Lorraine - ETZ - France + Montpellier - Montpellier–Méditerranée Airport - MPL - France + Mulhouse - MLH - France + Nancy - ENC - France + Nantes - Nantes Atlantique Airport - NTE - France + Nice - Cote D\'Azur Airport - NCE - France + Nimes - FNI - France + Paris - PAR - France + Paris - Charles de Gaulle - CDG - France + Paris - Le Bourget - LBG - France + Paris - Orly - ORY - France + Pau - PUF - France + Perpignan - PGF - France + Poitiers - Biard - PIS - France + Quimper - UIP - France + Rennes - RNS - France + Roanne - RNE - France + Rodez - RDZ - France + Saint Brieuc - SBK - France + St. Etienne - EBU - France + Strasbourg - Strasbourg Airport - SXB - France + Toulouse - Blagnac Airport - TLS - France + Cayenne - Cayenne-Rochambeau Airport - CAY - French Guiana + Bora Bora - BOB - French Polynesia + Huahine - HUH - French Polynesia + Manihi - XMH - French Polynesia + Maupiti - MAU - French Polynesia + Moorea - MOZ - French Polynesia + Raiatea - RFP - French Polynesia + Rangiroa - RGI - French Polynesia + Ua Huka - UAH - French Polynesia + Ua Pou - UAP - French Polynesia + Papeete - Faaa - PPT - French Polynesia + Lambarene - LBQ - Gabon + Libreville - LBV - Gabon + Moanda - MFF - Gabon + Mouila - MJL - Gabon + Mvengue - MVB - Gabon + Port Gentil - POG - Gabon + Oyem - UVE - Gabon + Banjul - Banjul International Airport (Yundum International) - BJL - Gambia + Tbilisi - Novo Alexeyevka - TBS - Georgia + Augsburg - Augsbur gAirport - AGB - Germany + Bayreuth - Bindlacher-Berg - BYU - Germany + Berlin - BER - Germany + Berlin, Schoenefeld - SXF - Germany + Berlin, Tegel - TXL - Germany + Berlin, Tempelhof (ceased operating in 2008) - THF - Germany + Bremen - Bremen Airport (Flughafen Bremen) - BRE - Germany + Cottbus - Cottbus-Drewitz Airport - CBU - Germany + Cologne - Cologne Airport (Flughafen Köln/Bonn) - CGN - Germany + Dortmund - DTM - Germany + Dresden - Dresden Airport - DRS - Germany + Duesseldorf - Düsseldorf International Airport - DUS - Germany + Erfurt - Erfurt Airport (Flughafen Erfurt) - ERF - Germany + Frankfurt/Main - Frankfurt Airport (Rhein-Main-Flughafen) - FRA - Germany + Frankfurt/Hahn - HHN - Germany + Friedrichshafen - Bodensee-Airport Friedrichshafen - FDH - Germany + Guettin - GTI - Germany + Hamburg - Fuhlsbuettel - HAM - Germany + Hannover - HAJ - Germany + Hof - HOQ - Germany + Juist (island) - JUI - Germany + Karlsruhe-Baden - Soellingen - FKB - Germany + Kiel - Holtenau - KEL - Germany + Köln, Köln/Bonn - CGN - Germany + Leipzig - LEJ - Germany + Muenchen (Munich) - Franz Josef Strauss - MUC - Germany + Muenster/Osnabrueck - FMO - Germany + Nürnberg (Nuremberg) - NUE - Germany + Paderborn/Lippstadt - PAD - Germany + Saarbruecken - SCN - Germany + Stuttgart - Echterdingen - STR - Germany + Westerland, Sylt Airport - GWT - Germany + Wiesbaden, Air Base - WIE - Germany + Accra - Kotoka International Airport - ACC - Ghana + Gibraltar - GIB + Araxos - GPA - Greece + Athens - Elefthérios Venizélos International Airport - ATH - Greece + Athens, Hellinikon Airport - HEW - Greece + Chania - CHQ - Greece + Chios - JKH - Greece + Corfu - CFU - Greece + Heraklion - HER - Greece + Kalamata - KLX - Greece + Karpathos - AOK - Greece + Kavalla - KVA - Greece + Kos - KGS - Greece + Mykonos - JMK - Greece + Mytilene (Lesbos) - MJT - Greece + Naxos - Naxos Airport - JNX - Greece + Preveza/Lefkas - PVK - Greece + Rhodos - RHO - Greece + Saloniki - SKG - Greece + Samos - SMI - Greece + Skiathos - JSI - Greece + Thessaloniki - Makedonia Apt. - SKG - Greece + Thira - JTR - Greece + Zakynthos - ZTH - Greece + Narsarsuaq - UAK - Greenland + Soendre Stroemfjord - SFJ - Greenland + Upernavik - Upernavik Heliport - JUV - Greenland + Uummannaq - UMD - Greenland + Grenada - Point Salines Airport also Maurice Bishop - GND + Basse-Terre - Pointe-à-Pitre International Airport - PTP - Guadeloupe + Pointe a Pitre - PTP - Guadeloupe + Agana (Hagåtña) - SUM - Guam + Guam - GUM + Hagåtña - Guam International Airport - GUM + Guatemala City - La Aurora International Airport - GUA + Conakry - Conakry International Airport - CKY - Guinea + Labe - LEK - Guinea + Bissau - Osvaldo Vieiro International Airport - BXO - Guinea-Bissau + Georgetown - Cheddi Jagan International Airport - GEO - Guyana + Jacmel    - JAK - Haiti + Jeremie - Jeremie Airport - JEE - Haiti + Port au Prince - PAP - Haiti + Sapporo - SPK - Japan + Sapporo - Okadama - OKD - Japan + Juticalpa - JUT - Honduras + Roatan - RTB - Honduras + San Pedro Sula - SAP - Honduras + Santa Rosa, Copan - SDH - Honduras + Tegucigalpa - TGU - Honduras + Utila - UII - Honduras + Hong Kong - International Airport (HKIA) - HKG + Hong Kong - Chek Lap Kok - ZJK + Budapest - Budapest Ferihegy International Airport - BUD - Hungary + Ibiza - IBZ - Spain + Egilsstadir - EGS - Iceland + Reykjavik - Metropolitan Area - REK - Iceland + Reykjavik - Keflavik International - KEF - Iceland + Ahmedabad - AMD - India + Amritsar - ATQ - India + Anand - QNB - India + Bagdogra - IXB - India + Bangalore - BLR - India + Baroda - BDQ - India + Belgaum - IXG - India + Bhopal - BHO - India + Bhubaneswar - BBI - India + Bombay (Mumbai) - Chhatrapati Shivaji International - BOM - India + Calcutta (Kolkata) - Netaji Subhas Chandra - CCU - India + Calicut - CCJ - India + Chandigarh - Chandigarh International Airport - IXC - India + Chennai (Madras) - MAA - India + Cochin - COK - India + Coimbatore - CJB - India + Delhi - Indira Gandhi International Airport - DEL - India + Goa - GOI - India + Guwahati - GAU - India + Hyderabad - Rajiv Gandhi International Airport - HYD - India + Jagdalpur - JGB - India + Jaipur - Sanganeer - JAI - India + Jaisalmer    - JSA - India + Jalandhar - JLR - India + Jammu - Satwari - IXJ - India + Jamnagar - Govardhanpur - JGA - India + Jamshedpur - Sonari Airport - IXW - India + Jeypore - Jeypore Airport - PYB - India + Jodhpur - JDH - India + Jorhat - Rowriah Airport - JRH - India + Kanpur - KNU - India + Kolkata (Calcutta) - Netaji Subhas Chandra - CCU - India + Lucknow - LKO - India + Madras (Chennai) - MAA - India + Mysore - MYQ - India + Nagpur - NAG - India + Patna - PAT - India + Rajkot - RAJ - India + Ranchi - IXR - India + Srinagar - SXR - India + Surat - STV - India + Thiruvananthapuram - TRV - India + Tiruchirapally - TRZ - India + Udaipur - Dabok Airport - UDR - India + Varanasi - VNS - India + Pune - PNQ - India + Ayawasi - AYW - Indonesia + Bandung - Husein Sastranegara International Airport - BDO - Indonesia + Denpasar/Bali - DPS - Indonesia + Jakarta - Halim Perdana Kusuma - HLP - Indonesia + Jakarta - Metropolitan Area - JKT - Indonesia + Jakarta - Soekarno-Hatta International - CGK - Indonesia + Jayapura - Sentani - DJJ - Indonesia + Medan - Polania Int\'l (now Soewondo AFB) - MES - Indonesia + Medan - Kualanamu International - KNO - Indonesia + Manado - MDC - Indonesia + Surabaya - Juanda - SUB - Indonesia + Tioman - TOD - Indonesia + Ujung Pandang - Hasanudin Airport - UPG - Indonesia + Jambi - Sultan Taha Syarifudn - DJB - Indonesia + Abadan - ABD - Iran + Tehran (Teheran) - Mehrabad - THR - Iran + Urmiehm (Orumieh) - OMH - Iran + Bagdad - Baghdad International Airport - BGW - Iraq + Basra, Basrah - BSR - Iraq + Kirkuk - KIK - Iraq + Mosul - OSM - Iraq + Cork - ORK - Ireland + Donegal (Carrickfin) - CFN - Ireland + Dublin - Dublin International Airport - DUB - Ireland + Galway - GWY - Ireland + Kerry County - KIR - Ireland + Knock - NOC - Ireland + Shannon (Limerick) - SNN - Ireland + Sligo - SXL - Ireland + Elat - ETH - Israel + Elat, Ovula - VDA - Israel + Haifa - HFA - Israel + Jerusalem - Atarot Airport (closed) - JRS - Israel + Tel Aviv - Ben Gurion International - TLV - Israel + Alghero Sassari - AHO - Italy + Ancona - Ancona Falconara Airport - AOI - Italy + Bari - BRI - Italy + Bergamo/Milan - Orio Al Serio - BGY - Italy + Bologna - BLQ - Italy + Brescia, Montichiari - VBS - Italy + Brindisi - BDS - Italy + Cagliari - CAG - Italy + Catania - CTA - Italy + Elba Island, Marina Di Campo - EBA - Italy + Florence (Firenze) - Peretola Airport - FLR - Italy + Genoa - GOA - Italy + Lamezia Terme - SUF - Italy + Lampedusa - LMP - Italy + Milan - MIL - Italy + Milan - Linate - LIN - Italy + Milan - Malpensa - MXP - Italy + Milan - Orio Al Serio - BGY - Italy + Naples - Naples Capodichino Airport - NAP - Italy + Olbia - OLB - Italy + Palermo - Punta Raisi - PMO - Italy + Pantelleria - PNL - Italy + Perugia - PEG - Italy + Pescara - PSR - Italy + Pisa - Galileo Galilei - PSA - Italy + Reggio Calabria - REG - Italy + Rimini - RMI - Italy + Rome - ROM - Italy + Rome - Ciampino - CIA - Italy + Rome - Fuimicino - FCO - Italy + Trapani - TPS - Italy + Treviso - TSF - Italy + Trieste - TRS - Italy + Turin - TRN - Italy + Venice - Marco Polo - VCE - Italy + Verona (Brescia) Montichiari - VBS - Italy + Verona - VRN - Italy + Kingston - Norman Manley - KIN - Jamaica + Montego Bay - Sangster International - MBJ - Jamaica + Akita - AXT - Japan + Amami - ASJ - Japan + Aomori - AOJ - Japan + Chiba City - QCB - Japan + Sapporo - New Chitose Airport - CTS - Japan + Fukuoka - FUK - Japan + Fukushima - Fukushima Airport - FKS - Japan + Hachijo Jima - HAC - Japan + Hakodate - HKD - Japan + Hiroshima International - HIJ - Japan + Ishigaki - New Ishigaki Airport - ISG - Japan + Kagoshima - KOJ - Japan + Kobe - UKB - Japan + Kochi - KCZ - Japan + Komatsu - KMQ - Japan + Kumamoto - KMJ - Japan + Kushiro - KUH - Japan + Kyoto - UKY - Japan + Matsumoto, Nagano - MMJ - Japan + Matsuyama - MYJ - Japan + Miyako Jima (Ryuku Islands) - Hirara - MMY - Japan + Miyazaki - KMI - Japan + Morioka, Hanamaki - HNA - Japan + Nagasaki - NGS - Japan + Nagoya - Komaki AFB - NGO - Japan + Niigata - KIJ - Japan + Oita - OIT - Japan + Okayama - OKJ - Japan + Okinawa, Ryukyo Island - Naha - OKA - Japan + Osaka, Metropolitan Area - OSA - Japan + Osaka - Itami - ITM - Japan + Osaka - Kansai International Airport - KIX - Japan + Sado Shima - SDS - Japan + Sapporo - New Chitose Airport - CTS - Japan + Sendai - SDJ - Japan + Takamatsu - TAK - Japan + Tokushima - TKS - Japan + Tokyo - TYO - Japan + Tokyo - Haneda - HND - Japan + Tokyo - Narita - NRT - Japan + Toyama - TOY - Japan + Ube - UBJ - Japan + Yamagata, Junmachi - GAJ - Japan + Yokohama - YOK - Japan + Amman - Queen Alia International Airport - AMM - Jordan + Amman - Amman-Marka International Airport - ADJ - Jordan + Aqaba - AQJ - Jordan + Almaty (Alma Ata) - Almaty International Airport - ALA - Kazakhstan + Astana - Astana International Airport - TSE - Kazakhstan + Malindi - MYD - Kenya + Mombasa - Moi International - MBA - Kenya + Nairobi - NBO - Kenya + King Island - KNS - Australia + Kiritimati (island) - Cassidy International Airport - CXI - Kiribati + Incheon, Incheon International Airport - ICN - South Korea + Kuwait - Kuwait International - KWI + Bishkek - Manas International Airport - FRU - Kyrgyzstan + Vientiane - Wattay - VTE - Laos + Riga - RIX - Latvia + Beirut - Beirut Rafic Hariri International Airport - BEY - Lebanon + Maseru - Moshoeshoe International - MSU - Lesotho + Monrovia - Metropolitan Area - MLW - Liberia + Monrovia - Roberts International - ROB - Liberia + Benghazi (Bengasi) - BEN - Libya + Sehba - SEB - Libya + Tripoli - Tripoli International - TIP - Libya + Vilnius - VNO - Lithuania + Wilna (Vilnius) - VNO - Lithuania + Lifou - LIF - New Caledonia + Luxembourg - LUX + Ohrid - OHD - Macedonia + Skopje - SKP - Macedonia + Antananarivo (Tanannarive) - Ivato International Airport - TNR - Madagascar + Majunga - MJN - Madagascar + Blantyre (Mandala) - Chileka International Airport - BLZ - Malawi + Lilongwe - Lilongwe International - LLW - Malawi + Bintulu - BTU - Malaysia + Johor Bahru - Sultan Ismail International - JHB - Malaysia + Kota Kinabalu - BKI - Malaysia + Kuala Lumpur - International Airport - KUL - Malaysia + Kuala Lumpur - Sultan Abdul Aziz Shah - SZB - Malaysia + Kuantan - KUA - Malaysia + Kuching - KCH - Malaysia + Labuan - LBU - Malaysia + Langkawi (islands) - LGK - Malaysia + Miri - MYY - Malaysia + Penang International - PEN - Malaysia + Sibu - SBW - Malaysia + Tawau - TWU - Malaysia + Male - International - MLE - Maledives + Bamako - Bamako-Sénou International Airport - BKO - Mali + Luga - MLA - Malta + Jaluit Island   - UIT - Marshall Islands + Fort de France - Martinique Aimé Césaire International - FDF + Nouadhibou - NDB - Mauritania + Nouakchott - NKC - Mauritania + Zouerate - OUZ - Mauritania + Mauritius - S.Seewoosagur Ram International - MRU + Rodrigues Island - RRG - Mauritius + Dzaoudzi - DZA - Mayotte + Acapulco - ACA - Mexico + Aguascaliente - AGU - Mexico + Cancun - CUN - Mexico + Chichen Itza - CZA - Mexico + Chihuahua, Gen Fierro Villalobos - CUU - Mexico + Ciudad Del Carmen - CME - Mexico + Ciudad Juarez - CJS - Mexico + Ciudad Obregon - CEN - Mexico + Ciudad Victoria - CVM - Mexico + Colima - CLQ - Mexico + Cozmel - CZM - Mexico + Culiacan - CUL - Mexico + Guadalajara - GDL - Mexico + Hermosillo - Gen. Pesqueira Garcia - HMO - Mexico + Huatulco - HUX - Mexico + Ixtapa/Zihuatenejo - ZIH - Mexico + Jalapa - JAL - Mexico + La Paz - Leon - LAP - Mexico + Lazaro Cardenas - LZC - Mexico + Leon - BJX - Mexico + Loreto - LTO - Mexico + Los Cabos - SJD - Mexico + Los Mochis - LMM - Mexico + Manzanillo - ZLO - Mexico + Mazatlan - MZT - Mexico + Merida - MID - Mexico + Mexicali - MXL - Mexico + Mexico City - Mexico City International Airport - MEX + Mexico City - Atizapan - AZP + Mexico City - Juarez International - MEX + Mexico City - Santa Lucia - NLU + Minatitlan - MTT - Mexico + Monterrey - Gen. Mariano Escobedo - MTY - Mexico + Monterrey - Aeropuerto Del Norte - NTR - Mexico + Morelia - MLM - Mexico + Nuevo Laredo - NLD - Mexico + Oaxaca - Xoxocotlan - OAX - Mexico + Puebla - PBC - Mexico + Puerto Escondido - PXM - Mexico + Puerto Vallarta - PVR - Mexico + San Jose Cabo - SJD - Mexico + San Luis Potosi - SLP - Mexico + Santa Rosalia - SRL - Mexico + Tampico - Gen. F. Javier Mina - TAM - Mexico + Tijuana - Rodriguez - TIJ - Mexico + Tuxtla Gutierrez - TGZ - Mexico + Uruapan - UPN - Mexico + Veracruz - VER - Mexico + Villahermosa - VSA - Mexico + Zacatecas - ZCL - Mexico + Pohnpei - PNI - Micronesia + Chisinau - Chişinău International Airport - KIV - Moldova + Ulaanbaatar - Buyant Uhaa Airport - ULN - Mongolia + Podgorica - TGD - Montenegro + Tivat - TIV - Montenegro + Agadir - AGA - Morocco + Al Hoceima - AHU - Morocco + Casablanca - CAS - Morocco + Casablanca, Mohamed V - CMN - Morocco + Fes - FEZ - Morocco + Marrakesh - Menara Airport - RAK - Morocco + Ouarzazate - OZZ - Morocco + Oujda - OUD - Morocco + Rabat - Sale - RBA - Morocco + Tangier - Boukhalef - TNG - Morocco + Beira - BEW - Mozambique + Maputo - Maputo International - MPM - Mozambique + Mandalay - Annisaton - MDL - Myanmar + Rangoon (Yangon) - Mingaladon - RGN - Myanmar + Yangon (Rangoon) - Mingaladon - RGN - Myanmar + Katima Mulilo/Mpacha - MPA - Namibia + Keetmanshoop - KMP - Namibia + Luederitz - LUD - Namibia + Mokuti - OKU - Namibia + Ondangwa - OND - Namibia + Oranjemund - OMD - Namibia + Rundu - NDU - Namibia + Swakopmund - SWP - Namibia + Tsumeb - TSB - Namibia + Windhoek - Eros - ERS - Namibia + Windhoek - Hosea Kutako International - WDH - Namibia + Janakpur - JKR - Nepal + Jiri - JIR - Nepal + Jomsom - JMO - Nepal + Jumla - JUM - Nepal + Kathmandu - Tribhuvan International Airport - KTM - Nepal + Amsterdam - Amsterdam Airport Schiphol - AMS - Netherlands + Den Haag (The Hague) - HAG - Netherlands + Eindhoven - EIN - Netherlands + Groningen - Eelde - GRQ - Netherlands + Lelystad - LEY - Netherlands + Maastricht/Aachen - MST - Netherlands + Rotterdam - RTM - Netherlands + Uden - Volkel Airport - UDE - Netherlands + Bonaire - BON - Netherlands Antilles + Curacao - Curaçao International Airport - CUR - Netherlands Antilles + St. Marteen - SXM - Netherlands Antilles + Ile des Pins - ILP - New Caledonia + Ile Ouen - IOU - New Caledonia + Mare - MEE - New Caledonia + Noumea - NOU - New Caledonia + Touho - TOU - New Caledonia + Auckland - Auckland International Airport - AKL - New Zealand + Blenheim - BHE - New Zealand + Christchurch - CHC - New Zealand + Dunedin - DUD - New Zealand + Hamilton - HLZ - New Zealand + Incercargill - IVC - New Zealand + Invercargill - IVC - New Zealand + Milford Sound - MFN - New Zealand + Mount Cook - GTN - New Zealand + Nelson - NSN - New Zealand + Palmerston North - PMR - New Zealand + Queenstown - ZQN - New Zealand + Rotorua - ROT - New Zealand + Te Anau - TEU - New Zealand + Wellington - WLG - New Zealand + Whakatane - WHK - New Zealand + Whangarei - WRE - New Zealand + Managua - Augusto C Sandino - MGA - Nicaragua + Agades - AJY - Niger + Arlit - RLT - Niger + Maradi - MFQ - Niger + Niamey - NIM - Niger + Zinder - ZND - Niger + Abuja - Nnamdi Azikiwe International Airport - ABV - Nigeria + Jos - JOS - Nigeria + Kano - KAN - Nigeria + Lagos - Murtala Muhammed - LOS - Nigeria + Port Harcourt - PHC - Nigeria + Pyongyang - Sunan International Airport - FNJ - North Korea + Saipan - SPN - Northern Mariana Islands + Alesund - AES - Norway + Alta - ALF - Norway + Bardufoss - BDU - Norway + Bergen - BGO - Norway + Bodo - BOO - Norway + Broennoeysund - BNN - Norway + Evenes - EVE - Norway + Floro - FRO - Norway + Hammerfest - HFT - Norway + Haugesund - HAU - Norway + Kirkenes - KKN - Norway + Kristiansand - KRS - Norway + Kristiansund - KSU - Norway + Lakselv - LKL - Norway + Oslo - Oslo Airport, Gardermoen - OSL - Norway + Oslo - Fornebu - FBU - Norway + Oslo - Sandefjord - TRF - Norway + Sogndal - SOG - Norway + Stavanger - SVG - Norway + Tromsoe - TOS - Norway + Trondheim - TRD - Norway + Muscat - Seeb - MCT - Oman + Salalah - SLL - Oman + Bahawalpur - BHV - Pakistan + Bannu - BNP - Pakistan + Chitral - CJL - Pakistan + Dera Ismail Khan - Dera Ismail Khan Airport - DSK - Pakistan + Faisalabad - LYP - Pakistan + Gilgit - GIL - Pakistan + Gwadar - GWD - Pakistan + Hyderabad - HDD - Pakistan + Islamabad - Benazir Bhutto International Airport - ISB - Pakistan + Jacobabad - JAG - Pakistan + Jiwani - JIW - Pakistan + Karachi - Jinnah International Airport - KHI - Pakistan + Khuzdar - KDD - Pakistan + Kohat - OHT - Pakistan + Lahore - LHE - Pakistan + Mianwali - MWD - Pakistan + Mirpur - QML - Pakistan + Moenjodaro - MJD - Pakistan + Multan - MUX - Pakistan + Muzaffarabad - MFG - Pakistan + Nawab Shah - WNS - Pakistan + Panjgur - PJG - Pakistan + Pasni - PSI - Pakistan + Peshawar - PEW - Pakistan + Quetta - UET - Pakistan + Rahim Yar Khan - RYK - Pakistan + Rawala Kot - RAZ - Pakistan + Rawalpindi - RWP - Pakistan + Saidu Sharif - SDT - Pakistan + Sindhri - MPD - Pakistan + Skardu - KDU - Pakistan + Sui - SUL - Pakistan + Sukkur - SKZ - Pakistan + Turbat - TUK - Pakistan + Zhob - PZH - Pakistan + Gaza City - Gaza International Airport - GZA - Palestinian Territory + Jaque    - JQE - Panama + Panama City - Tocumen International - PTY + Aiyura - AYU - Papua New Guinea + Amazon Bay - AZB - Papua New Guinea + Jacquinot Bay - JAQ - Papua New Guinea + Lae - Lae Nadzab Airport - LAE - Papua New Guinea + Manguna - MFO - Papua New Guinea + Port Moresby - Jackson Field - POM - Papua New Guinea + Asuncion - Asunción International Airport - ASU - Paraguay + Iquitos - IQT - Peru + Jauja - JAU - Peru + Juanjui - JJI - Peru + Juliaca - JUL - Peru + Lima - J Chavez International - LIM - Peru + Cebu City - Mactan-Cebu International - CEB - Philippines + Cuyo - CYU - Philippines + Jolo - JOL - Philippines + Mactan Island - Nab - NOP - Philippines + Manila - Ninoy Aquino International - MNL - Philippines + Gdansk - GDN - Poland + Krakow (Cracow) - John Paul II International Airport - KRK - Poland + Poznan, Lawica - POZ - Poland + Stettin - SZZ - Poland + Warsaw - Frédéric Chopin - WAW - Poland + Faro - FAO - Portugal + Funchal - FNC - Portugal + Horta - HOR - Portugal + Lisbon - Lisboa - LIS - Portugal + Ponta Delgada - PDL - Portugal + Porto - OPO - Portugal + Porto Santo - PXO - Portugal + Santa Maria - SMA - Portugal + Terceira - TER - Portugal + Aguadilla - BQN - Puerto Rico + Mayaguez - MAZ - Puerto Rico + Ponce - PSE - Puerto Rico + San Juan - SJU - Puerto Rico + Doha - Doha International Airport - DOH - Qatar + Saint Denis de la Reunion - RUN + Bucharest - BUH - Romania + Bucharest - Henri Coandă International Airport - OTP - Romania + Constanta (Constanța) - Constanta Int\'l Airport - CND - Romania + Adler/Sochi - AER - Russia + Arkhangelsk - ARH - Russia + Chabarovsk (Khabarovsk) - KHV - Russia + Chita (Tschita) - HTA - Russia + Irkutsk - IKT - Russia + Kaliningrad - KGD - Russia + Kazan - Kazan International Airport - KZN - Russia + Mineralnye Vody - MRV - Russia + Moscow - Metropolitan Area - MOW - Russia + Moscow - Domodedovo - DME - Russia + Moscow - Sheremetyevo - SVO - Russia + Moscow - Vnukovo - VKO - Russia + Murmansk - MMK - Russia + Nizhny Novgorod - Strigino International Airport - GOJ - Russia + Novosibirsk - Tolmachevo Airport - OVB - Russia + Rostov-on-Don - Rostov-on-Don Airport - RVI - Russia + Rostov-on-Don - Platov International Airport - ROV - Russia + Samara - Kurumoch International Airport - KUF - Russia + Saransk - Saransk Airport - SKX - Russia + St. Petersburg (Leningrad) - Pulkovo - LED - Russia + Ufa - UFA - Russia + Ukhta - UCT - Russia + Ulan-Ude - UUD - Russia + Velikiye Luki (Welikije Luki) - VLU - Russia + Yakutsk - YKS - Russia + Yekaterinburg - Koltsovo Airport - SVX - Russia + Kigali - Gregoire Kayibanda - KGL - Rwanda + Basseterre - Robert L. Bradshaw International Airport - SKB - Saint Kitts and Nevis + Castries - George F. L. Charles Airport - SLU - Saint Lucia + St. Lucia Hewanorra - UVF - Saint Lucia + St. Lucia Vigle - SLU - Saint Lucia + Canouan (island) - Canouan Airport - CIW - Saint Vincent & amp; the Grenadines + Kingstown - E. T. Joshua Airport - SVD - Saint Vincent & the Grenadines + St. Vincent - SVD - Saint Vincent & the Grenadines + Union Island - UNI - Saint Vincent & the Grenadines + Apia - Faleolo International Airport - APW - Samoa + Sao Tome - TMS - Sao Tome & Principe + Dhahran - DHA - Saudi Arabia + Jeddah - King Abdulaziz International - JED - Saudi Arabia + Jouf - AJF - Saudi Arabia + Khamis Mushayat - AHB - Saudi Arabia + Madinah, Mohammad Bin Abdulaziz - MED - Saudi Arabia + Medina - MED - Saudi Arabia + Riyadh - King Khaled International - RUH - Saudi Arabia + Tabuk - TUU - Saudi Arabia + Taif - TIF - Saudi Arabia + Yanbu - YNB - Saudi Arabia + Dammam, King Fahad International - DMM - Saudi Arabia + Edinburgh - Edinburgh Airport - EDI - United Kingdom + Dakar - Léopold Sédar Senghor International Airport - DKR - Senegal + Belgrad (Beograd) - Belgrade Nikola Tesla International - BEG - Serbia + Nis - INI - Serbia + Novi Sad - QND - Serbia + Pristina - PRN - Serbia + Mahe - Seychelles International - SEZ + Freetown - Freetown-Lungi International Airport - FNA - Sierra Leone + Singapore - Changi - SIN + Singapore - Paya Lebar - QPG + Singapore - Seletar - XSP + Bratislava - M. R. Štefánik Airport - BTS - Slovakia + Ljubljana - Brnik - LJU - Slovenia + Maribor - MBX - Slovenia + Guadalcanal - GSI - Solomon Islands + Honiara Henderson International - HIR - Solomon Islands + Mogadishu - MGQ - Somalia + Aggeneys - AGZ - South Africa + Alexander Bay - Kortdoorn - ALJ - South Africa + Alldays - ADY - South Africa + Bloemfontein - Bloemfontein Airport - BFN - South Africa + Cape Town - Cape Town International Airport - CPT - South Africa + Durban - DUR - South Africa + East London - ELS - South Africa + Ellisras - ELL - South Africa + George - GRJ - South Africa + Johannesburg - OR Tambo International Airport - JNB - South Africa + Kimberley - KIM - South Africa + Kleinsee - KLZ - South Africa + Lanseria - HLA - South Africa + Lusisiki - LUJ - South Africa + Margate - MGH - South Africa + Messina - MEZ - South Africa + Mkambati - MBM - South Africa + Mossel Bay - MZY - South Africa + Mzamba - MZF - South Africa + Nelspruit - NLP - South Africa + Nelspruit - Kruger Mpumalanga International Airport - MQP - South Africa + Newcastle - NCS - South Africa + Oudtshoorn - OUH - South Africa + Phalaborwa - PHW - South Africa + Pietermaritzburg - PZB - South Africa + Pietersburg - PTG - South Africa + Pilanesberg/Sun City - NTY - South Africa + Plettenberg Bay - PBZ - South Africa + Port Elizabeth - PLZ - South Africa + Pretoria - Wonderboom Apt. - PRY - South Africa + Richards Bay - RCB - South Africa + Sishen - SIS - South Africa + Skukuza - SZK - South Africa + Springbok - SBU - South Africa + Thaba\'Nchu - TCU - South Africa + Ulundi - ULD - South Africa + Umtata - UTT - South Africa + Upington - UTN - South Africa + Vryheid - VYD - South Africa + Walvis Bay - WVB - South Africa + Welkom - WEL - South Africa + Pu San (Busan) - Gimhae International Airport - PUS - South Korea + Seoul - Incheon International Airport - ICN - South Korea + Seoul - Kimpo - SEL - South Korea + Ulsan - USN - South Korea + Juba - JUB - South Sudan + Alicante - ALC - Spain + Almeria - LEI - Spain + Arrecife/Lanzarote - ACE - Spain + Badajoz - BJZ - Spain + Barcelona - BCN - Spain + Bilbao - BIO - Spain + Cordoba - ODB - Spain + Fuerteventura - FUE - Spain + Gerona - GRO - Spain + Granada - GRX - Spain + Jerez de la Frontera/Cadiz - La Parra - XRY - Spain + La Coruna - LCG - Spain + Las Palmas - LPA - Spain + Madrid - Barajas - MAD - Spain + Mahon - MAH - Spain + Malaga - AGP - Spain + Murcia - MJV - Spain + Oviedo - OVD - Spain + Palma de Mallorca - PMI - Spain + Reus - REU - Spain + San Sebastian - EAS - Spain + Santa Cruz de la Palma - SPC - Spain + Santander - SDR - Spain + Santiago de Compostela - SCQ - Spain + Sevilla - SVQ - Spain + Tenerife - TCI - Spain + Tenerife - Sur Reina Sofia - TFS - Spain + Tenerife - Norte Los Rodeos - TFN - Spain + Valencia - VLC - Spain + Valladolid - VLL - Spain + Valverde - VDE - Spain + Vigo - VGO - Spain + Vitoria - VIT - Spain + Zaragoza - ZAZ - Spain + Colombo - Bandaranaike International Airport - CMB - Sri Lanka + Jaffna - Kankesanturai - JAF - Sri Lanka + Nevis - NEV - St. Kitts and Nevis + St. Kitts - SKB - St. Kitts and Nevis + St. Martin - SFG + Kassala - KSL - Sudan + Khartoum - Khartoum International Airport - KRT - Sudan + Paramaribo - Zanderij International - PBM - Suriname + Longyearbyen - Svalbard - LYR - Norway + Manzini - Matsapha International - MTS - Swaziland + Gothenburg (Göteborg) - Landvetter - GOT - Sweden + Helsingborg - JHE - Sweden + Jönköping (Jonkoping) - Axamo Airport - JKG - Sweden + Kalmar - KLR - Sweden + Karlstad - KSD - Sweden + Kiruna - KRN - Sweden + Kristianstad - KID - Sweden + Lidkoeping - LDK - Sweden + Lulea - LLA - Sweden + Malmo (Malmoe) - MMA - Sweden + Malmo (Malmö) - Malmö Airport - MMX - Sweden + Norrkoeping - NRK - Sweden + Oerebro - ORB - Sweden + Ronneby - RNB - Sweden + Stockholm Metropolitan Area - STO - Sweden + Stockholm - Arlanda - ARN - Sweden + Stockholm - Bromma - BMA - Sweden + Sundsvall - SDL - Sweden + Umea - UME - Sweden + Vaexjoe - VXO - Sweden + Vasteras - VST - Sweden + Visby - VBY - Sweden + Altenrhein - ACH - Switzerland + Basel - BSL - Switzerland + Berne, Bern-Belp - BRN - Switzerland + Berne, Railway Service - ZDJ - Switzerland + Geneva - Geneva-Cointrin International Airport - GVA - Switzerland + Lugano - LUG - Switzerland + Zurich (Zürich) - Kloten - ZRH - Switzerland + Basel/Mulhouse - EAP - Switzerland + Aleppo - ALP - Syria + Damascus, International - DAM - Syria + Kaohsiung International - KHH - Taiwan + Makung - MZG - Taiwan + Taipei - Chiang Kai Shek - TPE - Taiwan + Taipei - Sung Shan - TAY - Taiwan + Dushanbe (Duschanbe) - Dushanbe Airport - DYU - Tajikistan + Arusha - ARK - Tanzania + Dar es Salam (Daressalam) - Julius Nyerere Int\'l - DAR - Tanzania + Dodoma - Dodoma Airport - DOD - Tanzania + Kilimadjaro - JRO - Tanzania + Los Rodeos - TFN - Spain + Reina Sofia - TFS - Spain + Bangkok, Don Muang - DMK - Thailand + Bangkok, Suvarnabhumi International - BKK - Thailand + Chiang Mai - Chiang Mai International Airport - CNX - Thailand + Hatyai (Hat Yai) - HDY - Thailand + Nakhon Si Thammarat - NST - Thailand + Pattaya - PYX - Thailand + Phuket - HKT - Thailand + Ubon Ratchathani - Muang Ubon Airport - UBP - Thailand + Udon Thani - UTH - Thailand + Utapao (Pattaya) - UTP - Thailand + Bahamas - Lynden Pindling International Airport - NAS + Dili - Nicolau Lobato International Airport - DIL - Timor Leste (East Timor) + Lome - LFW - Togo + Nuku\'alofa - Fua\'Amotu International - TBU - Tonga + Port of Spain - Piarco International - POS - Trinidad and Tobago + Scarborough - Crown Point International - TAB - Trinidad and Tobago + Tobago - TAB - Trinidad and Tobago + Djerba - DJE - Tunisia + Monastir - MIR - Tunisia + Sfax - SFA - Tunisia + Tunis - Carthage - TUN - Tunisia + Adana - ADA - Turkey + Adiyaman - ADF - Turkey + Ankara - ANK - Turkey + Ankara - Esenboğa International Airport - ESB - Turkey + Antalya - AYT - Turkey + Bodrum - Milas Airport - BJV - Turkey + Dalaman - DLM - Turkey + Denizli - DNZ - Turkey + Erzincan - ERC - Turkey + Erzurum - ERZ - Turkey + Gaziantep - GZT - Turkey + Istanbul - Istanbul Atatürk Airport - IST - Turkey + Istanbul - Sabiha Gokcen - SAW - Turkey + Izmir - IZM - Turkey + Izmir - Adnan Menderes - ADB - Turkey + Kahramanmaras - KCM - Turkey + Kars - KYS - Turkey + Kayseri - ASR - Turkey + Konya - KYA - Turkey + Malatya - MLX - Turkey + Maras - KCM - Turkey + Mardin - MQM - Turkey + Mus - MSR - Turkey + Samsun - SZF - Turkey + Sivas - VAS - Turkey + Tekirdag - Corlu - TEQ - Turkey + Trabzon - TZX - Turkey + Van - Ferit Melen - VAN - Turkey + Ashgabat - Saparmurat Turkmenbashy Int. Airport - ASB - Turkmenistan + Entebbe - Entebbe International Airport - EBB - Uganda + Gulu - ULU - Uganda + Jinja - JIN - Uganda + Kharkov - HRK - Ukraine + Kiev - Borispol - KBP - Ukraine + Kiev - Zhulhany - IEV - Ukraine + Lvov (Lwow, Lemberg) - LWO - Ukraine + Nikolaev - NLV - Ukraine + Odessa - ODS - Ukraine + Simferopol - SIP - Ukraine + Uzhgorod - UDJ - Ukraine + Abu Dhabi - Abu Dhabi International - AUH - UAE + Al Ain - AAN - UAE + Alfujairah (Fujairah) - FJR - UAE + Dubai - Dubai International Airport - DXB - UAE + Fujairah, International Airport - FJR - UAE + Ras al Khaymah (Ras al Khaimah) - RKT - UAE + Sharjah - SHJ - UAE + Aberdeen - ABZ - United Kingdom + Barra (the famous tidal beach landing) - BRR - United Kingdom + Belfast - George Best Belfast City Airport - BHD - United Kingdom + Belfast - Belfast International Airport - BFS - United Kingdom + Benbecula - BEB - United Kingdom + Birmingham - Birmingham International Airport - BHX - United Kingdom + Blackpool - BLK - United Kingdom + Bournemouth - BOH - United Kingdom + Bristol - BRS - United Kingdom + Cambrigde - CBG - United Kingdom + Campbeltown - CAL - United Kingdom + Cardiff - Cardiff Airport - CWL - United Kingdom + Coventry - Baginton - CVT - United Kingdom + Derry (Londonderry) - LDY - United Kingdom + Doncaster/Sheffield, Robin Hood International Airport - DSA - United Kingdom + Dundee - DND - United Kingdom + Exeter - EXT - United Kingdom + Fair Isle (Shetland) - FIE - United Kingdom + Foula (Shetland) - FOU - United Kingdom + Glasgow, Prestwick - PIK - United Kingdom + Glasgow - GLA - United Kingdom + Humberside - HUY - United Kingdom + Inverness - INV - United Kingdom + Islay - ILY - United Kingdom + Kent (Manston) Kent International - MSE - United Kingdom + Kirkwall (Orkney) - KOI - United Kingdom + Land\'s End - LEQ - United Kingdom + Leeds/Bradford - LBA - United Kingdom + Lerwick/Tingwall (Shetland Islands) - LWK - United Kingdom + Liverpool - LPL - United Kingdom + London Metropolitan Area - LON - United Kingdom + London - City Airport - LCY - United Kingdom + London - Gatwick - LGW - United Kingdom + London - Heathrow - LHR - United Kingdom + London - Luton - LTN - United Kingdom + London - Stansted - STN - United Kingdom + Londonderry - Eglinton - LDY - United Kingdom + Lydd - Lydd International Airport - LYX - United Kingdom + Manchester - MAN - United Kingdom + Newquay - NQY - United Kingdom + Newcastle - NCL - United Kingdom + Norwich - NWI - United Kingdom + Nottingham - East Midlands - EMA - United Kingdom + Orkney - Kirkwall - KOI - United Kingdom + Out Skerries (Shetland) - OUK - United Kingdom + Sheffield, City Airport - SZD - United Kingdom + Sheffield, Doncaster, Robin Hood International Airport - DSA - United Kingdom + Southampton - Eastleigh - SOU - United Kingdom + Southend (London) - SEN - United Kingdom + Stansted (London) - STN - United Kingdom + Stornway - SYY - United Kingdom + Sumburgh (Shetland) - LSI - United Kingdom + Teesside, Durham Tees Valley - MME - United Kingdom + Unst (Shetland Island) - Baltasound Airport - UNT - United Kingdom + Wick - WIC - United Kingdom + Montevideo - Carrasco - MVD - Uruguay + Midway Island - Sand Island Field - MDY - USA + Aberdeen (SD) - ABR - USA + Abilene (TX) - ABI - USA + Akron (OH) - CAK - USA + Albany (GA) - ABY - USA + Albany (NY) - Albany International Airport - ALB - USA + Albuquerque (NM) - ABQ - USA + Allentown (PA) - ABE - USA + Altoona (PA) - AOO - USA + Altus - AXS - USA + Amarillo (TX) - AMA - USA + Anchorage (AK) - Ted Stevens Anchorage International - ANC - USA + Ann Arbor (MI) - ARB - USA + Anniston (AL) - ANB - USA + Appelton/Neenah/Menasha (WI) - ATW - USA + Asheville (NC) - AVL - USA + Aspen, (CO) - Aspen-Pitkin County Airport - ASE - USA + Athens (GA) - AHN - USA + Athens (OH) - ATO - USA + Atlanta (GA) - Hartsfield Atlanta International Airport - ATL - USA + Atlantic City (NJ) - Atlantic City International - ACY - USA + Augusta (GA) - AGS - USA + Augusta (ME) - Augusta State Airport - AUG - USA + Austin (TX) - Austin-Bergstrom Airport - AUS - USA + Bakersfield (CA) - BFL - USA + Baltimore (MD) - Washington International Airport - BWI - USA + Bangor (ME) - BGR - USA + Baton Rouge (LA) - Baton Rouge Metropolitan Airport - BTR - USA + Beaumont/Pt. Arthur (TX) - BPT - USA + Beckley (WV) - BKW - USA + Bellingham (WA) - BLI - USA + Bemidji (MN) - BJI - USA + Benton Harbour (MI) - BEH - USA + Bethel (AK) - BET - USA + Billings (MT) - BIL - USA + Birmingham (AL) - BHM - USA + Bismarck (ND) - Bismarck Municipal Airport - BIS - USA + Bloomington (IL) - BMI - USA + Bloomington (IN) - BMG - USA + Bluefield (WV) - BLF - USA + Boise (ID) - Boise Air Terminal - BOI - USA + Borrego Springs (CA) - BXS - USA + Boston (MA) - General Edward Lawrence Logan - BOS - USA + Bozeman (MT) - BZN - USA + Bradford/Warren (PA) /Olean (NY) - BFD - USA + Brainerd (MN) - BRD - USA + Bridgeport (CT) - BDR - USA + Brookings (SD) - BKX - USA + Brunswick (GA) - BQK - USA + Buffalo/Niagara Falls (NY) - BUF - USA + Bullhead City (NV) - BHC - USA + Burbank (CA) - BUR - USA + Burlington IA - BRL - USA + Burlington (VT) - BTV - USA + Butte (MT) - BTM - USA + Carlsbad (CA) - CLD - USA + Carson City (NV) - CSN - USA + Casper (WY) - CPR - USA + Cedar City (UT) - CDC - USA + Cedar Rapids IA - CID - USA + Champaign (IL) - CMI - USA + Charleston (SC) - CHS - USA + Charleston (WV) - Yeager Airport - CRW - USA + Charlotte (NC) - CLT - USA + Charlottesville (VA) - CHO - USA + Chattanooga (TN) - CHA - USA + Cheyenne (WY) - Cheyenne Regional Airport - CYS - USA + Chicago (IL), Midway - MDW - USA + Chicago (IL), O\'Hare International Airport - ORD - USA + Chicago (IL) - CHI - USA + Chico (CA) - CIC - USA + Cincinnati (OH) - Cincinnati/Northern Kentucky Int\'l - CVG - USA + Clarksburg (WV) - CKB - USA + Cleveland (OH) , Burke Lakefront - BKL - USA + Cleveland (OH) , Hopkins - CLE - USA + Cody/Powell/Yellowstone (WY) - COD - USA + Coffmann Cove (AK) - KCC - USA + College Station/Bryan (TX) - CLL - USA + Colorado Springs (CO) - COS - USA + Columbia (SC) - Columbia Metropolitan Airport - CAE - USA + Columbus (GA) - CSG - USA + Columbus (OH) - Port Columbus International Airport - CMH - USA + Concord (CA) - Buchanan Field - CCR - USA + Concord (NH) - Concord Municipal Airport - CON - USA + Cordova (AK) - CDV - USA + Corpus Christi (TX) - CRP - USA + Craig (AK) - CGA - USA + Crescent City (CA) - CEC - USA + Dallas (TX) , Love Field - DAL - USA + Dallas/Ft. Worth (TX) - Dallas/Fort Worth International - DFW - USA + Danville (VA) - DAN - USA + Dayton (OH) - DAY - USA + Daytona Beach (FL) - DAB - USA + Decatur (IL) - DEC - USA + Denver (CO) - Denver International Airport - DEN - USA + Des Moines (IA) - Des Moines International Airport - DSM - USA + Detroit (MI) , Coleman A. Young Municipal - DET - USA + Detroit (MI) , Wayne County Airport - DTW - USA + Detroit (MI) , Metropolitan Area - DTT - USA + Devils Lake (ND) - DVL - USA + Dillingham (AK) - DLG - USA + Dothan (AL) - DHN - USA + Dubois (PA) - DUJ - USA + Dubuque IA - DBQ - USA + Duluth (MN) /Superior (WI) - DLH - USA + Durango (CO) - DRO - USA + Dutch Harbor (AK) - DUT - USA + Eau Clarie (WI) - EAU - USA + Elkhart (IN) - EKI - USA + Elko (NV) - EKO - USA + Elmira (NY) - ELM - USA + El Paso (TX) - El Paso International Airport - ELP - USA + Ely (NV) - ELY - USA + Erie (PA) - ERI - USA + Escanaba (MI) - ESC - USA + Eugene (OR) - EUG - USA + Eureka (CA) - ACV - USA + Evansville (IN) - EVV - USA + Fairbanks (AK) - FAI - USA + Fargo (ND) (MN) - FAR - USA + Farmington (NM) - FMN - USA + Fayetteville (AR) - FYV - USA + Fayetteville/Ft. Bragg (NC) - FAY - USA + Flagstaff (AZ) - FLG - USA + Flint (MI) - FNT - USA + Florence (SC) - FLO - USA + Fort Dodge IA - FOD - USA + Fort Huachuca/Sierra Vista (AZ) - FHU - USA + Fort Lauderdale/Hollywood (FL) - FLL - USA + Fort Myers, Metropolitan Area (FL) - FMY - USA + Fort Myers, Southwest Florida Reg (FL) - RSW - USA + Fort Riley (KS) - Marshall AAF - FRI - USA + Fort Smith (AR) - FSM - USA + Fort Walton Beach (FL) - VPS - USA + Fort Wayne (IN) - FWA - USA + Fort Worth (TX) - Dallas/Fort Worth International Airport - DFW - USA + Franklin/Oil City (PA) - FKL - USA + Fresno (CA) - FAT - USA + Gadsden (AL) - GAD - USA + Gainesville (FL) - GNV - USA + Gilette (WY) - GCC - USA + Glasgow (MT) - GGW - USA + Glendive (MT) - GDV - USA + Grand Canyon (AZ) - GCN - USA + Grand Forks (ND) - GFK - USA + Grand Junction (CO) - GJT - USA + Grand Rapids (MI) - GRR - USA + Grand Rapids (MN) - GPZ - USA + Great Falls (MT) - GTF - USA + Green Bay (WI) - GRB - USA + Greenbrier/Lewisburg (WV) - LWB - USA + Greensboro/Winston Salem (NC) - GSO - USA + Greenville (MS) - GLH - USA + Greenville (NC) - PGV - USA + Greenville/Spartanburg (SC) - GSP - USA + Groton/New London (CT) - GON - USA + Gulfport/Biloxi (MS) - GPT - USA + Gunnison/Crested Butte (CO) - GUC - USA + Haines (AK) - HNS - USA + Hancock (MI) - CMX - USA + Harlingen/South Padre Island (TX) - HRL - USA + Harrisburg (PA) - Harrisburg Skyport - HAR - USA + Harrisburg (PA) - Harrisburg International - MDT - USA + Hartford (CT) /Springfield (MA) - BDL - USA + Havre (MT) - HVR - USA + Helena (MT) - HLN - USA + Hibbing (MN) - HIB - USA + Hickory (NC) - HKY - USA + Hilo (HI) - ITO - USA + Hilton Head Island (SC) - HHH - USA + Homer (AK) - HOM - USA + Honolulu (HI) - Honolulu International Airport - HNL - USA + Hoonah (AK) - HNH - USA + Houston (TX) , Hobby - HOU - USA + Houston, TX - George Bush Intercontinental Airport - IAH - USA + Huntington (WV) - HTS - USA + Huntsville (AL) - HSV - USA + Huron (SD) - HON - USA + Hyannis (MA) - HYA - USA + Hydaburg (AK) - HYG - USA + Idaho Falls (ID) - IDA - USA + Iliamna (AK) - ILI - USA + Imperial (CA) - IPL - USA + Indianapolis (IN) International - IND - USA + International Falls (MN) - INL - USA + Inykern (CA) - IYK - USA + Ithaca/Cortland (NY) - ITH - USA + Jackson Hole (WY) - JAC - USA + Jackson (MI) - Reynolds Municipal - JXN - USA + Jackson,  MN   - MJQ - USA + Jackson (MS) - Jackson Internationall - JAN - USA + Jackson (MS) - Hawkins Field    - HKS - USA + Jackson (TN) - Mckellar - MKL - USA + Jackson Hole (WY) - JAC - USA + Jacksonville (AR)  Little Rock AFB    - LRF - USA + Jacksonville (FL) - Cecil Field NAS    - NZC - USA + Jacksonville (FL) Jacksonville NAS    - NIP - USA + Jacksonville (FL) - International - JAX - USA + Jacksonville (FL) - Craig Municipal    - CRG - USA + Jacksonville (IL) - Municipal Airport - IJX - USA + Jacksonville (NC) - OAJ - USA + Jacksonville (TX) - JKV - USA + Jamestown (ND) - JMS - USA + Jamestown (NY) - JHW - USA + Janesville (WI) - Rock County - JVL - USA + Jefferson City (MO) - Jefferson Memorial - JEF - USA + Johnson City (NY) - Binghamton/Endicott/Johnson - BGM - USA + Johnston Island - JON - USA + Johnstown (PA) - JST - USA + Jonesboro (AR)  Jonesboro Airport - JBR - USA + Joplin (MO) - JLN - USA + Juneau (AK) - Juneau International Airport - JNU - USA + Kahului (HI) - OGG - USA + Kalamazoo/Battle Creek (MI) - AZO - USA + Kalispell (MT) - FCA - USA + Kamuela (HI) - MUE - USA + Kansas City (MO) - Kansas City International Airport - MCI - USA + Kapalua West (HI) - JHM - USA + Kaunakakai (HI) - MKK - USA + Kenai (AK) - ENA - USA + Ketchikan (AK) - KTN - USA + Key West (FL) - EYW - USA + Killeem (TX) - ILE - USA + King Salomon (AK) - AKN - USA + Kingston (NC) - ISO - USA + Klamath Fall (OR) - LMT - USA + Klawock (AK) - KLW - USA + Knoxville (TN) - TYS - USA + Kodiak (AK) - ADQ - USA + Kona (HI) - KOA - USA + Kotzbue (AK) - OTZ - USA + Labouchere Bay (AK) - WLB - USA + La Crosse (WI) - LSE - USA + Lafayette (IN) - LAF - USA + Lafayette, La - LFT - USA + Lake Charles (LA) - LCH - USA + Lake Havasu City (AZ) - HII - USA + Lake Tahoe (CA) - TVL - USA + Lanai City (HI) - LNY - USA + Lancaster (PA) - LNS - USA + Lansing (MI) - LAN - USA + Laramie (WY) - LAR - USA + Laredo (TX) - LRD - USA + Las Vegas (NV) - LAS - USA + Latrobe (PA) - LBE - USA + Laurel/Hattisburg (MS) - PIB - USA + Lawton (OK) - LAW - USA + Lebanon (NH) - LEB - USA + Lewiston (ID) - LWS - USA + Lewistown (MT) - LWT - USA + Lexington (KY) - LEX - USA + Lihue (HI) - LIH - USA + Lincoln (NE) - LNK - USA + Little Rock (AR) - LIT - USA + Long Beach (CA) - LGB - USA + Long Island (AK) - LIJ - USA + Long Island, Islip (NY) - Mac Arthur - ISP - USA + Longview/Kilgore (TX) - GGG - USA + Los Angeles (CA) - International - LAX - USA + Louisville (KY) - SDF - USA + Lubbock (TX) - LBB - USA + Lynchburg (VA) - LYH - USA + Lyons (KS) - Rice County Municipal - LYO - USA + Macon (GA) - MCN - USA + Madison (WI) - MSN - USA + Manchester (NH) - MHT - USA + Marathon (FL) - MTH - USA + Marquette (MI) - MQT - USA + Martha\'s Vineyard (MA) - MVY - USA + Martinsburg (WV) - MRB - USA + Mason City IA - MCW - USA + Mattoon (IL) - MTO - USA + McAllen (TX) - MFE - USA + Medford (OR) - MFR - USA + Melbourne (FL) - MLB - USA + Memphis (TN) - MEM - USA + Merced (CA) - MCE - USA + Meridian (MS) - MEI - USA + Metlakatla (AK) - MTM - USA + Miami (FL) - MIA - USA + Midland/Odessa (TX) - MAF - USA + Miles City (MT) - MLS - USA + Milwaukee (WI) - MKE - USA + Minneapolis - St. Paul International Airport (MN) - MSP - USA + Minot (ND) - MOT - USA + Missula (MT) - MSO - USA + Mitchell (SD) - MHE - USA + Mobile (AL) - Pascagoula (MS) - MOB - USA + Modesto (CA) - MOD - USA + Moline/Quad Cities (IL) - MLI - USA + Monroe, La - MLU - USA + Monterey (CA) - MRY - USA + Montgomery (AL) - MGM - USA + Montrose/Tellruide (CO) - MTJ - USA + Morgantown (WV) - MGW - USA + Moses Lake (WA) - MWH - USA + Mt. McKinley (AK) - MCL - USA + Muscle Shoals (AL) - MSL - USA + Muskegon (MI) - MKG - USA + Myrtle Beach (SC) - Myrtle Beach AFB - MYR - USA + Myrtle Beach (SC) - Grand Strand Airport - CRE - USA + Nantucket (MA) - ACK - USA + Naples (FL) - APF - USA + Nashville (TN) - BNA - USA + New Bern (NC) - EWN - USA + New Haven (CT) - HVN - USA + New Orleans, La - MSY - USA + New York - John F. Kennedy (NY) - JFK - USA + New York - LaGuardia (NY) - LGA - USA + New York - Newark (NJ) - EWR - USA + New York (NY) - NYC - USA + Newburgh (NY) - SWF - USA + Newport News/Williamsburg (VA) - PHF - USA + Niagara Falls International - IAG - USA + Nome (AK) - OME - USA + Norfolk/Virginia Beach (VA) - ORF - USA + North Bend (OR) - OTH - USA + Oakland (CA) - OAK - USA + Oklahoma City (OK) - Will Rogers World - OKC - USA + Omaha (NE) - OMA - USA + Ontario (CA) - ONT - USA + Orange County (Santa Ana) (CA) - SNA - USA + Orlando Metropolitan Area (FL) - ORL - USA + Orlando - International Airport (FL) - MCO - USA + Oshkosh (WI) - OSH - USA + Owensboro (KY) - OWB - USA + Oxnard (CA) - OXR - USA + Paducah (KY) - PAH - USA + Page/Lake Powell (AZ) - PGA - USA + Pakersburg (WV) /Marietta (OH) - PKB - USA + Palmdale/Lancaster (CA) - PMD - USA + Palm Springs (CA) - PSP - USA + Panama City (FL) - PFN - USA + Pasco (WA) - PSC - USA + Pellston (MI) - PLN - USA + Pendelton (OR) - PDT - USA + Pensacola (FL) - PNS - USA + Peoria/Bloomington (IL) - PIA - USA + Petersburg (AK) - PSG - USA + Philadelphia (PA) - International - PHL - USA + Phoenix (AZ) - Sky Harbor International - PHX - USA + Pierre (SD) - PIR - USA + Pittsburgh International Airport (PA) - PIT - USA + Plattsburgh (NY) - PLB - USA + Pocatello (ID) - PIH - USA + Port Angeles (WA) - CLM - USA + Portland (ME) - PWM - USA + Portland International (OR) - PDX - USA + Poughkeepsie (NY) - POU - USA + Presque Island (ME) - PQI - USA + Providence (RI) - PVD - USA + Prudhoe Bay (AK) - SCC - USA + Pueblo (CO) - PUB - USA + Pullman (WA) - PUW - USA + Quincy (IL) - UIN - USA + Raleigh/Durham (NC) - RDU - USA + Rapid City (SD) - RAP - USA + Reading (PA) - RDG - USA + Redding (CA) - RDD - USA + Redmond (OR) - RDM - USA + Reno (NV) - RNO - USA + Rhinelander (WI) - RHI - USA + Richmond (VA) - RIC - USA + Roanoke (VA) - ROA - USA + Rochester (MN) - RST - USA + Rochester (NY) - ROC - USA + Rock Springs (WY) - RKS - USA + Rockford (IL) - RFD - USA + Rockland (ME) - RKD - USA + Rocky Mount - Wilson (NC) - RWI - USA + Sacramento (CA) - SMF - USA + Saginaw/Bay City/Midland (MI) - MBS - USA + Salem (OR) - SLE - USA + Salinas (CA) - SNS - USA + Salisbury (MD) - SBY - USA + Salt Lake City (UT) - SLC - USA + San Angelo (TX) - SJT - USA + San Antonio (TX) - SAT - USA + San Diego - Lindberg Field International (CA) - SAN - USA + San Francisco - International Airport, SA - SFO - USA + San Jose (CA) - SJC - USA + San Luis Obisco (CA) - SBP - USA + Santa Ana - John Wayne Airport (CA) - SNA - USA + Santa Barbara (CA) - SBA - USA + Santa Maria (CA) - SMX - USA + Santa Rosa (CA) - STS - USA + Sarasota/Bradenton (FL) - SRQ - USA + Savannah (GA) - SAV - USA + Scottsdale (AZ) - SCF - USA + Seattle/Tacoma (WA) - SEA - USA + Shenandoah Valley/Stauton (VA) - SHD - USA + Sheridan (WY) - SHR - USA + Shreveport, La - SHV - USA + Sidney (MT) - SDY - USA + Sioux City IA - SUX - USA + Sioux Falls (SD) - FSD - USA + Sitka (AK) - SIT - USA + Skagway (AK) - SGY - USA + South Bend (IN) - SBN - USA + Spokane (WA) - GEG - USA + Springfield (IL) - SPI - USA + Springfield (MO) - SGF - USA + St. George (UT) - SGU - USA + St. Louis (MO) Lambert–St. Louis International Airport - STL - USA + State College/Belefonte (PA) - SCE - USA + Steamboat Springs (CO) - HDN - USA + Stockton (CA) - SCK - USA + Sun Valley (ID) - SUN - USA + Syracuse (NY) - SYR - USA + Talkeetna (AK) - TKA - USA + Tallahassee (FL) - TLH - USA + Tampa - International (FL) - TPA - USA + Telluride (CO) - TEX - USA + Terre Haute (IN) - HUF - USA + Texarkana (AR) - TXK - USA + Thief River Falls (MN) - TVF - USA + Thorne Bay (AK) - KTB - USA + Toledo (OH) - TOL - USA + Traverse City (MI) - TVC - USA + Trenton/Princeton (NJ) - TTN - USA + Tri-Cities Regional (TN) /VA - TRI - USA + Tucson (AZ) - TUS - USA + Tulepo (MS) - TUP - USA + Tulsa (OK) - TUL - USA + Tuscaloosa (AL) - TCL - USA + Twin Falls (ID) - TWF - USA + Tyler (TX) - TYR - USA + Ukiah (CA) - UKI - USA + Unalakleet (AK) - UNK - USA + Upolu Point (HI) - UPP - USA + Utica (NY) - Oneida County Airport - UCA - USA + Vail (CO) - EGE - USA + Valdez (AK) - VDZ - USA + Valdosta (GA) - VLD - USA + Vernal (UT) - VEL - USA + Vero Beach/Ft. Pierce (FL) - VRB - USA + Visalia (CA) - VIS - USA + Waco (TX) - ACT - USA + Walla Walla (WA) - ALW - USA + Washington DC - Baltimore Washington International - BWI - USA + Washington DC - Dulles International - IAD - USA + Washington DC - Ronald Reagan National - DCA - USA + Washington DC - WAS - USA + Waterloo IA - ALO - USA + Watertown (SD) - ATY - USA + Wausau/Stevens Point (WI) - CWA + Wenatchee (WA) - EAT - USA + West Palm Beach (FL) - PBI - USA + West Yellowstone (MT) - WYS - USA + White Plains (NY) - HPN - USA + Wichita Falls (TX) - SPS - USA + Wichita (KS) - ICT - USA + Wilkes Barre/Scranton (PA) - AVP - USA + Williamsport (PA) - IPT - USA + Williston (ND) - ISL - USA + Wilmington (NC) - ILM - USA + Wolf Point (MT) - OLF - USA + Worcester (MA) - ORH - USA + Worland (WY) - WRL - USA + Wrangell (AK) - WRG - USA + Yakima (WA) - YKM - USA + Yakutat (AK) - YAK - USA + Yuma (AZ) - YUM - USA + Alexandria - Esler Field - ESF - USA + Samarkand - Samarkand International Airport - SKD - Uzbekistan + Tashkent - International - TAS - Uzbekistan + Termez (Termes) - TMZ - Uzbekistan + Urgench - UGC - Uzbekistan + Port Vila - VLI - Vanuatu + Santo - SON - Vanuatu + Ulei - ULB - Vanuatu + Barcelona - BLA - Venezuela + Caracas - Simón Bolívar International Airport - CCS - Venezuela + Ciudad Guayana - CGU - Venezuela + Maracaibo - La Chinita - MAR - Venezuela + Margerita - PMV - Venezuela + Puerto Ordaz - PZO - Venezuela + Uriman - URM - Venezuela + Valencia - VLN - Venezuela + Ho Chi Minh City (Saigon) - Tan Son Nhat International - SGN - Vietnam + Hue - Phu Bai - HUI - Vietnam + Saigon (Ho Chi Minh City) - SGN - Vietnam + Hanoi - Noi Bai International Airport - HAN - Vietnam + Beef Island - Terrance B. Lettsome - EIS - British Virgin Islands + Virgin Gorda - VIJ - British Virgin Islands + St. Croix - STX - US Virgin Islands + St. Thomas - STT - US Virgin Islands + Futuna - FUT - Wallis and Futuna Islands + Wallis - WLS - Wallis and Futuna Islands + Aden - Aden International Airport - ADE - Yemen + Sanaa (Sana\'a) - Sana\'a International - SAH - Yemen + Chipata - CIP - Zambia + Kitwe - KIW - Zambia + Lusaka - Lusaka International Airport - LUN - Zambia + Mfuwe - MFU - Zambia + N\'Dola - NLA - Zambia + Buffalo Range - BFO - Zimbabwe + Bulawayo - BUQ - Zimbabwe + Gweru - GWE - Zimbabwe + Harare - Harare International Airport - HRE - Zimbabwe + Hwange National Park - HWN - Zimbabwe + Masvingo - MVZ - Zimbabwe + Salisbury - SAY - Zimbabwe + Victoria Falls - VFA - Zimbabwe + Isle of Man - IOM - United Kingdom + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..98a4c73 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/app/src/release/res/values/google_maps_api.xml b/app/src/release/res/values/google_maps_api.xml new file mode 100644 index 0000000..1ef79e9 --- /dev/null +++ b/app/src/release/res/values/google_maps_api.xml @@ -0,0 +1,20 @@ + + + YOUR_KEY_HERE + diff --git a/app/src/test/java/com/appttude/h_mal/exchangemap/ExampleUnitTest.java b/app/src/test/java/com/appttude/h_mal/exchangemap/ExampleUnitTest.java new file mode 100644 index 0000000..ab5f563 --- /dev/null +++ b/app/src/test/java/com/appttude/h_mal/exchangemap/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.appttude.h_mal.exchangemap; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..8d3ef8e --- /dev/null +++ b/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..82618ce --- /dev/null +++ b/gradle.properties @@ -0,0 +1,15 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..9a4163a --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app'