diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 3544323..46e8406 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -22,6 +22,7 @@ + diff --git a/res/layout/activity_view_email.xml b/res/layout/activity_view_email.xml new file mode 100644 index 0000000..80a99db --- /dev/null +++ b/res/layout/activity_view_email.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/res/layout/fragment_view_email.xml b/res/layout/fragment_view_email.xml new file mode 100644 index 0000000..5cc88a0 --- /dev/null +++ b/res/layout/fragment_view_email.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/src/i2p/bote/FolderFragment.java b/src/i2p/bote/FolderFragment.java index 4e61469..7ee0916 100644 --- a/src/i2p/bote/FolderFragment.java +++ b/src/i2p/bote/FolderFragment.java @@ -7,10 +7,13 @@ import i2p.bote.email.Email; import i2p.bote.fileencryption.PasswordException; import i2p.bote.folder.EmailFolder; import i2p.bote.util.BoteHelper; +import android.app.Activity; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; +import android.view.View; +import android.widget.ListView; public class FolderFragment extends ListFragment implements LoaderManager.LoaderCallbacks> { @@ -18,6 +21,8 @@ public class FolderFragment extends ListFragment implements private static final int EMAIL_LIST_LOADER = 1; + OnEmailSelectedListener mCallback; + private EmailListAdapter mAdapter; private EmailFolder mFolder; @@ -29,6 +34,25 @@ public class FolderFragment extends ListFragment implements return f; } + // Container Activity must implement this interface + public interface OnEmailSelectedListener { + public void onEmailSelected(String folderName, String messageId); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + // This makes sure that the container activity has implemented + // the callback interface. If not, it throws an exception + try { + mCallback = (OnEmailSelectedListener) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement OnEmailSelectedListener"); + } + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -60,6 +84,13 @@ public class FolderFragment extends ListFragment implements } } + @Override + public void onListItemClick(ListView parent, View view, int pos, long id) { + super.onListItemClick(parent, view, pos, id); + mCallback.onEmailSelected( + mFolder.getName(), mAdapter.getItem(pos).getMessageID()); + } + // LoaderManager.LoaderCallbacks> public Loader> onCreateLoader(int id, Bundle args) { diff --git a/src/i2p/bote/MailListActivity.java b/src/i2p/bote/MailListActivity.java index ec769f7..3ff0c10 100644 --- a/src/i2p/bote/MailListActivity.java +++ b/src/i2p/bote/MailListActivity.java @@ -3,6 +3,7 @@ package i2p.bote; import i2p.bote.folder.EmailFolder; import android.os.Bundle; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.support.v4.app.ActionBarDrawerToggle; @@ -15,7 +16,8 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ListView; -public class MailListActivity extends ActionBarActivity { +public class MailListActivity extends ActionBarActivity implements + FolderFragment.OnEmailSelectedListener { private CharSequence mDrawerTitle; private CharSequence mTitle; private SharedPreferences mSharedPrefs; @@ -195,4 +197,16 @@ public class MailListActivity extends ActionBarActivity { System.setProperty("wrapper.logfile", myDir + "/wrapper.log"); } } + + // FolderFragment.OnEmailSelectedListener + + @Override + public void onEmailSelected(String folderName, String messageId) { + // In single-pane mode, simply start the detail activity + // for the selected message ID. + Intent detailIntent = new Intent(this, ViewEmailActivity.class); + detailIntent.putExtra(ViewEmailActivity.FOLDER_NAME, folderName); + detailIntent.putExtra(ViewEmailActivity.MESSAGE_ID, messageId); + startActivity(detailIntent); + } } diff --git a/src/i2p/bote/ViewEmailActivity.java b/src/i2p/bote/ViewEmailActivity.java new file mode 100644 index 0000000..0ef56cb --- /dev/null +++ b/src/i2p/bote/ViewEmailActivity.java @@ -0,0 +1,92 @@ +package i2p.bote; + +import java.util.ArrayList; +import java.util.List; + +import i2p.bote.folder.EmailFolder; +import i2p.bote.util.BoteHelper; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.app.ActionBarActivity; + +public class ViewEmailActivity extends ActionBarActivity { + public static final String FOLDER_NAME = "folder_name"; + public static final String MESSAGE_ID = "message_id"; + + private EmailFolder mFolder; + private ViewPager mPager; + private ViewEmailPagerAdapter mPagerAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_email); + + Intent i = getIntent(); + String folderName = i.getStringExtra(FOLDER_NAME); + mFolder = BoteHelper.getMailFolder( + folderName == null ? "inbox" : folderName); + String messageId = i.getStringExtra(MESSAGE_ID); + + // Instantiate the ViewPager and PagerAdapter + mPager = (ViewPager) findViewById(R.id.pager); + mPagerAdapter = new ViewEmailPagerAdapter(getSupportFragmentManager()); + mPager.setAdapter(mPagerAdapter); + + // Start with a "fake" list of messageIds containing only + // the selected messageId, so the UI starts up quickly + List messageIds = new ArrayList(); + messageIds.add(messageId); + mPagerAdapter.setData(messageIds); + + // Now fire off a Loader to fetch the real list + // TODO: Implement + } + + private class ViewEmailPagerAdapter extends FragmentStatePagerAdapter { + private List mIds; + + public ViewEmailPagerAdapter(FragmentManager fm) { + super(fm); + } + + public void setData(List data) { + mIds = data; + notifyDataSetChanged(); + } + + @Override + public Fragment getItem(int position) { + if (mIds == null) + return null; + + return ViewEmailFragment.newInstance( + mFolder.getName(), mIds.get(position)); + } + + @Override + public int getItemPosition(Object item) { + ViewEmailFragment f = (ViewEmailFragment) item; + String messageId = f.getMessageId(); + int position = mIds.indexOf(messageId); + + if (position >= 0) + return position; + else + return POSITION_NONE; + } + + @Override + public int getCount() { + if (mIds == null) + return 0; + else + return mIds.size(); + } + } +} diff --git a/src/i2p/bote/ViewEmailFragment.java b/src/i2p/bote/ViewEmailFragment.java new file mode 100644 index 0000000..4407b38 --- /dev/null +++ b/src/i2p/bote/ViewEmailFragment.java @@ -0,0 +1,65 @@ +package i2p.bote; + +import javax.mail.MessagingException; + +import i2p.bote.email.Email; +import i2p.bote.fileencryption.PasswordException; +import i2p.bote.util.BoteHelper; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +public class ViewEmailFragment extends Fragment { + private String mFolderName; + private String mMessageId; + + public static ViewEmailFragment newInstance( + String folderName, String messageId) { + ViewEmailFragment f = new ViewEmailFragment(); + + Bundle args = new Bundle(); + args.putString("folderName", folderName); + args.putString("messageId", messageId); + f.setArguments(args); + + return f; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mFolderName = getArguments() != null ? getArguments().getString("folderName") : "inbox"; + mMessageId = getArguments() != null ? getArguments().getString("messageId") : "1"; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_view_email, container, false); + TextView subject = (TextView) v.findViewById(R.id.email_subject); + + try { + Email e = BoteHelper.getEmail(mFolderName, mMessageId); + if (e != null) { + subject.setText(e.getSubject()); + } else { + subject.setText("Email not found"); + } + } catch (PasswordException e) { + // TODO: Handle + e.printStackTrace(); + } catch (MessagingException e) { + // TODO Handle + e.printStackTrace(); + } + + return v; + } + + public String getMessageId() { + return mMessageId; + } +}