Adding better prev/next buttons, better panoramio image shower.

master
Tomasz Półgrabia 2016-08-28 13:14:26 +02:00
parent e76532780b
commit ca17290ec2
16 changed files with 322 additions and 39 deletions

1
app/images/nav_left.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 500 500" id="Layer_1" version="1.1" viewBox="0 0 500 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><circle cx="249.9" cy="250.4" r="204.7" stroke="#000000" stroke-miterlimit="10"/><circle cx="249.9" cy="250.4" fill="#FFFFFF" r="181.8" stroke="#000000" stroke-miterlimit="10"/><polyline fill="none" points=" 289.7,317.4 198,249 198,249 198,249 198,249 289.6,180.5 " stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="22"/></svg>

After

Width:  |  Height:  |  Size: 590 B

1
app/images/nav_right.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 500 500" id="Layer_1" version="1.1" viewBox="0 0 500 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><circle cx="253.9" cy="246.4" r="204.7" stroke="#000000" stroke-miterlimit="10"/><circle cx="253.9" cy="246.4" fill="#FFFFFF" r="181.8" stroke="#000000" stroke-miterlimit="10"/><polyline fill="none" points=" 214.2,313.4 305.9,245 305.9,245 305.9,245 305.9,245 214.3,176.5 " stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="22"/></svg>

After

Width:  |  Height:  |  Size: 598 B

View File

