| /* |
| * Copyright (C) 2015 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.android.messaging.ui; |
| |
| import android.os.Parcelable; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| /** |
| * The base pager view holder implementation that handles basic view creation/destruction logic, |
| * as well as logic to save/restore instance state that's persisted not only for activity |
| * reconstruction (e.g. during a configuration change), but also cases where the individual |
| * page view gets destroyed and recreated. |
| * |
| * To opt into saving/restoring instance state behavior for a particular page view, let the |
| * PageView implement PersistentInstanceState to save and restore instance states to/from a |
| * Parcelable. |
| */ |
| public abstract class BasePagerViewHolder implements PagerViewHolder { |
| protected View mView; |
| protected Parcelable mSavedState; |
| |
| /** |
| * This is called when the entire view pager is being torn down (due to configuration change |
| * for example) that will be restored later. |
| */ |
| @Override |
| public Parcelable saveState() { |
| savePendingState(); |
| return mSavedState; |
| } |
| |
| /** |
| * This is called when the view pager is being restored. |
| */ |
| @Override |
| public void restoreState(final Parcelable restoredState) { |
| if (restoredState != null) { |
| mSavedState = restoredState; |
| // If the view is already there, let it restore the state. Otherwise, it will be |
| // restored the next time the view gets created. |
| restorePendingState(); |
| } |
| } |
| |
| @Override |
| public void resetState() { |
| mSavedState = null; |
| if (mView != null && (mView instanceof PersistentInstanceState)) { |
| ((PersistentInstanceState) mView).resetState(); |
| } |
| } |
| |
| /** |
| * This is called when the view itself is being torn down. This may happen when the user |
| * has flipped to another page in the view pager, so we want to save the current state if |
| * possible. |
| */ |
| @Override |
| public View destroyView() { |
| savePendingState(); |
| final View retView = mView; |
| mView = null; |
| return retView; |
| } |
| |
| @Override |
| public View getView(ViewGroup container) { |
| if (mView == null) { |
| mView = createView(container); |
| // When initially created, check if the view has any saved state. If so restore it. |
| restorePendingState(); |
| } |
| return mView; |
| } |
| |
| private void savePendingState() { |
| if (mView != null && (mView instanceof PersistentInstanceState)) { |
| mSavedState = ((PersistentInstanceState) mView).saveState(); |
| } |
| } |
| |
| private void restorePendingState() { |
| if (mView != null && (mView instanceof PersistentInstanceState) && (mSavedState != null)) { |
| ((PersistentInstanceState) mView).restoreState(mSavedState); |
| } |
| } |
| |
| /** |
| * Create and initialize a new page view. |
| */ |
| protected abstract View createView(ViewGroup container); |
| } |