14105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen/*
24105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * Copyright (C) 2011 The Android Open Source Project
34105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen *
44105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * Licensed under the Apache License, Version 2.0 (the "License");
54105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * you may not use this file except in compliance with the License.
64105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * You may obtain a copy of the License at
74105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen *
84105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen *      http://www.apache.org/licenses/LICENSE-2.0
94105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen *
104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * Unless required by applicable law or agreed to in writing, software
114105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * distributed under the License is distributed on an "AS IS" BASIS,
124105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * See the License for the specific language governing permissions and
144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen * limitations under the License.
154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen */
164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenpackage com.android.gallery3d.ui;
184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
19b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport android.content.Context;
20b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport android.location.Address;
21b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport android.os.Handler;
22b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport android.os.Looper;
23b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen
244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.app.GalleryActivity;
254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.data.MediaDetails;
264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.util.Future;
274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.util.FutureListener;
284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.util.GalleryUtils;
294105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.util.ReverseGeocoder;
304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.util.ThreadPool.Job;
314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.util.ThreadPool.JobContext;
324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenpublic class DetailsAddressResolver {
344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private AddressResolvingListener mListener;
35b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen    private final GalleryActivity mContext;
364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private Future<Address> mAddressLookupJob;
37b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen    private final Handler mHandler;
384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
394105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private class AddressLookupJob implements Job<Address> {
40b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen        private double[] mLatlng;
414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        protected AddressLookupJob(double[] latlng) {
434105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mLatlng = latlng;
444105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public Address run(JobContext jc) {
474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            ReverseGeocoder geocoder = new ReverseGeocoder(mContext.getAndroidContext());
484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return geocoder.lookupAddress(mLatlng[0], mLatlng[1], true);
494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    }
514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    public interface AddressResolvingListener {
534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public void onAddressAvailable(String address);
544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    }
554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    public DetailsAddressResolver(GalleryActivity context) {
574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mContext = context;
584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mHandler = new Handler(Looper.getMainLooper());
594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    }
604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    public String resolveAddress(double[] latlng, AddressResolvingListener listener) {
624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mListener = listener;
634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mAddressLookupJob = mContext.getThreadPool().submit(
644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                new AddressLookupJob(latlng),
654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                new FutureListener<Address>() {
664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                    public void onFutureDone(final Future<Address> future) {
674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                        mAddressLookupJob = null;
684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                        if (!future.isCancelled()) {
694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                            mHandler.post(new Runnable() {
704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                                public void run() {
714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                                    updateLocation(future.get());
724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                                }
734105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                            });
744105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                        }
754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                    }
764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                });
77b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen        return GalleryUtils.formatLatitudeLongitude("(%f,%f)", latlng[0], latlng[1]);
784105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    }
794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private void updateLocation(Address address) {
814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (address != null) {
824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            Context context = mContext.getAndroidContext();
834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            String parts[] = {
844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getAdminArea(),
854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getSubAdminArea(),
864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getLocality(),
874105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getSubLocality(),
884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getThoroughfare(),
894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getSubThoroughfare(),
904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getPremises(),
914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getPostalCode(),
924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                address.getCountryName()
934105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            };
944105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
954105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            String addressText = "";
964105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            for (int i = 0; i < parts.length; i++) {
974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                if (parts[i] == null || parts[i].isEmpty()) continue;
984105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                if (!addressText.isEmpty()) {
994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                    addressText += ", ";
1004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                }
1014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                addressText += parts[i];
1024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            }
1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            String text = String.format("%s : %s", DetailsHelper.getDetailsName(
1044105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                    context, MediaDetails.INDEX_LOCATION), addressText);
1054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mListener.onAddressAvailable(text);
1064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    }
1084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
1094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    public void cancel() {
1104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mAddressLookupJob != null) {
1114105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mAddressLookupJob.cancel();
1124105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mAddressLookupJob = null;
1134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    }
1154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen}
116