| /* |
| * 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; |
| } |
| |
| } |