package com.github.takahirom.materialelement.main;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import com.github.takahirom.materialelement.MaterialElementActivity;
import com.github.takahirom.materialelement.R;
import com.github.takahirom.materialelement.animation.transition.TransitionUtils;
import com.github.takahirom.materialelement.util.ScreenUtil;
import com.github.takahirom.materialelement.motion.durationeasing.DurationAndEasingActivity;
import com.github.takahirom.materialelement.util.ThemeUtil;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
public class MainActivity extends MaterialElementActivity {
private RecyclerView recyclerView;
private static final int REQUEST_ID_DETAIL = 2;
private ImplementationAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ThemeUtil.setTaskDescriptionColor(this);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayShowTitleEnabled(false);
}
setupRecyclerView();
}
private void setupRecyclerView() {
recyclerView = (RecyclerView) findViewById(R.id.implementation_list);
final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(gridLayoutManager);
adapter = new ImplementationAdapter(this, new ImplementationAdapter.OnItemClickListener() {
@Override
public void onItemClick(View fromView, ImplementationItem item) {
final Intent intent = new Intent(MainActivity.this, item.getActivityClass());
intent.putExtra(DurationAndEasingActivity.INTENT_EXTRA_ITEM, item);
String sharedElementName = getString(R.string.transition_name_implementation_image);
final Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, fromView, sharedElementName).toBundle();
ActivityCompat.startActivityForResult(MainActivity.this, intent, REQUEST_ID_DETAIL, options);
}
});
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int itemViewType = adapter.getItemViewType(position);
return itemViewType == ImplementationAdapter.VIEW_TYPE_HEADER ? 2 : 1;
}
});
recyclerView.setAdapter(adapter);
// Calc grid space
final float spaceSize = ScreenUtil.dp2px(4, this);
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int adapterPosition = parent.getChildViewHolder(view).getAdapterPosition();
GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
int spanSize = spanSizeLookup.getSpanSize(adapterPosition);
if (spanSize == 2) {
return;
}
int spanIndex = spanSizeLookup.getSpanIndex(adapterPosition, gridLayoutManager.getSpanCount());
if (spanIndex == 0) {
outRect.set((int) spaceSize, (int) spaceSize, ((int) (spaceSize / 2)), 0);
} else {
outRect.set(((int) (spaceSize / 2)), (int) spaceSize, (int) spaceSize, 0);
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public void onActivityReenter(int resultCode, Intent data) {
if (data == null || resultCode != RESULT_OK
|| !data.hasExtra(DurationAndEasingActivity.RESULT_EXTRA_ITEM_ID)) return;
// When reentering, if the shared element is no longer on screen (e.g. after an
// orientation change) then scroll it into view.
final int itemId = data.getIntExtra(DurationAndEasingActivity.RESULT_EXTRA_ITEM_ID, -1);
if (itemId != -1 // returning from a shot
&& adapter.getItemCount() > 0 // grid populated
&& recyclerView.findViewHolderForItemId(itemId) == null) { // view not attached
final int position = adapter.getItemPosition(itemId);
if (position == RecyclerView.NO_POSITION) return;
// delay the transition until our shared element is on-screen i.e. has been laid out
ActivityCompat.postponeEnterTransition(this);
recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int l, int t, int r, int b,
int oL, int oT, int oR, int oB) {
recyclerView.removeOnLayoutChangeListener(this);
ActivityCompat.startPostponedEnterTransition(MainActivity.this);
}
});
recyclerView.scrollToPosition(position);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_github) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.main_github_url))));
} else {
if (id == R.id.action_settings) {
openDeveloperSettings();
return true;
} else if (id == R.id.action_debug) {
startTransitionDebug();
}
}
return super.onOptionsItemSelected(item);
}
private void startTransitionDebug() {
getApplication().registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
TransitionUtils.showForDebug(activity.getWindow());
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
private void openDeveloperSettings() {
boolean isEnable = Settings.Secure.getInt(this.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1;
if (isEnable) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
startActivity(intent);
} else {
Snackbar.make(recyclerView, R.string.main_not_enabled_developer_mode, Snackbar.LENGTH_SHORT).show();
}
}
// For Calligraphy
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
}