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