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:
@@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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 appcompat’s actionBarStyle -->
|
||||
<!--<item name="actionBarStyle">@style/MyActionBarStyle</item>-->
|
||||
|
||||
|
||||
Reference in New Issue
Block a user