From 6a2d494921fd8e9275aa388c828213dca23948a4 Mon Sep 17 00:00:00 2001 From: str4d <str4d@mail.i2p> Date: Tue, 19 Nov 2013 11:39:55 +0000 Subject: [PATCH] Show full Log entry in a detail page --- AndroidManifest.xml.in | 4 ++ res/layout/fragment_log_entry.xml | 7 +++ .../android/router/activity/LogActivity.java | 47 ++++++++++++++++++- .../router/activity/LogDetailActivity.java | 22 +++++++++ .../router/fragment/LogDetailFragment.java | 34 ++++++++++++++ .../android/router/fragment/LogFragment.java | 29 ++++++++++++ 6 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 res/layout/fragment_log_entry.xml create mode 100644 src/net/i2p/android/router/activity/LogDetailActivity.java create mode 100644 src/net/i2p/android/router/fragment/LogDetailFragment.java diff --git a/AndroidManifest.xml.in b/AndroidManifest.xml.in index 1c60ece10..5a61453c6 100644 --- a/AndroidManifest.xml.in +++ b/AndroidManifest.xml.in @@ -92,6 +92,10 @@ android:label="I2P Logs" android:parentActivityName=".activity.MainActivity" > </activity> + <activity android:name=".activity.LogDetailActivity" + android:label="Log Entry" + android:parentActivityName=".activity.LogActivity" > + </activity> <activity android:name=".activity.RateGraphActivity" android:label="Rate Graph" android:parentActivityName=".activity.MainActivity" > diff --git a/res/layout/fragment_log_entry.xml b/res/layout/fragment_log_entry.xml new file mode 100644 index 000000000..0333118c2 --- /dev/null +++ b/res/layout/fragment_log_entry.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/log_entry" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scrollbars="vertical" > +</TextView> diff --git a/src/net/i2p/android/router/activity/LogActivity.java b/src/net/i2p/android/router/activity/LogActivity.java index d6ba39c11..ab8dfa9b0 100644 --- a/src/net/i2p/android/router/activity/LogActivity.java +++ b/src/net/i2p/android/router/activity/LogActivity.java @@ -1,15 +1,29 @@ package net.i2p.android.router.activity; import net.i2p.android.router.R; +import net.i2p.android.router.fragment.LogDetailFragment; import net.i2p.android.router.fragment.LogFragment; +import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.widget.ArrayAdapter; import android.widget.SpinnerAdapter; -public class LogActivity extends I2PActivityBase { +public class LogActivity extends I2PActivityBase implements + LogFragment.OnEntrySelectedListener { + /** + * Whether or not the activity is in two-pane mode, i.e. running on a tablet + * device. + */ + private boolean mTwoPane; + private static final String SELECTED_LEVEL = "selected_level"; + @Override + protected boolean canUseTwoPanes() { + return true; + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -20,6 +34,14 @@ public class LogActivity extends I2PActivityBase { mDrawerToggle.setDrawerIndicatorEnabled(false); + if (findViewById(R.id.detail_fragment) != null) { + // The detail container view will be present only in the + // large-screen layouts (res/values-large and + // res/values-sw600dp). If this view is present, then the + // activity should be in two-pane mode. + mTwoPane = true; + } + SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.log_level_list, android.R.layout.simple_spinner_dropdown_item); @@ -29,6 +51,10 @@ public class LogActivity extends I2PActivityBase { public boolean onNavigationItemSelected(int position, long itemId) { String level = levels[position]; LogFragment f = LogFragment.newInstance(level); + // In two-pane mode, list items should be given the + // 'activated' state when touched. + if (mTwoPane) + f.setActivateOnItemClick(true); getSupportFragmentManager().beginTransaction() .replace(R.id.main_fragment, f, levels[position]).commit(); return true; @@ -49,4 +75,23 @@ public class LogActivity extends I2PActivityBase { outState.putInt(SELECTED_LEVEL, getSupportActionBar().getSelectedNavigationIndex()); } + + // LogFragment.OnEntrySelectedListener + + public void onEntrySelected(String entry) { + if (mTwoPane) { + // In two-pane mode, show the detail view in this activity by + // adding or replacing the detail fragment using a + // fragment transaction. + LogDetailFragment detailFrag = LogDetailFragment.newInstance(entry); + getSupportFragmentManager().beginTransaction() + .replace(R.id.detail_fragment, detailFrag).commit(); + } else { + // In single-pane mode, simply start the detail activity + // for the selected item ID. + Intent detailIntent = new Intent(this, LogDetailActivity.class); + detailIntent.putExtra(LogDetailFragment.LOG_ENTRY, entry); + startActivity(detailIntent); + } + } } diff --git a/src/net/i2p/android/router/activity/LogDetailActivity.java b/src/net/i2p/android/router/activity/LogDetailActivity.java new file mode 100644 index 000000000..3673e096b --- /dev/null +++ b/src/net/i2p/android/router/activity/LogDetailActivity.java @@ -0,0 +1,22 @@ +package net.i2p.android.router.activity; + +import android.os.Bundle; +import net.i2p.android.router.R; +import net.i2p.android.router.fragment.LogDetailFragment; + +public class LogDetailActivity extends I2PActivityBase { + LogDetailFragment mDetailFrag; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mDrawerToggle.setDrawerIndicatorEnabled(false); + + if (savedInstanceState == null) { + String entry = getIntent().getStringExtra(LogDetailFragment.LOG_ENTRY); + mDetailFrag = LogDetailFragment.newInstance(entry); + getSupportFragmentManager().beginTransaction() + .add(R.id.main_fragment, mDetailFrag).commit(); + } + } +} diff --git a/src/net/i2p/android/router/fragment/LogDetailFragment.java b/src/net/i2p/android/router/fragment/LogDetailFragment.java new file mode 100644 index 000000000..87816878a --- /dev/null +++ b/src/net/i2p/android/router/fragment/LogDetailFragment.java @@ -0,0 +1,34 @@ +package net.i2p.android.router.fragment; + +import net.i2p.android.router.R; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +public class LogDetailFragment extends I2PFragmentBase { + public static final String LOG_ENTRY = "log_entry"; + + private String mEntry; + + public static LogDetailFragment newInstance (String entry) { + LogDetailFragment f = new LogDetailFragment(); + Bundle args = new Bundle(); + args.putString(LOG_ENTRY, entry); + f.setArguments(args); + return f; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_log_entry, container, false); + + mEntry = getArguments().getString(LOG_ENTRY); + TextView tv = (TextView) v.findViewById(R.id.log_entry); + tv.setText(mEntry); + + return v; + } +} diff --git a/src/net/i2p/android/router/fragment/LogFragment.java b/src/net/i2p/android/router/fragment/LogFragment.java index a2e6be006..7e7749d55 100644 --- a/src/net/i2p/android/router/fragment/LogFragment.java +++ b/src/net/i2p/android/router/fragment/LogFragment.java @@ -1,5 +1,6 @@ package net.i2p.android.router.fragment; +import android.app.Activity; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; @@ -25,6 +26,7 @@ public class LogFragment extends ListFragment implements private static final int LEVEL_ERROR = 1; private static final int LEVEL_ALL = 2; + OnEntrySelectedListener mEntrySelectedCallback; private LogAdapter mAdapter; private TextView mHeaderView; private String mLogLevel; @@ -34,6 +36,11 @@ public class LogFragment extends ListFragment implements private int mActivatedPosition = ListView.INVALID_POSITION; private boolean mActivateOnItemClick = false; + // Container Activity must implement this interface + public interface OnEntrySelectedListener { + public void onEntrySelected(String entry); + } + public static LogFragment newInstance(String level) { LogFragment f = new LogFragment(); Bundle args = new Bundle(); @@ -42,6 +49,21 @@ public class LogFragment extends ListFragment implements return f; } + @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 { + mEntrySelectedCallback = (OnEntrySelectedListener) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement OnEntrySelectedListener"); + } + + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -86,6 +108,13 @@ public class LogFragment extends ListFragment implements R.string.router_not_running)); } + @Override + public void onListItemClick(ListView parent, View view, int pos, long id) { + super.onListItemClick(parent, view, pos, id); + String entry = mAdapter.getItem(pos); + mEntrySelectedCallback.onEntrySelected(entry); + } + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); -- GitLab