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 194105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.app.AlertDialog; 204105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.app.Dialog; 214105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.content.Context; 224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.content.DialogInterface; 23a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chenimport android.content.DialogInterface.OnDismissListener; 244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.text.format.Formatter; 254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.view.LayoutInflater; 264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.view.View; 274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.view.ViewGroup; 284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.widget.BaseAdapter; 29a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millarimport android.widget.ListView; 304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.widget.TextView; 314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 32b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.R; 33b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.android.gallery3d.app.AbstractGalleryActivity; 34b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.common.Utils; 35b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.data.MediaDetails; 36b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsAddressResolver.AddressResolvingListener; 37b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 38b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 39b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsViewContainer; 40e879326d76734277469ca2f387f436fd0e922c87Doris Liuimport com.android.gallery3d.ui.DetailsHelper.ResolutionResolvingListener; 41b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen 425996f43546b629a01166904943eda1f788078634Sascha Haeberlingimport java.text.DecimalFormat; 434105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport java.util.ArrayList; 445996f43546b629a01166904943eda1f788078634Sascha Haeberlingimport java.util.Locale; 454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport java.util.Map.Entry; 464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenpublic class DialogDetailsView implements DetailsViewContainer { 484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen @SuppressWarnings("unused") 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private static final String TAG = "DialogDetailsView"; 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 51b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private final AbstractGalleryActivity mActivity; 524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsAdapter mAdapter; 534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private MediaDetails mDetails; 54b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private final DetailsSource mSource; 554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private int mIndex; 564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private Dialog mDialog; 57a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen private CloseListener mListener; 584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 59b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public DialogDetailsView(AbstractGalleryActivity activity, DetailsSource source) { 60b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActivity = activity; 614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mSource = source; 624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 647817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void show() { 66995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb reloadDetails(); 674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog.show(); 684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 707817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void hide() { 724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog.hide(); 734105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 744105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 757817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 76995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public void reloadDetails() { 77995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb int index = mSource.setIndex(); 784105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (index == -1) return; 794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen MediaDetails details = mSource.getDetails(); 804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (details != null) { 814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mIndex == index && mDetails == details) return; 824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex = index; 834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetails = details; 844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen setDetails(details); 854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 874105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private void setDetails(MediaDetails details) { 894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mAdapter = new DetailsAdapter(details); 904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String title = String.format( 91b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActivity.getAndroidContext().getString(R.string.details_title), 924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex + 1, mSource.size()); 93b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin ListView detailsList = (ListView) LayoutInflater.from(mActivity.getAndroidContext()).inflate( 94a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar R.layout.details_list, null, false); 95a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar detailsList.setAdapter(mAdapter); 96b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mDialog = new AlertDialog.Builder(mActivity) 97a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar .setView(detailsList) 984105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen .setTitle(title) 994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen .setPositiveButton(R.string.close, new DialogInterface.OnClickListener() { 1007817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void onClick(DialogInterface dialog, int whichButton) { 1024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog.dismiss(); 1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1044105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen }) 1054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen .create(); 106a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen 107a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen mDialog.setOnDismissListener(new OnDismissListener() { 1087817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 109a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen public void onDismiss(DialogInterface dialog) { 110a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen if (mListener != null) { 111a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen mListener.onClose(); 112a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen } 113a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen } 114a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen }); 1154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 117e879326d76734277469ca2f387f436fd0e922c87Doris Liu 118e879326d76734277469ca2f387f436fd0e922c87Doris Liu private class DetailsAdapter extends BaseAdapter 119e879326d76734277469ca2f387f436fd0e922c87Doris Liu implements AddressResolvingListener, ResolutionResolvingListener { 120b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private final ArrayList<String> mItems; 121b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private int mLocationIndex; 1225996f43546b629a01166904943eda1f788078634Sascha Haeberling private final Locale mDefaultLocale = Locale.getDefault(); 1235996f43546b629a01166904943eda1f788078634Sascha Haeberling private final DecimalFormat mDecimalFormat = new DecimalFormat(".####"); 124e879326d76734277469ca2f387f436fd0e922c87Doris Liu private int mWidthIndex = -1; 125e879326d76734277469ca2f387f436fd0e922c87Doris Liu private int mHeightIndex = -1; 1264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 1274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public DetailsAdapter(MediaDetails details) { 128b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Context context = mActivity.getAndroidContext(); 1294105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mItems = new ArrayList<String>(details.size()); 1304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mLocationIndex = -1; 1314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen setDetails(context, details); 1324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 1344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private void setDetails(Context context, MediaDetails details) { 135e879326d76734277469ca2f387f436fd0e922c87Doris Liu boolean resolutionIsValid = true; 136e879326d76734277469ca2f387f436fd0e922c87Doris Liu String path = null; 1374105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen for (Entry<Integer, Object> detail : details) { 1384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String value; 1394105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen switch (detail.getKey()) { 1404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_LOCATION: { 1414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen double[] latlng = (double[]) detail.getValue(); 1424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mLocationIndex = mItems.size(); 143b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin value = DetailsHelper.resolveAddress(mActivity, latlng, this); 1444105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_SIZE: { 1474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = Formatter.formatFileSize( 1484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, (Long) detail.getValue()); 1494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_WHITE_BALANCE: { 1524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = "1".equals(detail.getValue()) 1534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen ? context.getString(R.string.manual) 1544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen : context.getString(R.string.auto); 1554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_FLASH: { 1584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen MediaDetails.FlashState flash = 1594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen (MediaDetails.FlashState) detail.getValue(); 1604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen // TODO: camera doesn't fill in the complete values, show more information 1614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen // when it is fixed. 1624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (flash.isFlashFired()) { 1634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = context.getString(R.string.flash_on); 1644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 1654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = context.getString(R.string.flash_off); 1664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_EXPOSURE_TIME: { 1704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = (String) detail.getValue(); 1714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen double time = Double.valueOf(value); 1724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (time < 1.0f) { 1735996f43546b629a01166904943eda1f788078634Sascha Haeberling value = String.format(mDefaultLocale, "%d/%d", 1, 1745996f43546b629a01166904943eda1f788078634Sascha Haeberling (int) (0.5f + 1 / time)); 1754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 1764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen int integer = (int) time; 1774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen time -= integer; 1784105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = String.valueOf(integer) + "''"; 1794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (time > 0.0001) { 1805996f43546b629a01166904943eda1f788078634Sascha Haeberling value += String.format(mDefaultLocale, " %d/%d", 1, 1815996f43546b629a01166904943eda1f788078634Sascha Haeberling (int) (0.5f + 1 / time)); 1824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 186e879326d76734277469ca2f387f436fd0e922c87Doris Liu case MediaDetails.INDEX_WIDTH: 187e879326d76734277469ca2f387f436fd0e922c87Doris Liu mWidthIndex = mItems.size(); 188fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling if (detail.getValue().toString().equalsIgnoreCase("0")) { 189e879326d76734277469ca2f387f436fd0e922c87Doris Liu value = context.getString(R.string.unknown); 190e879326d76734277469ca2f387f436fd0e922c87Doris Liu resolutionIsValid = false; 191fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } else { 192fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling value = toLocalInteger(detail.getValue()); 193e879326d76734277469ca2f387f436fd0e922c87Doris Liu } 194e879326d76734277469ca2f387f436fd0e922c87Doris Liu break; 195e879326d76734277469ca2f387f436fd0e922c87Doris Liu case MediaDetails.INDEX_HEIGHT: { 196e879326d76734277469ca2f387f436fd0e922c87Doris Liu mHeightIndex = mItems.size(); 197fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling if (detail.getValue().toString().equalsIgnoreCase("0")) { 198e879326d76734277469ca2f387f436fd0e922c87Doris Liu value = context.getString(R.string.unknown); 199e879326d76734277469ca2f387f436fd0e922c87Doris Liu resolutionIsValid = false; 200fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } else { 201fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling value = toLocalInteger(detail.getValue()); 202e879326d76734277469ca2f387f436fd0e922c87Doris Liu } 203e879326d76734277469ca2f387f436fd0e922c87Doris Liu break; 204e879326d76734277469ca2f387f436fd0e922c87Doris Liu } 205e879326d76734277469ca2f387f436fd0e922c87Doris Liu case MediaDetails.INDEX_PATH: 2065996f43546b629a01166904943eda1f788078634Sascha Haeberling // Prepend the new-line as a) paths are usually long, so 2075996f43546b629a01166904943eda1f788078634Sascha Haeberling // the formatting is better and b) an RTL UI will see it 2085996f43546b629a01166904943eda1f788078634Sascha Haeberling // as a separate section and interpret it for what it 2095996f43546b629a01166904943eda1f788078634Sascha Haeberling // is, rather than trying to make it RTL (which messes 2105996f43546b629a01166904943eda1f788078634Sascha Haeberling // up the path). 2115996f43546b629a01166904943eda1f788078634Sascha Haeberling value = "\n" + detail.getValue().toString(); 212e879326d76734277469ca2f387f436fd0e922c87Doris Liu path = detail.getValue().toString(); 2135996f43546b629a01166904943eda1f788078634Sascha Haeberling break; 2145996f43546b629a01166904943eda1f788078634Sascha Haeberling case MediaDetails.INDEX_ISO: 2155996f43546b629a01166904943eda1f788078634Sascha Haeberling value = toLocalNumber(Integer.parseInt((String) detail.getValue())); 2165996f43546b629a01166904943eda1f788078634Sascha Haeberling break; 2175996f43546b629a01166904943eda1f788078634Sascha Haeberling case MediaDetails.INDEX_FOCAL_LENGTH: 2185996f43546b629a01166904943eda1f788078634Sascha Haeberling double focalLength = Double.parseDouble(detail.getValue().toString()); 2195996f43546b629a01166904943eda1f788078634Sascha Haeberling value = toLocalNumber(focalLength); 2205996f43546b629a01166904943eda1f788078634Sascha Haeberling break; 221fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling case MediaDetails.INDEX_ORIENTATION: 222fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling value = toLocalInteger(detail.getValue()); 223fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling break; 2244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen default: { 2254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen Object valueObj = detail.getValue(); 2264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen // This shouldn't happen, log its key to help us diagnose the problem. 227cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang if (valueObj == null) { 228cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang Utils.fail("%s's value is Null", 229cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang DetailsHelper.getDetailsName(context, detail.getKey())); 230cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang } 2314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = valueObj.toString(); 2324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen int key = detail.getKey(); 2354105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (details.hasUnit(key)) { 23602ec00b91039736d478c6e59ba90d5bbcd1a8044Owen Lin value = String.format("%s: %s %s", DetailsHelper.getDetailsName( 2374105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, key), value, context.getString(details.getUnit(key))); 2384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 23902ec00b91039736d478c6e59ba90d5bbcd1a8044Owen Lin value = String.format("%s: %s", DetailsHelper.getDetailsName( 2404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, key), value); 2414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mItems.add(value); 2435996f43546b629a01166904943eda1f788078634Sascha Haeberling } 2445996f43546b629a01166904943eda1f788078634Sascha Haeberling if (!resolutionIsValid) { 2455996f43546b629a01166904943eda1f788078634Sascha Haeberling DetailsHelper.resolveResolution(path, this); 2464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 249b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen @Override 2504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public boolean areAllItemsEnabled() { 2514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return false; 2524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 254b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen @Override 2554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public boolean isEnabled(int position) { 2564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return false; 2574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2597817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 2604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public int getCount() { 2614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mItems.size(); 2624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2647817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 2654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public Object getItem(int position) { 2664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mDetails.getDetail(position); 2674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2697817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 2704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public long getItemId(int position) { 2714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return position; 2724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2734105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2747817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 2754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public View getView(int position, View convertView, ViewGroup parent) { 2764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen TextView tv; 2774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (convertView == null) { 278b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin tv = (TextView) LayoutInflater.from(mActivity.getAndroidContext()).inflate( 2794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen R.layout.details, parent, false); 2804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 2814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen tv = (TextView) convertView; 2824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen tv.setText(mItems.get(position)); 2844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return tv; 2854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2877817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 2884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void onAddressAvailable(String address) { 2894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mItems.set(mLocationIndex, address); 290b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen notifyDataSetChanged(); 2914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 292e879326d76734277469ca2f387f436fd0e922c87Doris Liu 293e879326d76734277469ca2f387f436fd0e922c87Doris Liu @Override 294e879326d76734277469ca2f387f436fd0e922c87Doris Liu public void onResolutionAvailable(int width, int height) { 295e879326d76734277469ca2f387f436fd0e922c87Doris Liu if (width == 0 || height == 0) return; 296e879326d76734277469ca2f387f436fd0e922c87Doris Liu // Update the resolution with the new width and height 297e879326d76734277469ca2f387f436fd0e922c87Doris Liu Context context = mActivity.getAndroidContext(); 2985996f43546b629a01166904943eda1f788078634Sascha Haeberling String widthString = String.format(mDefaultLocale, "%s: %d", 2995996f43546b629a01166904943eda1f788078634Sascha Haeberling DetailsHelper.getDetailsName( 3005996f43546b629a01166904943eda1f788078634Sascha Haeberling context, MediaDetails.INDEX_WIDTH), width); 3015996f43546b629a01166904943eda1f788078634Sascha Haeberling String heightString = String.format(mDefaultLocale, "%s: %d", 3025996f43546b629a01166904943eda1f788078634Sascha Haeberling DetailsHelper.getDetailsName( 3035996f43546b629a01166904943eda1f788078634Sascha Haeberling context, MediaDetails.INDEX_HEIGHT), height); 304e879326d76734277469ca2f387f436fd0e922c87Doris Liu mItems.set(mWidthIndex, String.valueOf(widthString)); 305e879326d76734277469ca2f387f436fd0e922c87Doris Liu mItems.set(mHeightIndex, String.valueOf(heightString)); 306e879326d76734277469ca2f387f436fd0e922c87Doris Liu notifyDataSetChanged(); 307e879326d76734277469ca2f387f436fd0e922c87Doris Liu } 3085996f43546b629a01166904943eda1f788078634Sascha Haeberling 309fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling /** 310fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling * Converts the given integer (given as String or Integer object) to a 311fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling * localized String version. 312fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling */ 313fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling private String toLocalInteger(Object valueObj) { 314fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling if (valueObj instanceof Integer) { 315fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling return toLocalNumber((Integer) valueObj); 316fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } else { 317fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling String value = valueObj.toString(); 318fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling try { 319fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling value = toLocalNumber(Integer.parseInt(value)); 320fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } catch (NumberFormatException ex) { 321fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling // Just keep the current "value" if we cannot 322fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling // parse it as a fallback. 323fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } 324fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling return value; 325fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } 326fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling } 327fa2b9222725e96fdb584aca1b1213b0bda8af110Sascha Haeberling 3285996f43546b629a01166904943eda1f788078634Sascha Haeberling /** Converts the given integer to a localized String version. */ 3295996f43546b629a01166904943eda1f788078634Sascha Haeberling private String toLocalNumber(int n) { 3305996f43546b629a01166904943eda1f788078634Sascha Haeberling return String.format(mDefaultLocale, "%d", n); 3315996f43546b629a01166904943eda1f788078634Sascha Haeberling } 3325996f43546b629a01166904943eda1f788078634Sascha Haeberling 3335996f43546b629a01166904943eda1f788078634Sascha Haeberling /** Converts the given double to a localized String version. */ 3345996f43546b629a01166904943eda1f788078634Sascha Haeberling private String toLocalNumber(double n) { 3355996f43546b629a01166904943eda1f788078634Sascha Haeberling return mDecimalFormat.format(n); 3365996f43546b629a01166904943eda1f788078634Sascha Haeberling } 3374105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 3384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 3397817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 3404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void setCloseListener(CloseListener listener) { 341a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen mListener = listener; 3424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 3434105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen} 344