Migrate to com.mikepenz:materialdrawer

Net status updates in the drawer are broken, waiting on
https://github.com/mikepenz/MaterialDrawer/issues/378
This commit is contained in:
str4d
2015-06-01 10:59:28 +00:00
parent 0ae8602193
commit 73f0adc6b3
4 changed files with 274 additions and 469 deletions

View File

@@ -7,29 +7,30 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.AdapterView;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import net.i2p.android.ui.I2PAndroidHelper;
import java.util.ArrayList;
import java.util.List;
import i2p.bote.I2PBote;
import i2p.bote.android.addressbook.AddressBookActivity;
import i2p.bote.android.config.SettingsActivity;
@@ -38,18 +39,20 @@ import i2p.bote.android.intro.SetupActivity;
import i2p.bote.android.service.BoteService;
import i2p.bote.android.service.Init;
import i2p.bote.android.service.Init.RouterChoice;
import i2p.bote.android.util.BetterAsyncTaskLoader;
import i2p.bote.android.util.BoteHelper;
import i2p.bote.android.util.MoveToDialogFragment;
import i2p.bote.fileencryption.PasswordCacheListener;
import i2p.bote.fileencryption.PasswordException;
import i2p.bote.folder.EmailFolder;
import i2p.bote.folder.FolderListener;
import i2p.bote.network.NetworkStatusListener;
public class EmailListActivity extends BoteActivityBase implements
FolderListAdapter.OnFolderSelectedListener,
LoaderManager.LoaderCallbacks<List<IDrawerItem>>,
EmailListFragment.OnEmailSelectedListener,
MoveToDialogFragment.MoveToDialogListener,
PasswordCacheListener,
FolderListener,
NetworkStatusListener {
private I2PAndroidHelper mHelper;
private RouterChoice mRouterChoice;
@@ -59,21 +62,18 @@ public class EmailListActivity extends BoteActivityBase implements
/**
* Navigation drawer variables
*/
private DrawerLayout mDrawerLayout;
private RelativeLayout mDrawerOuter;
private FolderListAdapter mFolderAdapter;
private ImageView mNetworkStatusIcon;
private TextView mNetworkStatusText;
private ActionBarDrawerToggle mDrawerToggle;
private Drawer mDrawer;
private int mSelected;
private static final String SHARED_PREFS = "i2p.bote";
private static final String PREF_NAV_DRAWER_OPENED = "navDrawerOpened";
private static final String PREF_FIRST_START = "firstStart";
private static final String ACTIVE_FOLDER = "activeFolder";
private static final int SHOW_INTRODUCTION = 1;
private static final int RUN_SETUP = 2;
private static final int ID_ADDRESS_BOOK = 1;
private static final int ID_NET_STATUS = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -86,11 +86,15 @@ public class EmailListActivity extends BoteActivityBase implements
// Initialize variables
mHelper = new I2PAndroidHelper(this);
mSharedPrefs = getSharedPreferences(SHARED_PREFS, 0);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerOuter = (RelativeLayout) findViewById(R.id.drawer_outer);
RecyclerView mFolderList = (RecyclerView) findViewById(R.id.drawer);
mNetworkStatusIcon = (ImageView) findViewById(R.id.network_status_icon);
mNetworkStatusText = (TextView) findViewById(R.id.network_status_text);
IDrawerItem addressBook = new PrimaryDrawerItem()
.withIdentifier(ID_ADDRESS_BOOK)
.withName(R.string.address_book)
.withIcon(R.drawable.ic_contacts_grey600_24dp)
.withIconTintingEnabled(true)
.withSelectedIconColorRes(R.color.primary);
IDrawerItem networkStatus = getNetStatusItem(
R.string.network_status, R.drawable.ic_cloud_off_grey600_24dp);
// Set the drawer width per Material design spec
// http://www.google.com/design/spec/layout/structure.html#structure-side-nav-1
@@ -99,113 +103,53 @@ public class EmailListActivity extends BoteActivityBase implements
int maxWidth = getResources().getDimensionPixelSize(R.dimen.nav_max_width);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
DrawerLayout.LayoutParams lp = (DrawerLayout.LayoutParams) mDrawerOuter.getLayoutParams();
lp.width = Math.min(dm.widthPixels - toolbar.getLayoutParams().height, maxWidth);
int drawerWidth = Math.min(dm.widthPixels - toolbar.getLayoutParams().height, maxWidth);
// Set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawer = new DrawerBuilder()
.withActivity(this)
.withToolbar(toolbar)
.withDrawerWidthPx(drawerWidth)
.withShowDrawerOnFirstLaunch(true)
.addStickyDrawerItems(addressBook, networkStatus)
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public boolean onItemClick(AdapterView<?> adapterView, View view, int i, long l, IDrawerItem iDrawerItem) {
switch (iDrawerItem.getIdentifier()) {
case ID_ADDRESS_BOOK:
mDrawer.setSelection(mSelected, false);
mDrawer.closeDrawer();
Intent ai = new Intent(EmailListActivity.this, AddressBookActivity.class);
startActivity(ai);
return true;
// use a linear layout manager
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
mFolderList.setLayoutManager(mLayoutManager);
case ID_NET_STATUS:
mDrawer.setSelection(mSelected, false);
netStatusSelected();
return true;
mFolderAdapter = new FolderListAdapter(this, this);
default:
drawerFolderSelected((EmailFolder) iDrawerItem.getTag(), mSelected == i);
mSelected = mDrawer.getCurrentSelection();
return false;
}
}
})
.withSavedInstance(savedInstanceState)
.build();
// Set the list of folders
// TODO: This is slow, needs a loader
mFolderAdapter.setFolders(I2PBote.getInstance().getEmailFolders(), this);
// Set the adapter for the list view
mFolderList.setAdapter(mFolderAdapter);
mSelected = mDrawer.getCurrentSelection();
// Enable ActionBar app icon to behave as action to toggle nav drawer
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Set up drawer toggle
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.string.drawer_open, R.string.drawer_close) {
private boolean wasDragged = false;
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
// Don't mark as opened if the user closed by dragging
// but uses the action bar icon to open
wasDragged = false;
supportInvalidateOptionsMenu();
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View view) {
if (wasDragged && !mSharedPrefs.getBoolean(PREF_NAV_DRAWER_OPENED, false)) {
SharedPreferences.Editor edit = mSharedPrefs.edit();
edit.putBoolean(PREF_NAV_DRAWER_OPENED, true);
edit.apply();
}
supportInvalidateOptionsMenu();
}
/** Called when the drawer motion state changes. */
public void onDrawerStateChanged(int newState) {
if (newState == DrawerLayout.STATE_DRAGGING)
wasDragged = true;
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
mDrawer.getActionBarDrawerToggle().setDrawerIndicatorEnabled(true);
if (savedInstanceState == null) {
EmailListFragment f = EmailListFragment.newInstance("inbox");
getSupportFragmentManager().beginTransaction()
.add(R.id.list_fragment, f).commit();
} else {
mFolderAdapter.setSelected(savedInstanceState.getInt(ACTIVE_FOLDER));
}
// Set up fixed actions
findViewById(R.id.address_book).setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
mDrawerLayout.closeDrawer(mDrawerOuter);
Intent ai = new Intent(EmailListActivity.this, AddressBookActivity.class);
startActivity(ai);
}
});
findViewById(R.id.network_status).setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int boteNotStartedMessage = R.string.network_info_unavailable;
switch (I2PBote.getInstance().getNetworkStatus()) {
case DELAY:
boteNotStartedMessage = R.string.network_info_unavailable_delay;
case NOT_STARTED:
final int message = boteNotStartedMessage;
DialogFragment df = new DialogFragment() {
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return builder.create();
}
};
df.show(getSupportFragmentManager(), "noinfo");
break;
default:
mDrawerLayout.closeDrawer(mDrawerOuter);
Intent nii = new Intent(EmailListActivity.this, NetworkInfoActivity.class);
startActivity(nii);
}
}
});
// Open nav drawer if the user has never opened it themselves
if (!mSharedPrefs.getBoolean(PREF_NAV_DRAWER_OPENED, false))
mDrawerLayout.openDrawer(mDrawerOuter);
// If first start, go to introduction and setup wizard
if (mSharedPrefs.getBoolean(PREF_FIRST_START, true)) {
mSharedPrefs.edit().putBoolean(PREF_FIRST_START, false).apply();
@@ -217,7 +161,7 @@ public class EmailListActivity extends BoteActivityBase implements
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ACTIVE_FOLDER, mFolderAdapter.getSelected());
mDrawer.saveInstanceState(outState);
}
@Override
@@ -247,6 +191,12 @@ public class EmailListActivity extends BoteActivityBase implements
networkStatusChanged();
}
@Override
public void onResume() {
super.onResume();
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
protected void onStop() {
super.onStop();
@@ -256,23 +206,8 @@ public class EmailListActivity extends BoteActivityBase implements
I2PBote.getInstance().removeNetworkStatusListener(this);
}
private boolean isBoteServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (BoteService.class.getName().equals(service.service.getClassName()))
return true;
}
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case R.id.action_start_bote:
// Init from settings
@@ -333,35 +268,27 @@ public class EmailListActivity extends BoteActivityBase implements
}
}
private void startBote() {
Intent start = new Intent(this, BoteService.class);
start.putExtra(BoteService.ROUTER_CHOICE, mRouterChoice);
startService(start);
supportInvalidateOptionsMenu();
}
@SuppressWarnings("ConstantConditions")
@Override
public void setTitle(CharSequence title) {
getSupportActionBar().setTitle(title);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
//
// Helpers
//
private IDrawerItem getNetStatusItem(int nameRes, int icRes) {
return new PrimaryDrawerItem()
.withIdentifier(ID_NET_STATUS)
.withName(nameRes)
.withIcon(icRes)
.withIconTintingEnabled(true)
.withSelectedIconColorRes(R.color.primary);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggle
mDrawerToggle.onConfigurationChanged(newConfig);
}
// FolderListAdapter.OnFolderSelectedListener
public void onDrawerFolderSelected(EmailFolder folder, boolean alreadySelected) {
private void drawerFolderSelected(EmailFolder folder, boolean alreadySelected) {
if (!alreadySelected) {
// Create the new fragment
EmailListFragment f = EmailListFragment.newInstance(folder.getName());
@@ -371,7 +298,162 @@ public class EmailListActivity extends BoteActivityBase implements
.replace(R.id.list_fragment, f).commit();
}
// Close the drawer
mDrawerLayout.closeDrawer(mDrawerOuter);
mDrawer.closeDrawer();
}
private void netStatusSelected() {
int boteNotStartedMessage = R.string.network_info_unavailable;
switch (I2PBote.getInstance().getNetworkStatus()) {
case DELAY:
boteNotStartedMessage = R.string.network_info_unavailable_delay;
case NOT_STARTED:
final int message = boteNotStartedMessage;
DialogFragment df = new DialogFragment() {
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return builder.create();
}
};
df.show(getSupportFragmentManager(), "noinfo");
break;
default:
mDrawer.closeDrawer();
Intent nii = new Intent(EmailListActivity.this, NetworkInfoActivity.class);
startActivity(nii);
}
}
private boolean isBoteServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (BoteService.class.getName().equals(service.service.getClassName()))
return true;
}
return false;
}
private void startBote() {
Intent start = new Intent(this, BoteService.class);
start.putExtra(BoteService.ROUTER_CHOICE, mRouterChoice);
startService(start);
supportInvalidateOptionsMenu();
}
//
// Interfaces
//
// LoaderManager.LoaderCallbacks<List<IDrawerItem>>
@Override
public Loader<List<IDrawerItem>> onCreateLoader(int id, Bundle args) {
return new DrawerFolderLoader(this, I2PBote.getInstance().getEmailFolders());
}
private static class DrawerFolderLoader extends BetterAsyncTaskLoader<List<IDrawerItem>> implements FolderListener {
private List<EmailFolder> mFolders;
public DrawerFolderLoader(Context context, List<EmailFolder> folders) {
super(context);
mFolders = folders;
}
@Override
public List<IDrawerItem> loadInBackground() {
ArrayList<IDrawerItem> drawerItems = new ArrayList<>();
for (EmailFolder folder : mFolders) {
drawerItems.add(getFolderDrawerItem(folder));
}
return drawerItems;
}
private IDrawerItem getFolderDrawerItem(EmailFolder folder) {
PrimaryDrawerItem item = new PrimaryDrawerItem()
.withIdentifier(folder.hashCode())
.withTag(folder)
.withIconTintingEnabled(true)
.withSelectedIconColorRes(R.color.primary)
.withIcon(BoteHelper.getFolderIcon(getContext(), folder))
.withName(BoteHelper.getFolderDisplayName(getContext(), folder));
try {
int numNew = folder.getNumNewEmails();
if (numNew > 0)
item.withBadge("" + numNew);
} catch (PasswordException e) {
// Password fetching is handled in EmailListFragment
}
return item;
}
@Override
protected void onStartMonitoring() {
if (mFolders != null) {
for (EmailFolder folder : mFolders) {
folder.addFolderListener(this);
}
}
}
@Override
protected void onStopMonitoring() {
if (mFolders != null) {
for (EmailFolder folder : mFolders) {
folder.removeFolderListener(this);
}
}
}
@Override
protected void releaseResources(List<IDrawerItem> data) {
}
// FolderListener
@Override
public void elementAdded(String s) {
onContentChanged();
}
@Override
public void elementUpdated() {
onContentChanged();
}
@Override
public void elementRemoved(String s) {
onContentChanged();
}
}
@Override
public void onLoadFinished(Loader<List<IDrawerItem>> loader, List<IDrawerItem> data) {
if (mDrawer.getDrawerItems() == null || mDrawer.getDrawerItems().size() == 0)
mDrawer.setItems((ArrayList<IDrawerItem>) data);
else {
// Assumes that no folders have been added or removed
// TODO change this if necessary when user folders are implemented
for (IDrawerItem item : data) {
mDrawer.updateItem(item);
}
}
}
@Override
public void onLoaderReset(Loader<List<IDrawerItem>> loader) {
mDrawer.removeAllItems();
}
// FolderFragment.OnEmailSelectedListener
@@ -398,54 +480,14 @@ public class EmailListActivity extends BoteActivityBase implements
@Override
public void passwordProvided() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mFolderAdapter.notifyDataSetChanged();
}
});
// Trigger the loader to show the drawer badges
getSupportLoaderManager().restartLoader(0, null, this);
}
@Override
public void passwordCleared() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mFolderAdapter.notifyDataSetChanged();
}
});
}
// FolderListener
@Override
public void elementAdded(String messageId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mFolderAdapter.notifyDataSetChanged();
}
});
}
@Override
public void elementUpdated() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mFolderAdapter.notifyDataSetChanged();
}
});
}
@Override
public void elementRemoved(String messageId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mFolderAdapter.notifyDataSetChanged();
}
});
// Trigger the loader to hide the drawer badges
getSupportLoaderManager().restartLoader(0, null, this);
}
// NetworkStatusListener
@@ -454,39 +496,34 @@ public class EmailListActivity extends BoteActivityBase implements
public void networkStatusChanged() {
// Update network status
final int statusText;
final Drawable statusIcon;
final int statusIcon;
switch (I2PBote.getInstance().getNetworkStatus()) {
case DELAY:
statusText = R.string.connect_delay;
statusIcon = getResources().getDrawable(R.drawable.ic_av_timer_grey600_24dp);
statusIcon = R.drawable.ic_av_timer_grey600_24dp;
break;
case CONNECTING:
statusText = R.string.connecting;
statusIcon = getResources().getDrawable(R.drawable.ic_cloud_queue_grey600_24dp);
statusIcon = R.drawable.ic_cloud_queue_grey600_24dp;
break;
case CONNECTED:
statusText = R.string.connected;
statusIcon = getResources().getDrawable(R.drawable.ic_cloud_done_grey600_24dp);
statusIcon = R.drawable.ic_cloud_done_grey600_24dp;
break;
case ERROR:
statusText = R.string.error;
statusIcon = getResources().getDrawable(R.drawable.ic_error_red_24dp);
statusIcon = R.drawable.ic_error_red_24dp;
break;
case NOT_STARTED:
default:
statusText = R.string.not_started;
statusIcon = getResources().getDrawable(R.drawable.ic_cloud_off_grey600_24dp);
statusIcon = R.drawable.ic_cloud_off_grey600_24dp;
}
mNetworkStatusText.post(new Runnable() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mNetworkStatusText.setText(statusText);
}
});
mNetworkStatusIcon.post(new Runnable() {
@Override
public void run() {
mNetworkStatusIcon.setImageDrawable(statusIcon);
// TODO change this when #378 is resolved
mDrawer.updateItem(getNetStatusItem(statusText, statusIcon));
}
});
}

