package com.erakk.lnreader.UI.activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.InflateException;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.erakk.lnreader.Constants;
import com.erakk.lnreader.R;
import com.erakk.lnreader.UI.fragment.BookmarkFragment;
import com.erakk.lnreader.UI.fragment.DownloadFragment;
import com.erakk.lnreader.UI.fragment.SearchFragment;
import com.erakk.lnreader.UI.fragment.UpdateInfoFragment;
import com.erakk.lnreader.UIHelper;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class BaseActivity extends AppCompatActivity {
private static final String TAG = BaseActivity.class.toString();
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
protected Fragment mContent = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Restore the fragment's instance
if (savedInstanceState != null) {
mContent = getSupportFragmentManager().getFragment(savedInstanceState, "mContent");
}
setupExceptionHandler();
UIHelper.setLanguage(this);
}
@Override
public void setTitle(CharSequence title) {
super.setTitle(title);
ActionBar t = getSupportActionBar();
if (t != null)
t.setTitle(title);
}
@Override
public void setTitle(@StringRes int titleId) {
super.setTitle(titleId);
ActionBar t = getSupportActionBar();
if (t != null)
t.setTitle(titleId);
}
@Override
public void onResume() {
super.onResume();
UIHelper.CheckScreenRotation(this);
UIHelper.CheckKeepAwake(this);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
if (mDrawerToggle != null)
mDrawerToggle.syncState();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's instance
if (mContent != null)
try {
getSupportFragmentManager().putFragment(outState, "mContent", mContent);
} catch (Exception ex) {
// TODO: Proper handling required
Log.e(TAG, ex.getMessage());
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggle
if (mDrawerToggle != null)
mDrawerToggle.onConfigurationChanged(newConfig);
}
// region drawer onClick Handler
public void openNovelList(MenuItem view) {
mDrawerLayout.closeDrawers();
mContent = null;
UIHelper.openNovelList(this);
}
public void openWatchList(MenuItem item) {
mDrawerLayout.closeDrawers();
mContent = null;
UIHelper.openWatchList(this);
}
public void openLastRead(MenuItem item) {
mDrawerLayout.closeDrawers();
mContent = null;
UIHelper.openLastRead(this);
}
public void openAltNovelList(MenuItem item) {
mDrawerLayout.closeDrawers();
mContent = null;
UIHelper.selectAlternativeLanguage(this);
}
public void openSettings(MenuItem view) {
mDrawerLayout.closeDrawers();
Intent intent = new Intent(this, DisplaySettingsActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
// FOR TESTING
// resetFirstRun();
}
public void openDownloadsList(MenuItem view) {
mDrawerLayout.closeDrawers();
View f = findViewById(R.id.mainFrame);
if (f != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
mContent = new DownloadFragment();
transaction.replace(getLeftFrame(), mContent, DownloadFragment.class.toString())
.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left)
.addToBackStack(DownloadFragment.class.toString())
.commit();
} else {
Intent i = new Intent(this, MainActivity.class);
i.putExtra(Constants.EXTRA_INITIAL_FRAGMENT, DownloadFragment.class.toString());
startActivity(i);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
}
}
public void openUpdatesList(MenuItem view) {
mDrawerLayout.closeDrawers();
View f = findViewById(R.id.mainFrame);
if (f != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
mContent = new UpdateInfoFragment();
transaction.replace(getLeftFrame(), mContent, UpdateInfoFragment.class.toString())
.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left)
.addToBackStack(UpdateInfoFragment.class.toString())
.commit();
} else {
Intent i = new Intent(this, MainActivity.class);
i.putExtra(Constants.EXTRA_INITIAL_FRAGMENT, UpdateInfoFragment.class.toString());
startActivity(i);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
}
}
public void openBookmarks(MenuItem view) {
mDrawerLayout.closeDrawers();
View f = findViewById(R.id.mainFrame);
if (f != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
mContent = new BookmarkFragment();
transaction.replace(getLeftFrame(), mContent, BookmarkFragment.class.toString())
.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left)
.addToBackStack(BookmarkFragment.class.toString())
.commit();
} else {
Intent i = new Intent(this, MainActivity.class);
i.putExtra(Constants.EXTRA_INITIAL_FRAGMENT, BookmarkFragment.class.toString());
startActivity(i);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
}
}
public void openSearch(MenuItem view) {
mDrawerLayout.closeDrawers();
View f = findViewById(R.id.mainFrame);
if (f != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
mContent = new SearchFragment();
transaction.replace(getLeftFrame(), mContent, SearchFragment.class.toString())
.setCustomAnimations(R.anim.abc_fade_in, R.anim.slide_out_left, R.anim.abc_fade_in, R.anim.slide_out_left)
.addToBackStack(SearchFragment.class.toString())
.commit();
} else {
Intent i = new Intent(this, MainActivity.class);
i.putExtra(Constants.EXTRA_INITIAL_FRAGMENT, SearchFragment.class.toString());
startActivity(i);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
}
}
// endregion
protected int getLeftFrame() {
View v = findViewById(R.id.rightFragment);
if (v != null)
return R.id.rightFragment;
else return R.id.mainFrame;
}
@Override
public void setContentView(@LayoutRes int layout) {
try {
super.setContentView(layout);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
toolbar.setTitle(R.string.app_name);
setSupportActionBar(toolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open_chapter_title, R.string.open_chapter_title) {
/**
* Called when a drawer has settled in a completely closed state.
*/
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
//getActionBar().setTitle(mTitle);
//invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
ActionBar bar = getSupportActionBar();
if (bar != null) {
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowHomeEnabled(true);
}
}
/**
* Called when a drawer has settled in a completely open state.
*/
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
//getActionBar().setTitle(mDrawerTitle);
//invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
ActionBar bar = getSupportActionBar();
if (bar != null) {
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowHomeEnabled(true);
}
} else {
Log.w(TAG, "No toolbar detected!");
}
} catch (InflateException ex) {
Toast.makeText(this, "Unable to load application, looks like your device is not supported: " + ex.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, ex.getMessage(), ex);
}
}
/**
* http://stackoverflow.com/a/26560727
*/
private void setupExceptionHandler() {
final Thread.UncaughtExceptionHandler oldHandler =
Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
//Do your own error handling here
// try to write log file to the image path.
writeException(paramThread, paramThrowable);
if (oldHandler != null)
oldHandler.uncaughtException(
paramThread,
paramThrowable
); //Delegates to Android's error handling
else
System.exit(2); //Prevents the service/app from freezing
}
});
}
private void writeException(Thread paramThread, Throwable paramThrowable) {
BufferedWriter writer = null;
String rootPath = UIHelper.getImageRoot(this);
try {
// create a temporary file
String timeLog = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
File logFile = new File(rootPath + "/Error_" + timeLog + ".log");
// This will output the full path where the file will be written to...
Log.d(TAG, "Writing to: " + logFile.getCanonicalPath());
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFile), "UTF-8"));
writer.write("Thread Name: " + paramThread.getName());
writer.newLine();
writer.write(paramThrowable.getMessage());
writer.newLine();
StringWriter sw = new StringWriter();
paramThrowable.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
writer.write(exceptionAsString);
writer.newLine();
writer.flush();
writer.write("-=EOL=-");
} catch (Exception e) {
Log.e(TAG, "Failed to write log file.", e);
} finally {
try {
// Close the writer regardless of what happens...
if (writer != null)
writer.close();
} catch (Exception e) {
Log.e(TAG, "Failed when closing writer.", e);
}
}
}
}