1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.gallery3d.ui; 17 18 import android.content.Context; 19 import android.graphics.Bitmap; 20 import android.graphics.BitmapFactory; 21 import android.view.View.MeasureSpec; 22 23 import com.android.gallery3d.R; 24 import com.android.gallery3d.app.AbstractGalleryActivity; 25 import com.android.gallery3d.data.MediaDetails; 26 import com.android.gallery3d.ui.DetailsAddressResolver.AddressResolvingListener; 27 28 public class DetailsHelper { 29 private static DetailsAddressResolver sAddressResolver; 30 private DetailsViewContainer mContainer; 31 32 public interface DetailsSource { size()33 public int size(); setIndex()34 public int setIndex(); getDetails()35 public MediaDetails getDetails(); 36 } 37 38 public interface CloseListener { onClose()39 public void onClose(); 40 } 41 42 public interface DetailsViewContainer { reloadDetails()43 public void reloadDetails(); setCloseListener(CloseListener listener)44 public void setCloseListener(CloseListener listener); show()45 public void show(); hide()46 public void hide(); 47 } 48 49 public interface ResolutionResolvingListener { onResolutionAvailable(int width, int height)50 public void onResolutionAvailable(int width, int height); 51 } 52 DetailsHelper(AbstractGalleryActivity activity, GLView rootPane, DetailsSource source)53 public DetailsHelper(AbstractGalleryActivity activity, GLView rootPane, DetailsSource source) { 54 mContainer = new DialogDetailsView(activity, source); 55 } 56 layout(int left, int top, int right, int bottom)57 public void layout(int left, int top, int right, int bottom) { 58 if (mContainer instanceof GLView) { 59 GLView view = (GLView) mContainer; 60 view.measure(MeasureSpec.UNSPECIFIED, 61 MeasureSpec.makeMeasureSpec(bottom - top, MeasureSpec.AT_MOST)); 62 view.layout(0, top, view.getMeasuredWidth(), top + view.getMeasuredHeight()); 63 } 64 } 65 reloadDetails()66 public void reloadDetails() { 67 mContainer.reloadDetails(); 68 } 69 setCloseListener(CloseListener listener)70 public void setCloseListener(CloseListener listener) { 71 mContainer.setCloseListener(listener); 72 } 73 resolveAddress(AbstractGalleryActivity activity, double[] latlng, AddressResolvingListener listener)74 public static String resolveAddress(AbstractGalleryActivity activity, double[] latlng, 75 AddressResolvingListener listener) { 76 if (sAddressResolver == null) { 77 sAddressResolver = new DetailsAddressResolver(activity); 78 } else { 79 sAddressResolver.cancel(); 80 } 81 return sAddressResolver.resolveAddress(latlng, listener); 82 } 83 resolveResolution(String path, ResolutionResolvingListener listener)84 public static void resolveResolution(String path, ResolutionResolvingListener listener) { 85 Bitmap bitmap = BitmapFactory.decodeFile(path); 86 if (bitmap == null) return; 87 listener.onResolutionAvailable(bitmap.getWidth(), bitmap.getHeight()); 88 } 89 pause()90 public static void pause() { 91 if (sAddressResolver != null) sAddressResolver.cancel(); 92 } 93 show()94 public void show() { 95 mContainer.show(); 96 } 97 hide()98 public void hide() { 99 mContainer.hide(); 100 } 101 getDetailsName(Context context, int key)102 public static String getDetailsName(Context context, int key) { 103 switch (key) { 104 case MediaDetails.INDEX_TITLE: 105 return context.getString(R.string.title); 106 case MediaDetails.INDEX_DESCRIPTION: 107 return context.getString(R.string.description); 108 case MediaDetails.INDEX_DATETIME: 109 return context.getString(R.string.time); 110 case MediaDetails.INDEX_LOCATION: 111 return context.getString(R.string.location); 112 case MediaDetails.INDEX_PATH: 113 return context.getString(R.string.path); 114 case MediaDetails.INDEX_WIDTH: 115 return context.getString(R.string.width); 116 case MediaDetails.INDEX_HEIGHT: 117 return context.getString(R.string.height); 118 case MediaDetails.INDEX_ORIENTATION: 119 return context.getString(R.string.orientation); 120 case MediaDetails.INDEX_DURATION: 121 return context.getString(R.string.duration); 122 case MediaDetails.INDEX_MIMETYPE: 123 return context.getString(R.string.mimetype); 124 case MediaDetails.INDEX_SIZE: 125 return context.getString(R.string.file_size); 126 case MediaDetails.INDEX_MAKE: 127 return context.getString(R.string.maker); 128 case MediaDetails.INDEX_MODEL: 129 return context.getString(R.string.model); 130 case MediaDetails.INDEX_FLASH: 131 return context.getString(R.string.flash); 132 case MediaDetails.INDEX_APERTURE: 133 return context.getString(R.string.aperture); 134 case MediaDetails.INDEX_FOCAL_LENGTH: 135 return context.getString(R.string.focal_length); 136 case MediaDetails.INDEX_WHITE_BALANCE: 137 return context.getString(R.string.white_balance); 138 case MediaDetails.INDEX_EXPOSURE_TIME: 139 return context.getString(R.string.exposure_time); 140 case MediaDetails.INDEX_ISO: 141 return context.getString(R.string.iso); 142 default: 143 return "Unknown key" + key; 144 } 145 } 146 } 147 148 149