From 73f0adc6b3b6cd838ebcedb59ad6772948e7a708 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 1 Jun 2015 10:59:28 +0000 Subject: [PATCH] Migrate to com.mikepenz:materialdrawer Net status updates in the drawer are broken, waiting on https://github.com/mikepenz/MaterialDrawer/issues/378 --- .../i2p/bote/android/EmailListActivity.java | 469 ++++++++++-------- .../i2p/bote/android/FolderListAdapter.java | 139 ------ app/src/main/res/layout/activity_main.xml | 133 +---- app/src/main/res/values/styles.xml | 2 +- 4 files changed, 274 insertions(+), 469 deletions(-) delete mode 100644 app/src/main/java/i2p/bote/android/FolderListAdapter.java diff --git a/app/src/main/java/i2p/bote/android/EmailListActivity.java b/app/src/main/java/i2p/bote/android/EmailListActivity.java index 5329e73..9839261 100644 --- a/app/src/main/java/i2p/bote/android/EmailListActivity.java +++ b/app/src/main/java/i2p/bote/android/EmailListActivity.java @@ -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>, 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> + + @Override + public Loader> onCreateLoader(int id, Bundle args) { + return new DrawerFolderLoader(this, I2PBote.getInstance().getEmailFolders()); + } + + private static class DrawerFolderLoader extends BetterAsyncTaskLoader> implements FolderListener { + private List mFolders; + + public DrawerFolderLoader(Context context, List folders) { + super(context); + mFolders = folders; + } + + @Override + public List loadInBackground() { + ArrayList 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 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> loader, List data) { + if (mDrawer.getDrawerItems() == null || mDrawer.getDrawerItems().size() == 0) + mDrawer.setItems((ArrayList) 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> 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)); } }); } diff --git a/app/src/main/java/i2p/bote/android/FolderListAdapter.java b/app/src/main/java/i2p/bote/android/FolderListAdapter.java deleted file mode 100644 index ce4ee45..0000000 --- a/app/src/main/java/i2p/bote/android/FolderListAdapter.java +++ /dev/null @@ -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 { - private Context mCtx; - private List 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 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; - } -} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5ac4f1f..0630ebb 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,117 +1,24 @@ - + - + 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"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 726e27d..53d7b1c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -3,7 +3,7 @@