DialogDetailsView.java revision b5bc8833b142985652a0438ae7d64ff5477b590e
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.Activity; 204105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.app.AlertDialog; 214105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.app.Dialog; 224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.content.Context; 234105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.content.DialogInterface; 24a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chenimport android.content.DialogInterface.OnDismissListener; 254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.text.format.Formatter; 264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.view.LayoutInflater; 274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.view.View; 284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.view.ViewGroup; 294105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.widget.BaseAdapter; 30a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millarimport android.widget.ListView; 314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport android.widget.TextView; 324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 33b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.R; 34b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.app.GalleryActivity; 35b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.common.Utils; 36b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.data.MediaDetails; 37b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsAddressResolver.AddressResolvingListener; 38b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 39b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 40b5bc8833b142985652a0438ae7d64ff5477b590eRay Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsViewContainer; 41b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen 424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport java.util.ArrayList; 434105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport java.util.Map.Entry; 444105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenpublic class DialogDetailsView implements DetailsViewContainer { 464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen @SuppressWarnings("unused") 474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private static final String TAG = "DialogDetailsView"; 484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 49b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private final GalleryActivity mContext; 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsAdapter mAdapter; 514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private MediaDetails mDetails; 52b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private final DetailsSource mSource; 534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private int mIndex; 544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private Dialog mDialog; 55a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen private CloseListener mListener; 564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public DialogDetailsView(GalleryActivity activity, DetailsSource source) { 584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mContext = activity; 594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mSource = source; 604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void show() { 634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen reloadDetails(mSource.getIndex()); 644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog.show(); 654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void hide() { 684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog.hide(); 694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void reloadDetails(int indexHint) { 724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen int index = mSource.findIndex(indexHint); 734105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (index == -1) return; 744105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen MediaDetails details = mSource.getDetails(); 754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (details != null) { 764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mIndex == index && mDetails == details) return; 774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex = index; 784105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetails = details; 794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen setDetails(details); 804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public boolean isVisible() { 844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mDialog.isShowing(); 854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 874105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private void setDetails(MediaDetails details) { 884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mAdapter = new DetailsAdapter(details); 894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String title = String.format( 904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mContext.getAndroidContext().getString(R.string.details_title), 914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex + 1, mSource.size()); 92a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar ListView detailsList = (ListView) LayoutInflater.from(mContext.getAndroidContext()).inflate( 93a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar R.layout.details_list, null, false); 94a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar detailsList.setAdapter(mAdapter); 954105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog = new AlertDialog.Builder((Activity) mContext) 96a29127be09f74782dee7d6c18cf6dd50728652aaEvan Millar .setView(detailsList) 974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen .setTitle(title) 984105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen .setPositiveButton(R.string.close, new DialogInterface.OnClickListener() { 994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void onClick(DialogInterface dialog, int whichButton) { 1004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDialog.dismiss(); 1014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen }) 1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen .create(); 104a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen 105a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen mDialog.setOnDismissListener(new OnDismissListener() { 106a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen public void onDismiss(DialogInterface dialog) { 107a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen if (mListener != null) { 108a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen mListener.onClose(); 109a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen } 110a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen } 111a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen }); 1124105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 1144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private class DetailsAdapter extends BaseAdapter implements AddressResolvingListener { 115b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private final ArrayList<String> mItems; 116b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen private int mLocationIndex; 1174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 1184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public DetailsAdapter(MediaDetails details) { 1194105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen Context context = mContext.getAndroidContext(); 1204105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mItems = new ArrayList<String>(details.size()); 1214105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mLocationIndex = -1; 1224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen setDetails(context, details); 1234105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 1254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private void setDetails(Context context, MediaDetails details) { 1264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen for (Entry<Integer, Object> detail : details) { 1274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen String value; 1284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen switch (detail.getKey()) { 1294105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_LOCATION: { 1304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen double[] latlng = (double[]) detail.getValue(); 1314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mLocationIndex = mItems.size(); 132924a510c32087410cd8e922a915c0486feb6790dRay Chen value = DetailsHelper.resolveAddress(mContext, latlng, this); 1334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1354105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_SIZE: { 1364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = Formatter.formatFileSize( 1374105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, (Long) detail.getValue()); 1384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1394105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_WHITE_BALANCE: { 1414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = "1".equals(detail.getValue()) 1424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen ? context.getString(R.string.manual) 1434105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen : context.getString(R.string.auto); 1444105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_FLASH: { 1474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen MediaDetails.FlashState flash = 1484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen (MediaDetails.FlashState) detail.getValue(); 1494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen // TODO: camera doesn't fill in the complete values, show more information 1504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen // when it is fixed. 1514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (flash.isFlashFired()) { 1524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = context.getString(R.string.flash_on); 1534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 1544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = context.getString(R.string.flash_off); 1554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen case MediaDetails.INDEX_EXPOSURE_TIME: { 1594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = (String) detail.getValue(); 1604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen double time = Double.valueOf(value); 1614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (time < 1.0f) { 1624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = String.format("1/%d", (int) (0.5f + 1 / time)); 1634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 1644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen int integer = (int) time; 1654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen time -= integer; 1664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = String.valueOf(integer) + "''"; 1674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (time > 0.0001) { 1684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value += String.format(" 1/%d", (int) (0.5f + 1 / time)); 1694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1714105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen break; 1724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1734105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen default: { 1744105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen Object valueObj = detail.getValue(); 1754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen // This shouldn't happen, log its key to help us diagnose the problem. 1764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen Utils.assertTrue(valueObj != null, "%s's value is Null", 1774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.getDetailsName(context, detail.getKey())); 1784105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = valueObj.toString(); 1794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen int key = detail.getKey(); 1824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (details.hasUnit(key)) { 1834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = String.format("%s : %s %s", DetailsHelper.getDetailsName( 1844105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, key), value, context.getString(details.getUnit(key))); 1854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 1864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen value = String.format("%s : %s", DetailsHelper.getDetailsName( 1874105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen context, key), value); 1884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mItems.add(value); 1904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 193b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen @Override 1944105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public boolean areAllItemsEnabled() { 1954105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return false; 1964105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 198b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen @Override 1994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public boolean isEnabled(int position) { 2004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return false; 2014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public int getCount() { 2044105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mItems.size(); 2054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public Object getItem(int position) { 2084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mDetails.getDetail(position); 2094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2114105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public long getItemId(int position) { 2124105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return position; 2134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public View getView(int position, View convertView, ViewGroup parent) { 2164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen TextView tv; 2174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (convertView == null) { 2184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen tv = (TextView) LayoutInflater.from(mContext.getAndroidContext()).inflate( 2194105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen R.layout.details, parent, false); 2204105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } else { 2214105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen tv = (TextView) convertView; 2224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2234105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen tv.setText(mItems.get(position)); 2244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return tv; 2254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void onAddressAvailable(String address) { 2284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mItems.set(mLocationIndex, address); 229b5bc8833b142985652a0438ae7d64ff5477b590eRay Chen notifyDataSetChanged(); 2304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 2334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public void setCloseListener(CloseListener listener) { 234a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen mListener = listener; 2354105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 2364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen} 237