View File

@@ -1,139 +0,0 @@
package i2p.bote.android;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import i2p.bote.android.util.BoteHelper;
import i2p.bote.fileencryption.PasswordException;
import i2p.bote.folder.EmailFolder;
import i2p.bote.folder.FolderListener;
public class FolderListAdapter extends RecyclerView.Adapter<FolderListAdapter.ViewHolder> {
private Context mCtx;
private List<EmailFolder> mFolders;
private int mSelectedFolder;
private OnFolderSelectedListener mListener;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mIcon;
public TextView mName;
public ViewHolder(View v) {
super(v);
mIcon = (ImageView) v.findViewById(R.id.folder_icon);
mName = (TextView) v.findViewById(R.id.folder_name);
}
}
public static interface OnFolderSelectedListener {
/**
* Called when a folder has been selected from the navigation drawer.
*
* @param folder
* The EmailFolder that has just been selected.
* @param alreadySelected
* Is the selected folder already selected?
*/
public void onDrawerFolderSelected(EmailFolder folder, boolean alreadySelected);
}
public FolderListAdapter(Context ctx, OnFolderSelectedListener listener) {
mCtx = ctx;
mSelectedFolder = -1;
mListener = listener;
}
public void setFolders(List<EmailFolder> folders, FolderListener folderListener) {
// Remove previous FolderListeners
if (mFolders != null) {
for (EmailFolder folder : mFolders) {
folder.removeFolderListener(folderListener);
}
}
mFolders = folders;
for (EmailFolder folder : folders) {
folder.addFolderListener(folderListener);
}
if (mSelectedFolder < 0)
mSelectedFolder = 0;
notifyDataSetChanged();
}
public void setSelected(int position) {
if (position != mSelectedFolder) {
int oldSelected = mSelectedFolder;
mSelectedFolder = position;
notifyItemChanged(oldSelected);
notifyItemChanged(mSelectedFolder);
}
}
public int getSelected() {
return mSelectedFolder;
}
// Create new views (invoked by the layout manager)
@Override
public FolderListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.listitem_folder_with_icon, parent, false);
return new ViewHolder(v);
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final EmailFolder folder = mFolders.get(position);
final boolean isSelected = position == mSelectedFolder;
Drawable folderIcon = DrawableCompat.wrap(BoteHelper.getFolderIcon(mCtx, folder));
DrawableCompat.setTintList(folderIcon, mCtx.getResources().getColorStateList(R.color.folder_icon));
holder.mIcon.setImageDrawable(folderIcon);
try {
holder.mName.setText(BoteHelper.getFolderDisplayNameWithNew(mCtx, folder));
} catch (PasswordException e) {
// Password fetching is handled in EmailListFragment
holder.mName.setText(BoteHelper.getFolderDisplayName(mCtx, folder));
}
holder.itemView.setSelected(isSelected);
holder.mName.setTextAppearance(mCtx, isSelected ?
R.style.TextAppearance_AppCompat_NavDrawer_Selected :
R.style.TextAppearance_AppCompat_NavDrawer);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
setSelected(position);
mListener.onDrawerFolderSelected(folder, isSelected);
}
});
}
// Return the size of the dataset (invoked by the layout manager)
@Override
public int getItemCount() {
if (mFolders != null)
return mFolders.size();
return 0;
}
}

