Started main interface, nav drawer with list of folders
This commit is contained in:
BIN
res/drawable-hdpi/drawer_shadow.9.png
Normal file
BIN
res/drawable-hdpi/drawer_shadow.9.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 171 B |
BIN
res/drawable-hdpi/ic_drawer.png
Normal file
BIN
res/drawable-hdpi/ic_drawer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
BIN
res/drawable-mdpi/drawer_shadow.9.png
Normal file
BIN
res/drawable-mdpi/drawer_shadow.9.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 158 B |
BIN
res/drawable-mdpi/ic_drawer.png
Normal file
BIN
res/drawable-mdpi/ic_drawer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
BIN
res/drawable-xhdpi/drawer_shadow.9.png
Normal file
BIN
res/drawable-xhdpi/drawer_shadow.9.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 182 B |
BIN
res/drawable-xhdpi/ic_drawer.png
Normal file
BIN
res/drawable-xhdpi/ic_drawer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
27
res/layout/activity_main.xml
Normal file
27
res/layout/activity_main.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.v4.widget.DrawerLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/drawer_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainListActivity" >
|
||||
|
||||
<!-- The mail list view -->
|
||||
<FrameLayout
|
||||
android:id="@+id/list_fragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<!-- The navigation drawer -->
|
||||
<ListView
|
||||
android:id="@+id/drawer"
|
||||
android:layout_width="240dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
android:choiceMode="singleChoice"
|
||||
android:divider="@android:color/transparent"
|
||||
android:dividerHeight="0dp"
|
||||
android:background="#111"/>
|
||||
|
||||
</android.support.v4.widget.DrawerLayout>
|
||||
11
res/layout/listitem_folder.xml
Normal file
11
res/layout/listitem_folder.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" >
|
||||
<TextView
|
||||
android:id="@+id/folder_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Folder Name" />
|
||||
|
||||
</RelativeLayout>
|
||||
9
res/menu/main.xml
Normal file
9
res/menu/main.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/action_settings"/>
|
||||
|
||||
</menu>
|
||||
15
res/values/strings.xml
Normal file
15
res/values/strings.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_name">I2P-Bote</string>
|
||||
<string name="action_settings">Settings</string>
|
||||
<string name="hello_world">Hello world!</string>
|
||||
|
||||
<string name="drawer_open">Open nav</string>
|
||||
<string name="drawer_close">Close nav</string>
|
||||
|
||||
<string name="folder_inbox">Inbox</string>
|
||||
<string name="folder_outbox">Outbox</string>
|
||||
<string name="folder_sent">Sent</string>
|
||||
<string name="folder_trash">Trash</string>
|
||||
</resources>
|
||||
40
src/i2p/bote/BoteHelper.java
Normal file
40
src/i2p/bote/BoteHelper.java
Normal file
@@ -0,0 +1,40 @@
|
||||
package i2p.bote;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import i2p.bote.folder.EmailFolder;
|
||||
|
||||
public class BoteHelper {
|
||||
public static EmailFolder getMailFolder(String folderName) {
|
||||
List<EmailFolder> folders = I2PBote.getInstance().getEmailFolders();
|
||||
for (EmailFolder folder : folders) {
|
||||
if (folder.getName() == folderName)
|
||||
return folder;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the translated name of the folder.
|
||||
* Built-in folders are special-cased; other folders are created by the
|
||||
* user, so their name is already "translated".
|
||||
* @param ctx Android Context to get strings from.
|
||||
* @param folder The folder.
|
||||
* @return The name of the folder.
|
||||
*/
|
||||
public static String getFolderDisplayName(Context ctx, EmailFolder folder) {
|
||||
String name = folder.getName();
|
||||
if ("inbox".equals(name))
|
||||
return ctx.getResources().getString(R.string.folder_inbox);
|
||||
else if ("outbox".equals(name))
|
||||
return ctx.getResources().getString(R.string.folder_outbox);
|
||||
else if ("sent".equals(name))
|
||||
return ctx.getResources().getString(R.string.folder_sent);
|
||||
else if ("trash".equals(name))
|
||||
return ctx.getResources().getString(R.string.folder_trash);
|
||||
else
|
||||
return name;
|
||||
}
|
||||
}
|
||||
40
src/i2p/bote/FolderAdapter.java
Normal file
40
src/i2p/bote/FolderAdapter.java
Normal file
@@ -0,0 +1,40 @@
|
||||
package i2p.bote;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import i2p.bote.folder.EmailFolder;
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class FolderAdapter extends ArrayAdapter<EmailFolder> {
|
||||
private final LayoutInflater mInflater;
|
||||
|
||||
public FolderAdapter(Context context) {
|
||||
super(context, android.R.layout.simple_list_item_2);
|
||||
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
}
|
||||
|
||||
public void setData(List<EmailFolder> folders) {
|
||||
clear();
|
||||
if (folders != null) {
|
||||
for (EmailFolder folder : folders) {
|
||||
add(folder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View v = mInflater.inflate(R.layout.listitem_folder, parent, false);
|
||||
EmailFolder folder = getItem(position);
|
||||
|
||||
TextView name = (TextView) v.findViewById(R.id.folder_name);
|
||||
name.setText(BoteHelper.getFolderDisplayName(getContext(), folder));
|
||||
|
||||
return v;
|
||||
}
|
||||
}
|
||||
25
src/i2p/bote/FolderFragment.java
Normal file
25
src/i2p/bote/FolderFragment.java
Normal file
@@ -0,0 +1,25 @@
|
||||
package i2p.bote;
|
||||
|
||||
import i2p.bote.folder.EmailFolder;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ListFragment;
|
||||
|
||||
public class FolderFragment extends ListFragment {
|
||||
public static final String FOLDER_NAME = "folder_name";
|
||||
|
||||
public static FolderFragment newInstance(String folderName) {
|
||||
FolderFragment f = new FolderFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putString(FOLDER_NAME, folderName);
|
||||
f.setArguments(args);
|
||||
return f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
String folderName = getArguments().getString(FOLDER_NAME);
|
||||
EmailFolder folder = BoteHelper.getMailFolder(folderName);
|
||||
}
|
||||
}
|
||||
166
src/i2p/bote/MailListActivity.java
Normal file
166
src/i2p/bote/MailListActivity.java
Normal file
@@ -0,0 +1,166 @@
|
||||
package i2p.bote;
|
||||
|
||||
import i2p.bote.folder.EmailFolder;
|
||||
import android.os.Bundle;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.support.v4.app.ActionBarDrawerToggle;
|
||||
import android.support.v4.view.GravityCompat;
|
||||
import android.support.v4.widget.DrawerLayout;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
public class MailListActivity extends ActionBarActivity {
|
||||
private CharSequence mDrawerTitle;
|
||||
private CharSequence mTitle;
|
||||
private SharedPreferences mSharedPrefs;
|
||||
|
||||
/**
|
||||
* Navigation drawer variables
|
||||
*/
|
||||
private DrawerLayout mDrawerLayout;
|
||||
private FolderAdapter mFolderAdapter;
|
||||
private ListView mFolderList;
|
||||
private ActionBarDrawerToggle mDrawerToggle;
|
||||
|
||||
private String mActiveFolder;
|
||||
|
||||
private static final String SHARED_PREFS = "i2p.bote";
|
||||
private static final String PREF_NAV_DRAWER_OPENED = "navDrawerOpened";
|
||||
private static final String ACTIVE_FOLDER = "activeFolder";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
// Initialize variables
|
||||
mTitle = mDrawerTitle = getTitle();
|
||||
mSharedPrefs = getSharedPreferences(SHARED_PREFS, 0);
|
||||
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
|
||||
mFolderAdapter = new FolderAdapter(this);
|
||||
mFolderList = (ListView) findViewById(R.id.drawer);
|
||||
|
||||
// Set the list of folders
|
||||
// XXX: Does this need a loader?
|
||||
mFolderAdapter.setData(I2PBote.getInstance().getEmailFolders());
|
||||
|
||||
// Set a custom shadow that overlays the main content when the drawer opens
|
||||
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
|
||||
mFolderList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
|
||||
// Set the adapter for the list view
|
||||
mFolderList.setAdapter(mFolderAdapter);
|
||||
// Set the list's click listener
|
||||
mFolderList.setOnItemClickListener(new DrawerItemClickListener());
|
||||
|
||||
// Enable ActionBar app icon to behave as action to toggle nav drawer
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setHomeButtonEnabled(true);
|
||||
|
||||
// Set up drawer toggle
|
||||
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
|
||||
R.drawable.ic_drawer, 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;
|
||||
getSupportActionBar().setTitle(mTitle);
|
||||
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.commit();
|
||||
}
|
||||
getSupportActionBar().setTitle(mDrawerTitle);
|
||||
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);
|
||||
|
||||
mActiveFolder = "";
|
||||
if (savedInstanceState != null) {
|
||||
mActiveFolder = savedInstanceState.getString(ACTIVE_FOLDER);
|
||||
}
|
||||
FolderFragment f = FolderFragment.newInstance(mActiveFolder);
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.add(R.id.list_fragment, f).commit();
|
||||
|
||||
// Open nav drawer if the user has never opened it themselves
|
||||
if (!mSharedPrefs.getBoolean(PREF_NAV_DRAWER_OPENED, false))
|
||||
mDrawerLayout.openDrawer(mFolderList);
|
||||
}
|
||||
|
||||
private class DrawerItemClickListener implements ListView.OnItemClickListener {
|
||||
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
|
||||
EmailFolder folder = mFolderAdapter.getItem(pos);
|
||||
FolderFragment f = FolderFragment.newInstance(folder.getName());
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.replace(R.id.list_fragment, f).commit();
|
||||
mDrawerLayout.closeDrawer(mFolderList);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putString(ACTIVE_FOLDER, mActiveFolder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu
|
||||
getMenuInflater().inflate(R.menu.main, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
// Handle action buttons and overflow
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTitle(CharSequence title) {
|
||||
mTitle = title;
|
||||
getSupportActionBar().setTitle(mTitle);
|
||||
}
|
||||
|
||||
@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);
|
||||
// Pass any configuration change to the drawer toggle
|
||||
mDrawerToggle.onConfigurationChanged(newConfig);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user