package com.piusvelte.sonet.fragment; import android.app.Activity; import android.app.Dialog; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import com.piusvelte.sonet.R; import com.piusvelte.sonet.loader.LocationLoader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.piusvelte.sonet.Sonet.INVALID_ACCOUNT_ID; /** * Created by bemmanuel on 4/30/15. */ public class ChooseLocation extends BaseDialogFragment implements LoaderManager.LoaderCallbacks<LocationLoader.LocationResult>, AdapterView.OnItemClickListener { private static final String ARG_REQUEST_CODE = "request_code"; private static final String ARG_ID = "id"; private static final String ARG_LATITUDE = "latitude"; private static final String ARG_LONGITUDE = "longitude"; private static final String ARG_LOCATION = "location"; private static final int LOADER_LOCATIONS = 0; private View mLoadingView; private SimpleAdapter mAdapter; private List<HashMap<String, String>> mLocations = new ArrayList<>(); public static ChooseLocation newInstance(int requestCode, long accountId, String latitude, String longitude) { ChooseLocation fragment = new ChooseLocation(); fragment.setRequestCode(requestCode); Bundle args = fragment.getArguments(); args.putInt(ARG_REQUEST_CODE, requestCode); args.putLong(ARG_ID, accountId); args.putString(ARG_LATITUDE, latitude); args.putString(ARG_LONGITUDE, longitude); return fragment; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.setTitle(R.string.add_location); return dialog; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.loading_list, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mLoadingView = view.findViewById(R.id.loading); mAdapter = new SimpleAdapter(getActivity(), mLocations, android.R.layout.simple_list_item_1, new String[] { ARG_LOCATION }, new int[] { android.R.id.text1 }); ListView listView = (ListView) view.findViewById(android.R.id.list); listView.setEmptyView(view.findViewById(android.R.id.empty)); listView.setOnItemClickListener(this); listView.setAdapter(mAdapter); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mLoadingView.setVisibility(View.VISIBLE); getLoaderManager().initLoader(LOADER_LOCATIONS, getArguments(), this); } @Override public void onDestroyView() { mLoadingView = null; super.onDestroyView(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { HashMap<String, String> selectedLocation = mLocations.get(position); getArguments().putString(ARG_LOCATION, selectedLocation.get(ARG_ID)); deliverResult(Activity.RESULT_OK); dismiss(); } @Override public Loader<LocationLoader.LocationResult> onCreateLoader(int id, Bundle args) { switch (id) { case LOADER_LOCATIONS: return new LocationLoader(getActivity(), args.getLong(ARG_ID), args.getString(ARG_LATITUDE), args.getString(ARG_LONGITUDE)); default: return null; } } @Override public void onLoadFinished(Loader<LocationLoader.LocationResult> loader, LocationLoader.LocationResult data) { switch (loader.getId()) { case LOADER_LOCATIONS: mLoadingView.setVisibility(View.GONE); if (data != null) { for (Map.Entry<String, String> location : data.locations.entrySet()) { HashMap<String, String> adapterLocation = new HashMap<>(); adapterLocation.put(ARG_ID, location.getKey()); adapterLocation.put(ARG_LOCATION, location.getValue()); mLocations.add(adapterLocation); } mAdapter.notifyDataSetChanged(); } else { Toast.makeText(getActivity(), getString(R.string.failure), Toast.LENGTH_LONG).show(); dismiss(); } break; } } @Override public void onLoaderReset(Loader<LocationLoader.LocationResult> loader) { // NO-OP } public static long getAccountId(@NonNull Intent intent) { return intent.getLongExtra(ARG_ID, INVALID_ACCOUNT_ID); } public static String getLatitude(@NonNull Intent intent) { return intent.getStringExtra(ARG_LATITUDE); } public static String getLongitude(@NonNull Intent intent) { return intent.getStringExtra(ARG_LONGITUDE); } public static String getLocation(@NonNull Intent intent) { return intent.getStringExtra(ARG_LOCATION); } }