package com.ambergleam.android.photogallery;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewTreeObserver;
import com.ambergleam.android.photogallery.manager.BroadcastManager;
import com.ambergleam.android.photogallery.util.AndroidUtils;
import com.ambergleam.android.photogallery.util.ConnectionUtils;
import com.ambergleam.android.photogallery.util.InjectionUtils;
import java.lang.reflect.Field;
import butterknife.Bind;
import butterknife.ButterKnife;
import timber.log.Timber;
public abstract class BaseActivity extends AppCompatActivity {
@Bind(R.id.activity_fragment_toolbar) public Toolbar mToolbar;
private BroadcastReceiver mConnectionUpdateReceiver;
protected abstract Fragment createFragment();
protected abstract boolean setNavIconAsLogo();
protected abstract boolean setPostponeEnter();
protected abstract boolean setPostponeReenter();
protected abstract boolean showsNetworkConnectionDialog();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
setupInjection();
setupToolbar();
setupOverflowButton();
setupOverviewScreen();
setupInitialFragment();
setupEnterTransition();
setupBroadcastReceivers();
}
@Override
protected void onResume() {
super.onResume();
registerBroadcastReceivers();
}
@Override
protected void onPause() {
super.onPause();
unregisterBroadcastReceivers();
}
private void setupInjection() {
InjectionUtils.inject(this);
ButterKnife.bind(this);
}
private void setupToolbar() {
setSupportActionBar(mToolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
if (setNavIconAsLogo()) {
mToolbar.setNavigationIcon(R.mipmap.ic_logo);
}
}
private void setupOverflowButton() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
Timber.e("Error with displaying overflow menu.", e);
}
}
private void setupOverviewScreen() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getTheme();
theme.resolveAttribute(R.attr.colorPrimary, typedValue, true);
int color = typedValue.data;
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_overview);
ActivityManager.TaskDescription td = new ActivityManager.TaskDescription(null, bm, color);
setTaskDescription(td);
bm.recycle();
}
}
private void setupInitialFragment() {
FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.activity_fragment_container);
if (fragment == null) {
fragment = createFragment();
manager.beginTransaction()
.add(R.id.activity_fragment_container, fragment)
.commit();
}
}
private void setupBroadcastReceivers() {
mConnectionUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectionUtils.checkForConnection(BaseActivity.this);
}
};
}
private void registerBroadcastReceivers() {
if (showsNetworkConnectionDialog()) {
registerConnectionUpdateReceiver();
ConnectionUtils.checkForConnection(this);
}
}
private void unregisterBroadcastReceivers() {
if (showsNetworkConnectionDialog()) {
unregisterConnectionUpdateReceiver();
}
}
private void registerConnectionUpdateReceiver() {
LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter connectionFilter = new IntentFilter(BroadcastManager.BROADCAST_ACTION_CONNECTION_UPDATE);
broadcastManager.registerReceiver(mConnectionUpdateReceiver, connectionFilter);
}
private void unregisterConnectionUpdateReceiver() {
LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
broadcastManager.unregisterReceiver(mConnectionUpdateReceiver);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setupEnterTransition() {
if (setPostponeEnter() && AndroidUtils.IS_LOLLIPOP_AND_UP) {
postponeEnterTransition();
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onActivityReenter(int resultCode, Intent data) {
super.onActivityReenter(resultCode, data);
if (setPostponeReenter() && AndroidUtils.IS_LOLLIPOP_AND_UP) {
postponeEnterTransition();
}
}
public void scheduleStartPostponedTransition(final View sharedElement) {
sharedElement.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onPreDraw() {
sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
if (AndroidUtils.IS_LOLLIPOP_AND_UP) {
startPostponedEnterTransition();
}
return true;
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}