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 24b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.android.gallery3d.app.AbstractGalleryActivity; 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; 35b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private final AbstractGalleryActivity 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 467817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public Address run(JobContext jc) { 484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen ReverseGeocoder geocoder = new ReverseGeocoder(mContext.getAndroidContext()); 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return geocoder.lookupAddress(mLatlng[0], mLatlng[1], true); 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public interface AddressResolvingListener { 544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void onAddressAvailable(String address); 554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 57b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public DetailsAddressResolver(AbstractGalleryActivity context) { 584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mContext = context; 594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mHandler = new Handler(Looper.getMainLooper()); 604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public String resolveAddress(double[] latlng, AddressResolvingListener listener) { 634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mListener = listener; 644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mAddressLookupJob = mContext.getThreadPool().submit( 654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen new AddressLookupJob(latlng), 664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen new FutureListener<Address>() { 677817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void onFutureDone(final Future<Address> future) { 694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mAddressLookupJob = null; 704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (!future.isCancelled()) { 714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mHandler.post(new Runnable() { 727817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 734105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void run() { 744105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen updateLocation(future.get()); 754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen }); 774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 784105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen }); 80b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen return GalleryUtils.formatLatitudeLongitude("(%f,%f)", latlng[0], latlng[1]); 814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private void updateLocation(Address address) { 844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (address != null) { 854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen Context context = mContext.getAndroidContext(); 864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String parts[] = { 874105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getAdminArea(), 884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getSubAdminArea(), 894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getLocality(), 904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getSubLocality(), 914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getThoroughfare(), 924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getSubThoroughfare(), 934105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getPremises(), 944105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getPostalCode(), 954105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen address.getCountryName() 964105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen }; 974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 984105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String addressText = ""; 994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen for (int i = 0; i < parts.length; i++) { 1004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (parts[i] == null || parts[i].isEmpty()) continue; 1014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (!addressText.isEmpty()) { 1024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen addressText += ", "; 1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1044105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen addressText += parts[i]; 1054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String text = String.format("%s : %s", DetailsHelper.getDetailsName( 1074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, MediaDetails.INDEX_LOCATION), addressText); 1084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mListener.onAddressAvailable(text); 1094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1114105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 1124105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void cancel() { 1134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mAddressLookupJob != null) { 1144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mAddressLookupJob.cancel(); 1154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mAddressLookupJob = null; 1164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen} 119