@ -9,15 +9,13 @@ import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import pl.tpolgrabia.urbanexplorer.dto.PanoramioImageInfo; import pl.tpolgrabia.urbanexplorer.dto.PanoramioImageInfo;
import pl.tpolgrabia.urbanexplorer.fragments.HomeFragment; import pl.tpolgrabia.urbanexplorer.fragments.HomeFragment;
import pl.tpolgrabia.urbanexplorer.fragments.PanoramioShowerFragment; import pl.tpolgrabia.urbanexplorer.fragments.PanoramioShowerFragment;
import pl.tpolgrabia.urbanexplorer.utils.ImageLoaderUtils;
public class MainActivity extends ActionBarActivity { public class MainActivity extends ActionBarActivity {
private static final int LOCATION_SETTINGS_REQUEST_ID = 1;
private static final String CLASS_TAG = MainActivity.class.getSimpleName(); private static final String CLASS_TAG = MainActivity.class.getSimpleName();
private static final String PHOTO_BACKSTACK = "PHOTO_BACKSTACK"; private static final String PHOTO_BACKSTACK = "PHOTO_BACKSTACK";
public static DisplayImageOptions options; public static DisplayImageOptions options;
@ -30,10 +28,7 @@ public class MainActivity extends ActionBarActivity {
// setSupportActionBar(toolbar); // setSupportActionBar(toolbar);
// UNIVERSAL IMAGE LOADER SETUP // UNIVERSAL IMAGE LOADER SETUP
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() DisplayImageOptions defaultOptions = ImageLoaderUtils.createDefaultOptions();
.cacheOnDisc(true).cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300)).build();
options = defaultOptions; options = defaultOptions;
@ -65,18 +60,12 @@ public class MainActivity extends ActionBarActivity {
public void switchToPhoto(PanoramioImageInfo photoInfo) { public void switchToPhoto(PanoramioImageInfo photoInfo) {
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentManager fragmentManager = getSupportFragmentManager();
//HomeFragment homeFragment = (HomeFragment) fragmentManager.findFragmentById(R.id.home_frag);
FragmentTransaction ctx = fragmentManager.beginTransaction(); FragmentTransaction ctx = fragmentManager.beginTransaction();
// ctx.remove(homeFragment);
// TODO add inserting photo showing fragment
PanoramioShowerFragment panoramioShower = new PanoramioShowerFragment(); PanoramioShowerFragment panoramioShower = new PanoramioShowerFragment();
Bundle arguments = new Bundle(); Bundle arguments = new Bundle();
arguments.putSerializable(PanoramioShowerFragment.PANORAMIO_PHOTO_ARG_KEY, photoInfo); arguments.putSerializable(PanoramioShowerFragment.PANORAMIO_PHOTO_ARG_KEY, photoInfo);
panoramioShower.setArguments(arguments); panoramioShower.setArguments(arguments);
// ctx.add(R.id.fragments, panoramioShower);
ctx.replace(R.id.fragments, panoramioShower); ctx.replace(R.id.fragments, panoramioShower);
ctx.addToBackStack(PHOTO_BACKSTACK); ctx.addToBackStack(PHOTO_BACKSTACK);

View File

@ -0,0 +1,10 @@
package pl.tpolgrabia.urbanexplorer.callbacks;
import org.json.JSONObject;
/**
* Created by tpolgrabia on 28.08.16.
*/
public interface PanoramioResponseCallback {
void callback(PanoramioResponseStatus status, JSONObject response);
}

View File

@ -0,0 +1,10 @@
package pl.tpolgrabia.urbanexplorer.callbacks;
/**
* Created by tpolgrabia on 28.08.16.
*/
public enum PanoramioResponseStatus {
GENERAL_ERROR,
NETWORK_ERROR,
SUCCESS
}

View File

@ -1,7 +1,6 @@
package pl.tpolgrabia.urbanexplorer.dto; package pl.tpolgrabia.urbanexplorer.dto;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* Created by tpolgrabia on 27.08.16. * Created by tpolgrabia on 27.08.16.
@ -13,8 +12,13 @@ public class PanoramioImageInfo implements Serializable{
private Long ownerId; private Long ownerId;
private String photoFileUrl; private String photoFileUrl;
private String photoTitle; private String photoTitle;
private Date uploadDate; private String uploadDate;
private Double width; private Double width;
private Double latitude;
private Double longitude;
private String ownerUrl;
private Long photoId;
private String photoUrl;
public Double getHeight() { public Double getHeight() {
return height; return height;
@ -56,11 +60,11 @@ public class PanoramioImageInfo implements Serializable{
this.photoTitle = photoTitle; this.photoTitle = photoTitle;
} }
public Date getUploadDate() { public String getUploadDate() {
return uploadDate; return uploadDate;
} }
public void setUploadDate(Date uploadDate) { public void setUploadDate(String uploadDate) {
this.uploadDate = uploadDate; this.uploadDate = uploadDate;
} }
@ -71,4 +75,44 @@ public class PanoramioImageInfo implements Serializable{
public void setWidth(Double width) { public void setWidth(Double width) {
this.width = width; this.width = width;
} }
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLatitude() {
return latitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public Double getLongitude() {
return longitude;
}
public void setOwnerUrl(String ownerUrl) {
this.ownerUrl = ownerUrl;
}
public String getOwnerUrl() {
return ownerUrl;
}
public void setPhotoId(Long photoId) {
this.photoId = photoId;
}
public Long getPhotoId() {
return photoId;
}
public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}
public String getPhotoUrl() {
return photoUrl;
}
} }

View File

@ -0,0 +1,46 @@
package pl.tpolgrabia.urbanexplorer.dto;
import java.io.Serializable;
/**
* Created by tpolgrabia on 28.08.16.
*/
public class PanoramioMapLocation implements Serializable{
private static final long serialVersionUID = -3048527017887972550L;
private Double latitude;
private Double longitude;
private Long zoom;
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public Long getZoom() {
return zoom;
}
public void setZoom(Long zoom) {
this.zoom = zoom;
}
@Override
public String toString() {
return "PanoramioMapLocation{" +
"latitude=" + latitude +
", longitude=" + longitude +
", zoom=" + zoom +
'}';
}
}

View File

@ -0,0 +1,57 @@
package pl.tpolgrabia.urbanexplorer.dto;
import java.io.Serializable;
import java.util.List;
/**
* Created by tpolgrabia on 28.08.16.
*/
public class PanoramioResponse implements Serializable{
private static final long serialVersionUID = 8840731825651350777L;
private List<PanoramioImageInfo> photos;
private Long count;
private Boolean moreAvailable;
private PanoramioMapLocation mapLocation;
public List<PanoramioImageInfo> getPhotos() {
return photos;
}
public void setPhotos(List<PanoramioImageInfo> photos) {
this.photos = photos;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public Boolean getMoreAvailable() {
return moreAvailable;
}
public void setMoreAvailable(Boolean moreAvailable) {
this.moreAvailable = moreAvailable;
}
public PanoramioMapLocation getMapLocation() {
return mapLocation;
}
public void setMapLocation(PanoramioMapLocation mapLocation) {
this.mapLocation = mapLocation;
}
@Override
public String toString() {
return "PanoramioResponse{" +
"photos=" + photos +
", count=" + count +
", moreAvailable=" + moreAvailable +
", mapLocation=" + mapLocation +
'}';
}
}

View File

@ -26,6 +26,8 @@ import pl.tpolgrabia.urbanexplorer.dto.PanoramioImageInfo;
import pl.tpolgrabia.urbanexplorer.utils.NumberUtils; import pl.tpolgrabia.urbanexplorer.utils.NumberUtils;
import pl.tpolgrabia.urbanexplorer.utils.PanoramioUtils; import pl.tpolgrabia.urbanexplorer.utils.PanoramioUtils;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import static android.content.Context.LOCATION_SERVICE; import static android.content.Context.LOCATION_SERVICE;
@ -39,6 +41,8 @@ public class HomeFragment extends Fragment implements LocationListener {
private static final long MIN_TIME = 60000; private static final long MIN_TIME = 60000;
private static final float MIN_DISTANCE = 100; private static final float MIN_DISTANCE = 100;
private static final int LOCATION_SETTINGS_REQUEST_ID = 1; private static final int LOCATION_SETTINGS_REQUEST_ID = 1;
private static final String LOCATIONS_LIST_IMAGE_SIZE = "medium";
private static final String LOCATIONS_ORDER = "popularity";
private boolean gpsLocationEnabled; private boolean gpsLocationEnabled;
private boolean networkLocationEnabled; private boolean networkLocationEnabled;
private boolean locationEnabled; private boolean locationEnabled;
@ -46,13 +50,14 @@ public class HomeFragment extends Fragment implements LocationListener {
private String locationProvider; private String locationProvider;
private boolean locationServicesActivated = false; private boolean locationServicesActivated = false;
private AQuery aq; private AQuery aq;
private View inflatedView; private View inflatedView;
private TextView pageSizeWidget; private TextView pageSizeWidget;
private TextView pageIdWidget; private TextView pageIdWidget;
private Long pageId = 1L; private Long pageId = 1L;
private ListView locations; private ListView locations;
private Button prevWidget; private ImageView prevWidget;
private Button nextWidget; private ImageView nextWidget;
private Long photosCount; private Long photosCount;
private TextView locationsResultInfo; private TextView locationsResultInfo;
@ -165,8 +170,8 @@ public class HomeFragment extends Fragment implements LocationListener {
} }
}); });
prevWidget = (Button)inflatedView.findViewById(R.id.prev); prevWidget = (ImageView)inflatedView.findViewById(R.id.prev);
nextWidget = (Button)inflatedView.findViewById(R.id.next); nextWidget = (ImageView)inflatedView.findViewById(R.id.next);
prevWidget.setOnClickListener(new View.OnClickListener() { prevWidget.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -193,6 +198,10 @@ public class HomeFragment extends Fragment implements LocationListener {
private void fetchPanoramioLocations() { private void fetchPanoramioLocations() {
fetchPanoramioPhotos();
}
private void fetchPanoramioPhotos() {
final Location location = locationService.getLastKnownLocation(locationProvider); final Location location = locationService.getLastKnownLocation(locationProvider);
Double radiusX = fetchRadiusX(); Double radiusX = fetchRadiusX();
Double radiusY = fetchRadiusY(); Double radiusY = fetchRadiusY();
@ -204,7 +213,8 @@ public class HomeFragment extends Fragment implements LocationListener {
"&miny=" + (location.getLatitude() - radiusY) + "&miny=" + (location.getLatitude() - radiusY) +
"&maxx=" + (location.getLongitude() + radiusX) + "&maxx=" + (location.getLongitude() + radiusX) +
"&maxy=" + (location.getLatitude() + radiusX) + "&maxy=" + (location.getLatitude() + radiusX) +
"&size=medium" + "&size=" + LOCATIONS_LIST_IMAGE_SIZE +
"&order=" + LOCATIONS_ORDER +
"&mapfilter=true"; "&mapfilter=true";
Log.d(CLASS_TAG, "Query: " + aqQuery); Log.d(CLASS_TAG, "Query: " + aqQuery);
aq.ajax(aqQuery, aq.ajax(aqQuery,
@ -219,8 +229,13 @@ public class HomeFragment extends Fragment implements LocationListener {
return; return;
} }
List<PanoramioImageInfo> photosInfos = List<PanoramioImageInfo> photosInfos;
PanoramioUtils.fetchPanoramioImagesFromResponse(object); try {
photosInfos = PanoramioUtils.fetchPanoramioImagesFromResponse(object.getJSONArray("photos"));
} catch (ParseException e) {
Log.w(CLASS_TAG, "Parse exception", e);
photosInfos = new ArrayList<>();
}
photosCount = PanoramioUtils.fetchPanoramioImagesCountFromResponse(object); photosCount = PanoramioUtils.fetchPanoramioImagesCountFromResponse(object);
locationsResultInfo = (TextView)inflatedView.findViewById(R.id.locations_result_info); locationsResultInfo = (TextView)inflatedView.findViewById(R.id.locations_result_info);

View File

@ -22,6 +22,10 @@ public class PanoramioShowerFragment extends Fragment {
public static final String PANORAMIO_PHOTO_ARG_KEY = "PANORAMIO_PHOTO_ARG_KEY"; public static final String PANORAMIO_PHOTO_ARG_KEY = "PANORAMIO_PHOTO_ARG_KEY";
private TextView photoTitle; private TextView photoTitle;
private TextView photoUploadDate;
private TextView photoAuthor;
private TextView photoUrl;
private TextView photoLocation;
public PanoramioShowerFragment() { public PanoramioShowerFragment() {
// Required empty public constructor // Required empty public constructor
@ -47,8 +51,21 @@ public class PanoramioShowerFragment extends Fragment {
(ImageView) inflatedView.findViewById(R.id.photo_container), (ImageView) inflatedView.findViewById(R.id.photo_container),
MainActivity.options); MainActivity.options);
photoTitle = (TextView)inflatedView.findViewById(R.id.phot_title); photoTitle = (TextView)inflatedView.findViewById(R.id.photo_title);
photoTitle.setText(imageInfo.getPhotoTitle()); photoTitle.setText(imageInfo.getPhotoTitle());
photoUploadDate = (TextView)inflatedView.findViewById(R.id.photo_upload);
photoUploadDate.setText(imageInfo.getUploadDate());
photoAuthor = (TextView)inflatedView.findViewById(R.id.photo_author);
photoAuthor.setText(imageInfo.getOwnerName());
photoUrl = (TextView)inflatedView.findViewById(R.id.photo_url);
photoUrl.setText(imageInfo.getPhotoUrl());
photoLocation = (TextView)inflatedView.findViewById(R.id.photo_location);
photoLocation.setText(imageInfo.getLatitude() + "," + imageInfo.getLongitude());
} }
return inflatedView; return inflatedView;

View File

@ -0,0 +1,17 @@
package pl.tpolgrabia.urbanexplorer.utils;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
/**
* Created by tpolgrabia on 28.08.16.
*/
public class ImageLoaderUtils {
public static DisplayImageOptions createDefaultOptions() {
return new DisplayImageOptions.Builder()
.cacheOnDisc(true).cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300)).build();
}
}

View File

@ -4,8 +4,12 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import pl.tpolgrabia.urbanexplorer.dto.PanoramioImageInfo; import pl.tpolgrabia.urbanexplorer.dto.PanoramioImageInfo;
import pl.tpolgrabia.urbanexplorer.dto.PanoramioMapLocation;
import pl.tpolgrabia.urbanexplorer.dto.PanoramioResponse;
import pl.tpolgrabia.urbanexplorer.exceptions.PanoramioResponseNotExpected; import pl.tpolgrabia.urbanexplorer.exceptions.PanoramioResponseNotExpected;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -14,12 +18,22 @@ import java.util.List;
*/ */
public class PanoramioUtils { public class PanoramioUtils {
public static PanoramioImageInfo fetchPanoramioDto(JSONObject photo) throws JSONException { private static SimpleDateFormat panoramioDateFormatter = new SimpleDateFormat("dd MMMMMMMMMMMMMM yyyy");
public static PanoramioImageInfo fetchPanoramioDto(JSONObject photo) throws JSONException, ParseException {
PanoramioImageInfo info = new PanoramioImageInfo(); PanoramioImageInfo info = new PanoramioImageInfo();
info.setPhotoTitle(photo.getString("photo_title")); info.setPhotoTitle(photo.getString("photo_title"));
info.setPhotoFileUrl(photo.getString("photo_file_url")); info.setPhotoFileUrl(photo.getString("photo_file_url"));
info.setWidth(photo.getDouble("width")); info.setWidth(photo.getDouble("width"));
info.setHeight(photo.getDouble("height")); info.setHeight(photo.getDouble("height"));
info.setLatitude(photo.getDouble("latitude"));
info.setLongitude(photo.getDouble("longitude"));
info.setOwnerId(photo.getLong("owner_id"));
info.setOwnerName(photo.getString("owner_name"));
info.setOwnerUrl(photo.getString("owner_url"));
info.setPhotoId(photo.getLong("photo_id"));
info.setPhotoUrl(photo.getString("photo_url"));
info.setUploadDate(photo.getString("upload_date"));
return info; return info;
} }
@ -31,14 +45,13 @@ public class PanoramioUtils {
} }
} }
public static List<PanoramioImageInfo> fetchPanoramioImagesFromResponse(JSONObject object) throws JSONException { public static List<PanoramioImageInfo> fetchPanoramioImagesFromResponse(JSONArray photos) throws JSONException, ParseException {
JSONArray photos = object.getJSONArray("photos");
if (photos == null) { if (photos == null) {
throw new PanoramioResponseNotExpected("Panoramio response doesn't contain phots"); throw new PanoramioResponseNotExpected("photos arg cannot be null");
} }
List<PanoramioImageInfo> photosInfos = new ArrayList<PanoramioImageInfo>(); List<PanoramioImageInfo> photosInfos = new ArrayList<>();
int n = photos.length(); int n = photos.length();
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
photosInfos.add( photosInfos.add(
@ -48,4 +61,23 @@ public class PanoramioUtils {
return photosInfos; return photosInfos;
} }
public static PanoramioResponse fetchPanoramioResponse(JSONObject panoramioResponse) throws JSONException, ParseException {
PanoramioResponse response = new PanoramioResponse();
response.setCount(panoramioResponse.getLong("count"));
response.setMoreAvailable(panoramioResponse.getBoolean("has_more"));
response.setPhotos(fetchPanoramioImagesFromResponse(panoramioResponse.getJSONArray("photos")));
response.setMapLocation(fetchPanoramioLocation(panoramioResponse.getJSONObject("map_location")));
return response;
}
private static PanoramioMapLocation fetchPanoramioLocation(JSONObject mapLocation) throws JSONException {
PanoramioMapLocation location = new PanoramioMapLocation();
location.setLatitude(mapLocation.getDouble("lat"));
location.setLongitude(mapLocation.getDouble("lon"));
location.setZoom(mapLocation.getLong("panoramio_zoom"));
return location;
}
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -54,10 +54,10 @@
<LinearLayout android:layout_width="match_parent" <LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center"> android:gravity="center">
<Button android:id="@+id/prev" <ImageView android:id="@+id/prev"
android:layout_width="wrap_content" android:layout_width="64dp"
android:layout_height="match_parent" android:layout_height="64dp"
android:text="Prev"/> android:background="@drawable/nav_left"/>
<EditText <EditText
android:id="@+id/locations_page_id" android:id="@+id/locations_page_id"
@ -73,10 +73,10 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="10"/> android:text="10"/>
<Button android:id="@+id/next" <ImageView android:id="@+id/next"
android:layout_width="wrap_content" android:layout_width="64dp"
android:layout_height="match_parent" android:layout_height="64dp"
android:text="Next"/> android:background="@drawable/nav_right"/>
</LinearLayout> </LinearLayout>
<Button android:id="@+id/update_places" <Button android:id="@+id/update_places"

View File

@ -15,7 +15,51 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Title: "/> android:text="Title: "/>
<TextView android:id="@+id/phot_title" <TextView android:id="@+id/photo_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Author: "/>
<TextView android:id="@+id/photo_author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Upload date: "/>
<TextView android:id="@+id/photo_upload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Location: "/>
<TextView android:id="@+id/photo_location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Panoramio url"/>
<TextView android:id="@+id/photo_url"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>
</LinearLayout> </LinearLayout>