/**
* technoXist
*
* Copyright (c) 2014-2015 Suyash Bhatt
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.technoxist.activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.technoxist.Constants;
import com.technoxist.R;
import com.technoxist.adapter.DrawerAdapter;
import com.technoxist.fragment.EntriesListFragment;
import com.technoxist.provider.FeedData.EntryColumns;
import com.technoxist.provider.FeedData.FeedColumns;
import com.technoxist.service.FetcherService;
import com.technoxist.service.RefreshService;
import com.technoxist.utils.PrefUtils;
import com.technoxist.utils.UiUtils;
public class HomeActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String STATE_CURRENT_DRAWER_POS = "STATE_CURRENT_DRAWER_POS";
private static final String FEED_UNREAD_NUMBER = "(SELECT " + Constants.DB_COUNT + " FROM " + EntryColumns.TABLE_NAME + " WHERE " +
EntryColumns.IS_READ + " IS NULL AND " + EntryColumns.FEED_ID + '=' + FeedColumns.TABLE_NAME + '.' + FeedColumns._ID + ')';
private static final int LOADER_ID = 0;
private final SharedPreferences.OnSharedPreferenceChangeListener mShowReadListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PrefUtils.SHOW_READ.equals(key)) {
getLoaderManager().restartLoader(LOADER_ID, null, HomeActivity.this);
}
}
};
private EntriesListFragment mEntriesFragment;
private DrawerLayout mDrawerLayout;
private View mLeftDrawer;
private ListView mDrawerList;
private DrawerAdapter mDrawerAdapter;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mTitle;
private BitmapDrawable mIcon;
private int mCurrentDrawerPos, N;
private boolean mIsDrawerMoving = false;
private boolean mCanQuit = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setBackgroundDrawableResource(R.color.light_entry_list_background);
setContentView(R.layout.activity_home);
mEntriesFragment = (EntriesListFragment) getFragmentManager().findFragmentById(R.id.entries_list_fragment);
mTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mLeftDrawer = findViewById(R.id.left_drawer);
mDrawerList = (ListView) findViewById(R.id.drawer_list);
mDrawerList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectDrawerItem(position);
mDrawerLayout.postDelayed(new Runnable() {
@Override
public void run() {
mDrawerLayout.closeDrawer(mLeftDrawer);
}
}, 50);
}
});
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerStateChanged(int newState) {
if (mIsDrawerMoving && newState == DrawerLayout.STATE_IDLE) {
mIsDrawerMoving = false;
invalidateOptionsMenu();
} else if (!mIsDrawerMoving) {
mIsDrawerMoving = true;
invalidateOptionsMenu();
}
super.onDrawerStateChanged(newState);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState != null) {
mCurrentDrawerPos = savedInstanceState.getInt(STATE_CURRENT_DRAWER_POS);
}
getLoaderManager().initLoader(LOADER_ID, null, this);
if (PrefUtils.getBoolean(PrefUtils.REFRESH_ENABLED, true)) {
// starts the service independent to this activity
startService(new Intent(this, RefreshService.class));
} else {
stopService(new Intent(this, RefreshService.class));
}
if (PrefUtils.getBoolean(PrefUtils.REFRESH_ON_OPEN_ENABLED, false)) {
if (!PrefUtils.getBoolean(PrefUtils.IS_REFRESHING, false)) {
startService(new Intent(HomeActivity.this, FetcherService.class).setAction(FetcherService.ACTION_REFRESH_FEEDS));
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_CURRENT_DRAWER_POS, mCurrentDrawerPos);
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
PrefUtils.registerOnPrefChangeListener(mShowReadListener);
}
@Override
protected void onPause() {
PrefUtils.unregisterOnPrefChangeListener(mShowReadListener);
super.onPause();
}
@Override
public void finish() {
if (mCanQuit) {
super.finish();
return;
}
Toast.makeText(this, R.string.back_again_to_quit, Toast.LENGTH_SHORT).show();
mCanQuit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mCanQuit = false;
}
}, 3000);
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean isOpened = mDrawerLayout.isDrawerOpen(mLeftDrawer);
if(isOpened && !mIsDrawerMoving || !isOpened && mIsDrawerMoving) {
// Do something when drawer is open
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
CursorLoader cursorLoader = new CursorLoader(this, FeedColumns.GROUPED_FEEDS_CONTENT_URI, new String[]{FeedColumns._ID, FeedColumns.URL, FeedColumns.NAME,
FeedColumns.IS_GROUP, FeedColumns.GROUP_ID, FeedColumns.ICON, FeedColumns.LAST_UPDATE, FeedColumns.ERROR, FEED_UNREAD_NUMBER},
PrefUtils.getBoolean(PrefUtils.SHOW_READ, true) ? "" : "", null, null
);
cursorLoader.setUpdateThrottle(Constants.UPDATE_THROTTLE_DELAY);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if (mDrawerAdapter != null) {
mDrawerAdapter.setCursor(cursor);
} else {
mDrawerAdapter = new DrawerAdapter(this, cursor);
mDrawerList.setAdapter(mDrawerAdapter);
// We don't have any menu yet, we need to display it
mDrawerList.post(new Runnable() {
@Override
public void run() {
selectDrawerItem(mCurrentDrawerPos);
}
});
}
}
public void onClickSettings(View view) {
startActivity(new Intent(this, GeneralPrefsActivity.class));
}
public void onClickAbout(View view) {
startActivity(new Intent(this, AboutActivity.class));
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
mDrawerAdapter.setCursor(null);
}
private void selectDrawerItem(int position) {
mCurrentDrawerPos = position;
mIcon = null;
Uri newUri;
boolean showFeedInfo = true;
if (position == 0) {
newUri = EntryColumns.ALL_ENTRIES_CONTENT_URI;
}
else if (position == N+1) {
newUri = EntryColumns.FAVORITES_CONTENT_URI;
}
else if (position == N+2) {
newUri = EntryColumns.SEARCH_URI(mEntriesFragment.getCurrentSearch());
}
else if (position == N+3) {
startActivity(new Intent(this, GeneralPrefsActivity.class));
newUri = EntryColumns.ALL_ENTRIES_CONTENT_URI;
position = 0;
mCurrentDrawerPos = 0;
}
else {
long feedOrGroupId = mDrawerAdapter.getItemId(position);
if (mDrawerAdapter.isItemAGroup(position)) {
newUri = EntryColumns.ENTRIES_FOR_GROUP_CONTENT_URI(feedOrGroupId);
} else {
byte[] iconBytes = mDrawerAdapter.getItemIcon(position);
Bitmap bitmap = UiUtils.getScaledBitmap(iconBytes, 24);
if (bitmap != null) {
mIcon = new BitmapDrawable(getResources(), bitmap);
}
newUri = EntryColumns.ENTRIES_FOR_FEED_CONTENT_URI(feedOrGroupId);
showFeedInfo = false;
}
mTitle = mDrawerAdapter.getItemName(position);
}
if (!newUri.equals(mEntriesFragment.getUri())) {
mEntriesFragment.setData(newUri, showFeedInfo);
}
mDrawerList.setItemChecked(position, true);
// First open => we open the drawer for you
if (PrefUtils.getBoolean(PrefUtils.FIRST_OPEN, true)) {
PrefUtils.putBoolean(PrefUtils.FIRST_OPEN, false);
mDrawerLayout.postDelayed(new Runnable() {
@Override
public void run() {
mDrawerLayout.openDrawer(mLeftDrawer);
}
}, 500);
}
Cursor cursor = getContentResolver().query(FeedColumns.CONTENT_URI, new String[]{Constants.DB_COUNT}, FeedColumns._ID, null, null);
cursor.moveToFirst();
N = cursor.getInt(0);
cursor.close();
getSupportActionBar().setTitle(mTitle);
if (mCurrentDrawerPos == 0) {
getSupportActionBar().setTitle(R.string.all);
}
else if (mCurrentDrawerPos == N+1) {
getSupportActionBar().setTitle(R.string.favorites);
}
else if (mCurrentDrawerPos == N+2) {
getSupportActionBar().setTitle(android.R.string.search_go);
}
else {
getSupportActionBar().setTitle(mTitle);
if (mIcon != null) {
}
}
}
}