package com.frozendevs.periodictable.fragment; import android.content.Intent; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.util.LruCache; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.frozendevs.periodictable.PeriodicTableApplication; import com.frozendevs.periodictable.R; import com.frozendevs.periodictable.activity.PropertiesActivity; import com.frozendevs.periodictable.content.AsyncTaskLoader; import com.frozendevs.periodictable.content.Database; import com.frozendevs.periodictable.model.TableElementItem; import com.frozendevs.periodictable.model.TableItem; import com.frozendevs.periodictable.model.adapter.TableAdapter; import com.frozendevs.periodictable.view.PeriodicTableView; import java.util.List; public class TableFragment extends Fragment implements PeriodicTableView.OnItemClickListener, LoaderManager.LoaderCallbacks<List<TableElementItem>> { private static final String STATE_TABLE_ADAPTER = "tableAdapter"; private TableAdapter mAdapter; private PeriodicTableView mPeriodicTableView; private LruCache<Integer, Bitmap> mBitmapCache = new LruCache<>(1); private class SharedElementCallback extends android.support.v4.app.SharedElementCallback { @Override public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) { super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots); View view = sharedElements.get(0); ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); view.measure(View.MeasureSpec.makeMeasureSpec(layoutParams.width, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec( layoutParams.height, View.MeasureSpec.EXACTLY)); view.layout(view.getLeft(), view.getTop(), view.getLeft() + view.getMeasuredWidth(), view.getTop() + view.getMeasuredHeight()); view.setPivotX(0f); view.setPivotY(0f); view.setScaleX(mPeriodicTableView.getZoom()); view.setScaleY(mPeriodicTableView.getZoom()); } @Override public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) { super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots); View view = sharedElements.get(0); view.setScaleX(1f); view.setScaleY(1f); } } private class OnAttachStateChangeListener implements View.OnAttachStateChangeListener { @Override public void onViewAttachedToWindow(View v) { } @Override public void onViewDetachedFromWindow(View v) { final View activeView = mPeriodicTableView.getActiveView(); if (activeView != null) { activeView.setAlpha(1f); } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); if (savedInstanceState != null) { mAdapter = savedInstanceState.getParcelable(STATE_TABLE_ADAPTER); } else { mAdapter = new TableAdapter(); } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { final PeriodicTableApplication application = (PeriodicTableApplication) getActivity().getApplication(); application.setSharedElementCallback(new SharedElementCallback()); application.setOnAttachStateChangeListener(new OnAttachStateChangeListener()); } if (mAdapter.isEmpty()) { getLoaderManager().initLoader(R.id.table_loader, null, this); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.table_fragment, container, false); mPeriodicTableView = (PeriodicTableView) rootView.findViewById(R.id.elements_table); mPeriodicTableView.setBitmapCache(mBitmapCache); mPeriodicTableView.setAdapter(mAdapter); mPeriodicTableView.setOnItemClickListener(this); mPeriodicTableView.setEmptyView(rootView.findViewById(R.id.progress_bar)); return rootView; } @Override public void onItemClick(PeriodicTableView parent, View view, int position) { TableItem item = mAdapter.getItem(position); if (item instanceof TableElementItem) { parent.setEnabled(false); Intent intent = new Intent(getActivity(), PropertiesActivity.class); intent.putExtra(PropertiesActivity.EXTRA_ATOMIC_NUMBER, ((TableElementItem) item).getNumber()); ActivityCompat.startActivity(getActivity(), intent, ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), view, getString(R.string.transition_table_item)).toBundle()); } } @Override public void onResume() { if (mPeriodicTableView != null) { mPeriodicTableView.setEnabled(true); } super.onResume(); } @Override public Loader<List<TableElementItem>> onCreateLoader(int id, Bundle args) { return new AsyncTaskLoader<List<TableElementItem>>(getActivity()) { @Override public List<TableElementItem> loadInBackground() { return Database.getAllElements(getContext(), TableElementItem.class); } }; } @Override public void onLoadFinished(Loader<List<TableElementItem>> loader, List<TableElementItem> data) { mAdapter.setItems(getActivity(), data); mBitmapCache.resize(mAdapter.getCount()); mAdapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader<List<TableElementItem>> loader) { } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(STATE_TABLE_ADAPTER, mAdapter); } }