/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.activityscenetransitionbasic; import com.squareup.picasso.Picasso; import android.app.Activity; import android.os.Build; import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.transition.Transition; import android.widget.ImageView; import android.widget.TextView; /** * Our secondary Activity which is launched from {@link MainActivity}. Has a simple detail UI * which has a large banner image, title and body text. */ public class DetailActivity extends Activity { // Extra name for the ID parameter public static final String EXTRA_PARAM_ID = "detail:_id"; // View name of the header image. Used for activity scene transitions public static final String VIEW_NAME_HEADER_IMAGE = "detail:header:image"; // View name of the header title. Used for activity scene transitions public static final String VIEW_NAME_HEADER_TITLE = "detail:header:title"; private ImageView mHeaderImageView; private TextView mHeaderTitle; private Item mItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.details); // Retrieve the correct Item instance, using the ID provided in the Intent mItem = Item.getItem(getIntent().getIntExtra(EXTRA_PARAM_ID, 0)); mHeaderImageView = (ImageView) findViewById(R.id.imageview_header); mHeaderTitle = (TextView) findViewById(R.id.textview_title); // BEGIN_INCLUDE(detail_set_view_name) /** * Set the name of the view's which will be transition to, using the static values above. * This could be done in the layout XML, but exposing it via static variables allows easy * querying from other Activities */ ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE); ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE); // END_INCLUDE(detail_set_view_name) loadItem(); } private void loadItem() { // Set the title TextView to the item's name and author mHeaderTitle.setText(getString(R.string.image_header, mItem.getName(), mItem.getAuthor())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && addTransitionListener()) { // If we're running on Lollipop and we have added a listener to the shared element // transition, load the thumbnail. The listener will load the full-size image when // the transition is complete. loadThumbnail(); } else { // If all other cases we should just load the full-size image now loadFullSizeImage(); } } /** * Load the item's thumbnail image into our {@link ImageView}. */ private void loadThumbnail() { Picasso.with(mHeaderImageView.getContext()) .load(mItem.getThumbnailUrl()) .noFade() .into(mHeaderImageView); } /** * Load the item's full-size image into our {@link ImageView}. */ private void loadFullSizeImage() { Picasso.with(mHeaderImageView.getContext()) .load(mItem.getPhotoUrl()) .noFade() .noPlaceholder() .into(mHeaderImageView); } /** * Try and add a {@link Transition.TransitionListener} to the entering shared element * {@link Transition}. We do this so that we can load the full-size image after the transition * has completed. * * @return true if we were successful in adding a listener to the enter transition */ private boolean addTransitionListener() { final Transition transition = getWindow().getSharedElementEnterTransition(); if (transition != null) { // There is an entering shared element transition so add a listener to it transition.addListener(new Transition.TransitionListener() { @Override public void onTransitionEnd(Transition transition) { // As the transition has ended, we can now load the full-size image loadFullSizeImage(); // Make sure we remove ourselves as a listener transition.removeListener(this); } @Override public void onTransitionStart(Transition transition) { // No-op } @Override public void onTransitionCancel(Transition transition) { // Make sure we remove ourselves as a listener transition.removeListener(this); } @Override public void onTransitionPause(Transition transition) { // No-op } @Override public void onTransitionResume(Transition transition) { // No-op } }); return true; } // If we reach here then we have not added a listener return false; } }