Skip to content
This repository has been archived by the owner on Jan 23, 2021. It is now read-only.

Commit

Permalink
Better transition and data handling
Browse files Browse the repository at this point in the history
* Introduce data binding
* Fix orientation change transition

Change-Id: I913dfc86e96ba4f2df1c0971aaa1d753ebb76498
  • Loading branch information
keyboardsurfer committed Jun 21, 2016
1 parent 5d363fd commit 0ecd2c7
Show file tree
Hide file tree
Showing 11 changed files with 162 additions and 115 deletions.
6 changes: 5 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@
apply plugin: 'com.android.application'

android {
buildToolsVersion "23.0.2"
buildToolsVersion "23.0.3"
compileSdkVersion 23

dataBinding {
enabled = true
}

defaultConfig {
applicationId "com.google.samples.apps.topeka"
minSdkVersion 14
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
Expand All @@ -36,6 +37,7 @@
import android.widget.TextView;

import com.google.samples.apps.topeka.R;
import com.google.samples.apps.topeka.databinding.ActivityCategorySelectionBinding;
import com.google.samples.apps.topeka.fragment.CategorySelectionFragment;
import com.google.samples.apps.topeka.helper.ApiLevelHelper;
import com.google.samples.apps.topeka.helper.PreferencesHelper;
Expand Down Expand Up @@ -67,8 +69,8 @@ static Intent getStartIntent(Context context, Player player) {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_category_selection);
ActivityCategorySelectionBinding binding = DataBindingUtil
.setContentView(this, R.layout.activity_category_selection);
Player player = getIntent().getParcelableExtra(EXTRA_PLAYER);
if (!PreferencesHelper.isSignedIn(this)) {
if (player == null) {
Expand All @@ -77,7 +79,8 @@ protected void onCreate(Bundle savedInstanceState) {
PreferencesHelper.writeToPreferences(this, player);
}
}
setUpToolbar(player);
binding.setPlayer(player);
setUpToolbar();
if (savedInstanceState == null) {
attachCategoryGridFragment();
} else {
Expand All @@ -94,15 +97,11 @@ protected void onResume() {
scoreView.setText(getString(R.string.x_points, score));
}

private void setUpToolbar(Player player) {
private void setUpToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_player);
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayShowTitleEnabled(false);
final AvatarView avatarView = (AvatarView) toolbar.findViewById(R.id.avatar);
avatarView.setAvatar(player.getAvatar().getDrawableId());
//noinspection PrivateResource
((TextView) toolbar.findViewById(R.id.title)).setText(getDisplayName(player));
}

@Override
Expand Down Expand Up @@ -142,11 +141,6 @@ private void signOut() {
ActivityCompat.finishAfterTransition(this);
}

private String getDisplayName(Player player) {
return getString(R.string.player_display_name, player.getFirstName(),
player.getLastInitial());
}

private void attachCategoryGridFragment() {
FragmentManager supportFragmentManager = getSupportFragmentManager();
Fragment fragment = supportFragmentManager.findFragmentById(R.id.category_container);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public class QuizActivity extends AppCompatActivity {
private View mToolbarBack;


final View.OnClickListener mOnClickListener = new View.OnClickListener() {
private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
switch (v.getId()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import android.app.Activity;
import android.content.res.Resources;
import android.databinding.DataBindingUtil;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
Expand All @@ -30,12 +31,11 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.samples.apps.topeka.R;
import com.google.samples.apps.topeka.databinding.ItemCategoryBinding;
import com.google.samples.apps.topeka.helper.ApiLevelHelper;
import com.google.samples.apps.topeka.model.Category;
import com.google.samples.apps.topeka.model.Theme;
import com.google.samples.apps.topeka.persistence.TopekaDatabaseHelper;

import java.util.List;
Expand Down Expand Up @@ -66,23 +66,24 @@ public CategoryAdapter(Activity activity) {

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(mLayoutInflater
.inflate(R.layout.item_category, parent, false));
return new ViewHolder((ItemCategoryBinding) DataBindingUtil
.inflate(mLayoutInflater, R.layout.item_category, parent, false));
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
public void onBindViewHolder(final ViewHolder holder, final int position) {
ItemCategoryBinding binding = holder.getBinding();
Category category = mCategories.get(position);
Theme theme = category.getTheme();
setCategoryIcon(category, holder.icon);
holder.itemView.setBackgroundColor(getColor(theme.getWindowBackgroundColor()));
holder.title.setText(category.getName());
holder.title.setTextColor(getColor(theme.getTextPrimaryColor()));
holder.title.setBackgroundColor(getColor(theme.getPrimaryColor()));
binding.setCategory(category);
binding.executePendingBindings();
setCategoryIcon(category, binding.categoryIcon);
holder.itemView.setBackgroundColor(getColor(category.getTheme().getWindowBackgroundColor()));
binding.categoryTitle.setTextColor(getColor(category.getTheme().getTextPrimaryColor()));
binding.categoryTitle.setBackgroundColor(getColor(category.getTheme().getPrimaryColor()));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onClick(v, position);
mOnItemClickListener.onClick(v, holder.getAdapterPosition());
}
});
}
Expand Down Expand Up @@ -207,13 +208,15 @@ private int getColor(@ColorRes int colorRes) {

static class ViewHolder extends RecyclerView.ViewHolder {

final ImageView icon;
final TextView title;
private ItemCategoryBinding mBinding;

public ViewHolder(View container) {
super(container);
icon = (ImageView) container.findViewById(R.id.category_icon);
title = (TextView) container.findViewById(R.id.category_title);
public ViewHolder(ItemCategoryBinding binding) {
super(binding.getRoot());
mBinding = binding;
}

public ItemCategoryBinding getBinding() {
return mBinding;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;

import com.google.samples.apps.topeka.R;
import com.google.samples.apps.topeka.activity.QuizActivity;
Expand Down Expand Up @@ -57,7 +58,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}

private void setUpQuizGrid(RecyclerView categoriesView) {
private void setUpQuizGrid(final RecyclerView categoriesView) {
final int spacing = getContext().getResources()
.getDimensionPixelSize(R.dimen.spacing_nano);
categoriesView.addItemDecoration(new OffsetDecoration(spacing));
Expand All @@ -73,12 +74,15 @@ public void onClick(View v, int position) {
}
});
categoriesView.setAdapter(mAdapter);
}

@Override
public void onResume() {
getActivity().supportStartPostponedEnterTransition();
super.onResume();
categoriesView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
categoriesView.getViewTreeObserver().removeOnPreDrawListener(this);
getActivity().supportStartPostponedEnterTransition();
return true;
}
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
Expand Down Expand Up @@ -53,6 +54,12 @@ public AvatarView(Context context, AttributeSet attrs) {

public AvatarView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AvatarView, defStyle, 0);
try {
setAvatar(a.getResourceId(R.styleable.AvatarView_avatar, 0));
} finally {
a.recycle();
}
}

@Override
Expand Down
110 changes: 59 additions & 51 deletions app/src/main/res/layout/activity_category_selection.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,63 +13,71 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<layout>
<data>
<variable name="player" type="com.google.samples.apps.topeka.model.Player" />
</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/topeka_blank"
android:transitionGroup="false"
android:orientation="vertical"
tools:ignore="Overdraw,UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/topeka_blank"
android:transitionGroup="false"
android:orientation="vertical"
tools:ignore="Overdraw,UnusedAttribute">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_player"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
style="@style/Topeka.TextAppearance.Title"
android:background="@color/topeka_primary"
android:elevation="@dimen/elevation_header"
tools:ignore="UnusedAttribute">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_player"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
style="@style/Topeka.TextAppearance.Title"
android:background="@color/topeka_primary"
android:elevation="@dimen/elevation_header"
tools:ignore="UnusedAttribute">

<com.google.samples.apps.topeka.widget.AvatarView
android:id="@+id/avatar"
android:layout_width="@dimen/size_avatar_toolbar"
android:layout_height="@dimen/size_avatar_toolbar"
android:layout_marginEnd="@dimen/spacing_double"
android:layout_marginRight="@dimen/spacing_double"
android:transitionName="@string/transition_avatar"
tools:ignore="UnusedAttribute" />
<com.google.samples.apps.topeka.widget.AvatarView
android:id="@+id/avatar"
android:layout_width="@dimen/size_avatar_toolbar"
android:layout_height="@dimen/size_avatar_toolbar"
android:layout_marginEnd="@dimen/spacing_double"
android:layout_marginRight="@dimen/spacing_double"
android:transitionName="@string/transition_avatar"
app:avatar='@{player.avatar.drawableId}'
tools:ignore="UnusedAttribute" />

<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="PrivateResource"
style="@style/Topeka.TextAppearance.Title.Inverse"
android:layout_gravity="center_vertical|start" />
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='@{player.firstName + " " + player.lastInitial}'
tools:ignore="PrivateResource"
style="@style/Topeka.TextAppearance.Title.Inverse"
android:layout_gravity="center_vertical|start" />

<TextView android:id="@+id/score"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Topeka.TextAppearance.Title.Inverse"
android:layout_gravity="center_vertical|end"
android:paddingEnd="@dimen/spacing_micro"
android:paddingStart="@dimen/spacing_micro"
tools:ignore="NewApi" />
</android.support.v7.widget.Toolbar>
<TextView android:id="@+id/score"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Topeka.TextAppearance.Title.Inverse"
android:layout_gravity="center_vertical|end"
android:paddingEnd="@dimen/spacing_micro"
android:paddingStart="@dimen/spacing_micro"
tools:ignore="NewApi" />
</android.support.v7.widget.Toolbar>

<FrameLayout android:id="@+id/category_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="activity.QuizSelectionActivity"
tools:ignore="MergeRootFrame">
<FrameLayout android:id="@+id/category_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="activity.QuizSelectionActivity"
tools:ignore="MergeRootFrame">

<ProgressBar android:id="@+id/progress"
android:layout_width="@dimen/size_fab"
android:layout_height="@dimen/size_fab"
android:layout_gravity="center"
android:indeterminateOnly="true" />
<ProgressBar android:id="@+id/progress"
android:layout_width="@dimen/size_fab"
android:layout_height="@dimen/size_fab"
android:layout_gravity="center"
android:indeterminateOnly="true" />

</FrameLayout>
</FrameLayout>

</LinearLayout>
</LinearLayout>
</layout>
Loading

0 comments on commit 0ecd2c7

Please sign in to comment.