View File

@@ -1,117 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".EmailListActivity">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".EmailListActivity">
<LinearLayout
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<!-- The mail list view -->
<FrameLayout
android:id="@+id/list_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!-- The navigation drawer -->
<RelativeLayout
android:id="@+id/drawer_outer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/background_floating_material_light">
<android.support.v7.widget.RecyclerView
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/fixed_actions"
android:layout_alignParentTop="true"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" />
<LinearLayout
android:id="@+id/fixed_actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/address_book"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/listitem_background">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingEnd="@dimen/nav_horizontal_margin"
android:paddingLeft="@dimen/listitem_horizontal_margin"
android:paddingRight="@dimen/nav_horizontal_margin"
android:paddingStart="@dimen/listitem_horizontal_margin"
android:src="@drawable/ic_contacts_grey600_24dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/nav_entry_height"
android:gravity="center_vertical"
android:paddingEnd="@dimen/nav_horizontal_margin"
android:paddingLeft="@dimen/listitem_text_left_margin"
android:paddingRight="@dimen/nav_horizontal_margin"
android:paddingStart="@dimen/listitem_text_left_margin"
android:text="@string/address_book"
android:textAppearance="@style/TextAppearance.AppCompat.NavDrawer" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/network_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/listitem_background">
<ImageView
android:id="@+id/network_status_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingEnd="@dimen/nav_horizontal_margin"
android:paddingLeft="@dimen/nav_horizontal_margin"
android:paddingRight="@dimen/nav_horizontal_margin"
android:paddingStart="@dimen/nav_horizontal_margin"
android:src="@drawable/ic_cloud_off_grey600_24dp" />
<TextView
android:id="@+id/network_status_text"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_entry_height"
android:gravity="center_vertical"
android:paddingEnd="@dimen/nav_horizontal_margin"
android:paddingLeft="@dimen/listitem_text_left_margin"
android:paddingRight="@dimen/nav_horizontal_margin"
android:paddingStart="@dimen/listitem_text_left_margin"
android:text="@string/network_status"
android:textAppearance="@style/TextAppearance.AppCompat.NavDrawer" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
<!-- The mail list view -->
<FrameLayout
android:id="@+id/list_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

View File

@@ -3,7 +3,7 @@
<style name="Base"/>
<style name="Theme.Bote" parent="Theme.AppCompat.Light.NoActionBar">
<style name="Theme.Bote" parent="MaterialDrawerTheme.Light.DarkToolbar">
<!-- Here we setting appcompats actionBarStyle -->
<!--<item name="actionBarStyle">@style/MyActionBarStyle</item>-->