/* * 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.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.CursorAdapter; import android.widget.ListView; import com.android.messaging.util.ImeUtil; /** * Produces and holds a list view and its tab header to be displayed in a ViewPager. */ public abstract class CustomHeaderPagerListViewHolder extends BasePagerViewHolder implements CustomHeaderPagerViewHolder { private final Context mContext; private final CursorAdapter mListAdapter; private boolean mListCursorInitialized; private ListView mListView; public CustomHeaderPagerListViewHolder(final Context context, final CursorAdapter adapter) { mContext = context; mListAdapter = adapter; } @Override protected View createView(ViewGroup container) { final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View view = inflater.inflate( getLayoutResId(), null /* root */, false /* attachToRoot */); final ListView listView = (ListView) view.findViewById(getListViewResId()); listView.setAdapter(mListAdapter); listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(final AbsListView view, final int scrollState) { if (scrollState != SCROLL_STATE_IDLE) { ImeUtil.get().hideImeKeyboard(mContext, view); } } @Override public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { } }); mListView = listView; maybeSetEmptyView(); return view; } public void onContactsCursorUpdated(final Cursor data) { mListAdapter.swapCursor(data); if (!mListCursorInitialized) { // We set the emptyView here instead of in create so that the initial load won't show // the empty UI - the system handles this and doesn't do what we would like. mListCursorInitialized = true; maybeSetEmptyView(); } } /** * We don't want to show the empty view hint until BOTH conditions are met: * 1. The view has been created. * 2. Cursor data has been loaded once. * Due to timing when data is loaded, the view may not be ready (and vice versa). So we * are calling this method from both onContactsCursorUpdated & createView. */ private void maybeSetEmptyView() { if (mView != null && mListCursorInitialized) { final ListEmptyView emptyView = (ListEmptyView) mView.findViewById(getEmptyViewResId()); if (emptyView != null) { emptyView.setTextHint(getEmptyViewTitleResId()); emptyView.setImageHint(getEmptyViewImageResId()); final ListView listView = (ListView) mView.findViewById(getListViewResId()); listView.setEmptyView(emptyView); } } } public void invalidateList() { mListAdapter.notifyDataSetChanged(); } /** * In order for scene transition to work, we toggle the visibility for each individual list * view items so that they can be properly tracked by the scene transition manager. * @param show whether the pending transition is to show or hide the list. */ public void toggleVisibilityForPendingTransition(final boolean show, final View epicenterView) { if (mListView == null) { return; } final int childCount = mListView.getChildCount(); for (int i = 0; i < childCount; i++) { final View childView = mListView.getChildAt(i); if (childView != epicenterView) { childView.setVisibility(show ? View.VISIBLE : View.INVISIBLE); } } } @Override public CharSequence getPageTitle(Context context) { return context.getString(getPageTitleResId()); } protected abstract int getLayoutResId(); protected abstract int getPageTitleResId(); protected abstract int getEmptyViewResId(); protected abstract int getEmptyViewTitleResId(); protected abstract int getEmptyViewImageResId(); protected abstract int getListViewResId(); }