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