diff --git a/res/drawable-hdpi/drawer_shadow.9.png b/res/drawable-hdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..224cc4ff43a29c546ae50c654c20c58c2f4cdb75 Binary files /dev/null and b/res/drawable-hdpi/drawer_shadow.9.png differ diff --git a/res/drawable-hdpi/ic_drawer.png b/res/drawable-hdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7b1def9ac3f86488a855f502b965ac75b633fb Binary files /dev/null and b/res/drawable-hdpi/ic_drawer.png differ diff --git a/res/drawable-mdpi/drawer_shadow.9.png b/res/drawable-mdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3797f99c0ef9f657c2b0a1f84a4d0f16cc8ee5f4 Binary files /dev/null and b/res/drawable-mdpi/drawer_shadow.9.png differ diff --git a/res/drawable-mdpi/ic_drawer.png b/res/drawable-mdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..fb681ba2639897cc4646d3784b97bbe16f5d4e91 Binary files /dev/null and b/res/drawable-mdpi/ic_drawer.png differ diff --git a/res/drawable-xhdpi/drawer_shadow.9.png b/res/drawable-xhdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3d853e902401d850f09b1cc50a58cda9bd3bb5 Binary files /dev/null and b/res/drawable-xhdpi/drawer_shadow.9.png differ diff --git a/res/drawable-xhdpi/ic_drawer.png b/res/drawable-xhdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bc3d70f1d29fec2e4530e5d1809edc8e15ad35 Binary files /dev/null and b/res/drawable-xhdpi/ic_drawer.png differ diff --git a/res/layout/activity_main.xml b/res/layout/activity_main.xml new file mode 100644 index 0000000000000000000000000000000000000000..6f2591c940efdd482921ad93d4f2c8e0015451ee --- /dev/null +++ b/res/layout/activity_main.xml @@ -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=".MainActivity" > + + <!-- The main content view --> + <FrameLayout + android:id="@+id/main_content" + 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> \ No newline at end of file diff --git a/res/layout/main.xml b/res/layout/fragment_main.xml similarity index 100% rename from res/layout/main.xml rename to res/layout/fragment_main.xml diff --git a/res/values/arrays.xml b/res/values/arrays.xml index ed6cc84d1896bb97d1fed34932dbe99f2f09e29f..cb3ecd8c3108dfcf5ba08e1a81a7ab049410f448 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <resources> + <string-array name="main_fragments"> + <item>net.i2p.android.router.activity.MainFragment</item> + </string-array> + <string-array name="main_fragment_titles"> + <item>I2P</item> + </string-array> <string-array name="setting0to3"> <item>0</item> <item>1</item> diff --git a/res/values/strings.xml b/res/values/strings.xml index 280690a2fb9acff8af07656df2533e794bc0a02a..484455be9c4482e499b1248f6d8d23bd6f3dde29 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -23,6 +23,8 @@ <string name="label_website_nonanon">Web Site (non-anon)</string> <string name="label_faq_nonanon">FAQ (non-anon)</string> + <string name="drawer_open">Open nav</string> + <string name="drawer_close">Close nav</string> <string name="action_add">Add</string> <string name="action_router_start">Start Router</string> <string name="action_router_stop">Stop Router</string> diff --git a/src/net/i2p/android/router/activity/AddressbookActivity.java b/src/net/i2p/android/router/activity/AddressbookActivity.java index 6d3068acb50ec6188d3410b21193e68dcf78d2e8..6c533583f82b76001bb23b55a6ae02ceba9016ea 100644 --- a/src/net/i2p/android/router/activity/AddressbookActivity.java +++ b/src/net/i2p/android/router/activity/AddressbookActivity.java @@ -66,7 +66,7 @@ public class AddressbookActivity extends ActionBarActivity { lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int pos, long id) { CharSequence host = ((TextView) view).getText(); - Intent intent = new Intent(view.getContext(), WebActivity.class); + Intent intent = new Intent(view.getContext(), WebFragment.class); intent.setData(Uri.parse("http://" + host + '/')); startActivity(intent); } diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PFragmentBase.java similarity index 86% rename from src/net/i2p/android/router/activity/I2PActivityBase.java rename to src/net/i2p/android/router/activity/I2PFragmentBase.java index 5b04f77bff27caa9c3e13189e7e638f4c11154ff..15d467beac0da677c50b484c571484271ef6763e 100644 --- a/src/net/i2p/android/router/activity/I2PActivityBase.java +++ b/src/net/i2p/android/router/activity/I2PFragmentBase.java @@ -6,6 +6,7 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.os.Bundle; import android.os.IBinder; +import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuInflater; @@ -23,7 +24,7 @@ import net.i2p.router.peermanager.ProfileOrganizer; import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.stat.StatManager; -public abstract class I2PActivityBase extends ActionBarActivity { +public abstract class I2PFragmentBase extends Fragment { protected String _myDir; protected boolean _isBound; protected boolean _triedBind; @@ -43,14 +44,9 @@ public abstract class I2PActivityBase extends ActionBarActivity { { Util.i(this + " onCreate called"); super.onCreate(savedInstanceState); - _myDir = getFilesDir().getAbsolutePath(); - } - - @Override - public void onRestart() - { - Util.i(this + " onRestart called"); - super.onRestart(); + _myDir = getActivity().getFilesDir().getAbsolutePath(); + // Set this so onCreateOptionsMenu() is called + setHasOptionsMenu(true); } @Override @@ -58,7 +54,7 @@ public abstract class I2PActivityBase extends ActionBarActivity { { Util.i(this + " onStart called"); super.onStart(); - _sharedPrefs = getSharedPreferences(SHARED_PREFS, 0); + _sharedPrefs = getActivity().getSharedPreferences(SHARED_PREFS, 0); if (_sharedPrefs.getBoolean(PREF_AUTO_START, DEFAULT_AUTO_START)) startRouter(); else @@ -113,6 +109,14 @@ public abstract class I2PActivityBase extends ActionBarActivity { super.onStop(); } + /** + * Called by MainActivity.onBackPressed() + * @return true if the fragment should stay, false otherwise. + */ + public boolean onBackPressed() { + return false; + } + @Override public void onDestroy() { @@ -121,18 +125,16 @@ public abstract class I2PActivityBase extends ActionBarActivity { } @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu1, menu); - return true; } @Override - public boolean onPrepareOptionsMenu(Menu menu) { + public void onPrepareOptionsMenu(Menu menu) { // add/hide items here RouterService svc = _routerService; boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) && - Util.isConnected(this); + Util.isConnected(getActivity()); MenuItem start = menu.findItem(R.id.menu_start); start.setVisible(showStart); start.setEnabled(showStart); @@ -142,39 +144,37 @@ public abstract class I2PActivityBase extends ActionBarActivity { stop.setVisible(showStop); stop.setEnabled(showStop); - boolean showHome = ! (this instanceof MainActivity); + boolean showHome = ! (this instanceof MainFragment); MenuItem home = menu.findItem(R.id.menu_home); home.setVisible(showHome); home.setEnabled(showHome); - boolean showAddressbook = (this instanceof WebActivity); + boolean showAddressbook = (this instanceof WebFragment); MenuItem addressbook = menu.findItem(R.id.menu_addressbook); addressbook.setVisible(showAddressbook); addressbook.setEnabled(showAddressbook); - boolean showReload = showAddressbook || (this instanceof PeersActivity); + boolean showReload = showAddressbook || (this instanceof PeersFragment); MenuItem reload = menu.findItem(R.id.menu_reload); reload.setVisible(showReload); reload.setEnabled(showReload); - - return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_settings: - Intent intent = new Intent(I2PActivityBase.this, SettingsActivity.class); + Intent intent = new Intent(getActivity(), SettingsActivity.class); startActivity(intent); return true; case R.id.menu_home: - Intent i2 = new Intent(I2PActivityBase.this, MainActivity.class); + Intent i2 = new Intent(getActivity(), MainActivity.class); startActivity(i2); return true; case R.id.menu_addressbook: - Intent i3 = new Intent(I2PActivityBase.this, AddressbookActivity.class); + Intent i3 = new Intent(getActivity(), AddressbookActivity.class); startActivity(i3); return true; @@ -209,9 +209,9 @@ public abstract class I2PActivityBase extends ActionBarActivity { */ protected boolean startRouter() { Intent intent = new Intent(); - intent.setClassName(this, "net.i2p.android.router.service.RouterService"); + intent.setClassName(getActivity(), "net.i2p.android.router.service.RouterService"); Util.i(this + " calling startService"); - ComponentName name = startService(intent); + ComponentName name = getActivity().startService(intent); if (name == null) Util.i(this + " XXXXXXXXXXXXXXXXXXXX got from startService: " + name); Util.i(this + " got from startService: " + name); @@ -226,10 +226,10 @@ public abstract class I2PActivityBase extends ActionBarActivity { */ protected boolean bindRouter(boolean autoCreate) { Intent intent = new Intent(); - intent.setClassName(this, "net.i2p.android.router.service.RouterService"); + intent.setClassName(getActivity(), "net.i2p.android.router.service.RouterService"); Util.i(this + " calling bindService"); _connection = new RouterConnection(); - _triedBind = bindService(intent, _connection, autoCreate ? BIND_AUTO_CREATE : 0); + _triedBind = getActivity().bindService(intent, _connection, autoCreate ? getActivity().BIND_AUTO_CREATE : 0); Util.i(this + " bindService: auto create? " + autoCreate + " success? " + _triedBind); return _triedBind; } @@ -237,7 +237,7 @@ public abstract class I2PActivityBase extends ActionBarActivity { protected void unbindRouter() { Util.i(this + " unbindRouter called with _isBound:" + _isBound + " _connection:" + _connection + " _triedBind:" + _triedBind); if (_triedBind && _connection != null) - unbindService(_connection); + getActivity().unbindService(_connection); _triedBind = false; _connection = null; diff --git a/src/net/i2p/android/router/activity/I2PWebViewClient.java b/src/net/i2p/android/router/activity/I2PWebViewClient.java index 375bb1478dd570a467dda1b5fae46535d272a816..f5be46f4fa5f83f086abbd1e10381f7eead85b80 100644 --- a/src/net/i2p/android/router/activity/I2PWebViewClient.java +++ b/src/net/i2p/android/router/activity/I2PWebViewClient.java @@ -38,10 +38,6 @@ class I2PWebViewClient extends WebViewClient { private static final String ERROR_URL = "<p>Unable to load URL: "; private static final String ERROR_ROUTER = "<p>Your router (or the HTTP proxy) does not appear to be running.</p>"; - public I2PWebViewClient(Context ctx) { - super(); - } - @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Util.d("Should override? " + url); diff --git a/src/net/i2p/android/router/activity/LicenseActivity.java b/src/net/i2p/android/router/activity/LicenseActivity.java index c124559c09c102a25e889eaf5376de0e9d72f98a..a0e455cdc9110ed2f4ad37374b3730bc02dcbf38 100644 --- a/src/net/i2p/android/router/activity/LicenseActivity.java +++ b/src/net/i2p/android/router/activity/LicenseActivity.java @@ -36,8 +36,8 @@ public class LicenseActivity extends ListActivity { // set the callback lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int pos, long id) { - Intent intent = new Intent(view.getContext(), TextResourceActivity.class); - intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, files[pos]); + Intent intent = new Intent(view.getContext(), TextResourceFragment.class); + intent.putExtra(TextResourceFragment.TEXT_RESOURCE_ID, files[pos]); startActivity(intent); } }); diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java index c0af403a93e92d711982da1eebc4bca4c64f6236..3e50320292ac3370947f2e18e177667921f0bb9f 100644 --- a/src/net/i2p/android/router/activity/MainActivity.java +++ b/src/net/i2p/android/router/activity/MainActivity.java @@ -1,508 +1,159 @@ package net.i2p.android.router.activity; +import net.i2p.android.router.R; +import net.i2p.android.router.util.Util; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; -import android.net.Uri; +import android.content.res.Configuration; import android.os.Bundle; -import android.os.Handler; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +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.MenuInflater; +import android.view.MenuItem; import android.view.View; -import android.widget.Button; -import android.widget.TextView; -import java.io.File; -import java.text.DecimalFormat; -import net.i2p.android.router.R; -import net.i2p.android.router.service.RouterService; -import net.i2p.android.router.util.Util; -import net.i2p.data.DataHelper; -import net.i2p.router.RouterContext; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; -public class MainActivity extends I2PActivityBase { +public class MainActivity extends ActionBarActivity { + private DrawerLayout mDrawerLayout; + private ListView mDrawerList; + private ActionBarDrawerToggle mDrawerToggle; - private Handler _handler; - private Runnable _updater; - private Runnable _oneShotUpdate; - private String _savedStatus; - private String _ourVersion; - private boolean _keep = true; - private boolean _startPressed = false; - protected static final String PROP_NEW_INSTALL = "i2p.newInstall"; - protected static final String PROP_NEW_VERSION = "i2p.newVersion"; - protected static final int DIALOG_NEW_INSTALL = 0; - protected static final int DIALOG_NEW_VERSION = 1; - - @Override - public void onPostCreate(Bundle savedInstanceState) { - Util.i("Initializing..."); - InitActivities init = new InitActivities(this); - init.debugStuff(); - init.initialize(); - super.onPostCreate(savedInstanceState); - _ourVersion = Util.getOurVersion(this); - } + private CharSequence mDrawerTitle; + private CharSequence mTitle; + private String[] mFragments; + private String[] mFragmentTitles; - /** - * Called when the activity is first created. - */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // Init stuff here so settings work. - _myDir = getFilesDir().getAbsolutePath(); - if(savedInstanceState != null) { - String saved = savedInstanceState.getString("status"); - if(saved != null) { - _savedStatus = saved; - } - } - - _keep = true; - setContentView(R.layout.main); - - Button b = (Button) findViewById(R.id.news_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), NewsActivity.class); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.releasenotes_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), TextResourceActivity.class); - intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.licenses_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), LicenseActivity.class); - //Intent intent = new Intent(view.getContext(), TextResourceActivity.class); - //intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.licenses_txt); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.website_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), WebActivity.class); - //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/").build()); - intent.setData(Uri.parse("http://www.i2p2.de/")); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.faq_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), WebActivity.class); - //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/faq").build()); - intent.setData(Uri.parse("http://www.i2p2.de/faq")); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.welcome_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), WebActivity.class); - intent.putExtra(WebActivity.HTML_RESOURCE_ID, R.raw.welcome_html); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.addressbook_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), AddressbookActivity.class); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.logs_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), LogActivity.class); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.error_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), LogActivity.class); - intent.putExtra(LogActivity.ERRORS_ONLY, true); - startActivity(intent); - } - }); - - b = (Button) findViewById(R.id.peers_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), PeersActivity.class); - startActivity(intent); - } - }); - - /* - * hidden, unused b = (Button) findViewById(R.id.router_stop_button); - * b.setOnClickListener(new View.OnClickListener() { public void - * onClick(View view) { RouterService svc = _routerService; if (svc != - * null && _isBound) { setPref(PREF_AUTO_START, false); - * svc.manualStop(); updateOneShot(); } } }); - */ - - b = (Button) findViewById(R.id.router_start_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - _startPressed = true; - RouterService svc = _routerService; - if(svc != null && _isBound) { - setPref(PREF_AUTO_START, true); - svc.manualStart(); - } else { - (new File(_myDir, "wrapper.log")).delete(); - startRouter(); - } - updateOneShot(); - } - }); - - b = (Button) findViewById(R.id.router_quit_button); - b.setOnClickListener(new View.OnClickListener() { - - public void onClick(View view) { - RouterService svc = _routerService; - if(svc != null && _isBound) { - setPref(PREF_AUTO_START, false); - svc.manualQuit(); - updateOneShot(); - } - } - }); - - _handler = new Handler(); - _updater = new Updater(); - _oneShotUpdate = new OneShotUpdate(); - } - - @Override - public void onStart() { - super.onStart(); - _handler.removeCallbacks(_updater); - _handler.removeCallbacks(_oneShotUpdate); - if(_savedStatus != null) { - TextView tv = (TextView) findViewById(R.id.main_status_text); - tv.setText(_savedStatus); + setContentView(R.layout.activity_main); + + mTitle = mDrawerTitle = getTitle(); + mFragments = getResources().getStringArray(R.array.main_fragments); + mFragmentTitles = getResources().getStringArray(R.array.main_fragment_titles); + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerList = (ListView) findViewById(R.id.drawer); + + // Set a custom shadow that overlays the main content when the drawer opens + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + // Set the adapter for the list view + mDrawerList.setAdapter(new ArrayAdapter<String>(this, + android.R.layout.simple_list_item_1, mFragments)); + // Set the list's click listener + mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); + + // Enable ActionBar app icon to behave as action to toggle nav drawer + //getSupportActionBar().setDisplayHomeAsUpEnabled(true); + //getSupportActionBar().setHomeButtonEnabled(true); + + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { + + /** Called when a drawer has settled in a completely closed state. */ + public void onDrawerClosed(View view) { + getSupportActionBar().setTitle(mTitle); + supportInvalidateOptionsMenu(); + } + + /** Called when a drawer has settled in a completely open state. */ + public void onDrawerOpened(View view) { + getSupportActionBar().setTitle(mDrawerTitle); + supportInvalidateOptionsMenu(); + } + }; + + // Set the drawer toggle as the DrawerListener + mDrawerLayout.setDrawerListener(mDrawerToggle); + + // Start with the home view + if (savedInstanceState == null) { + MainFragment mainFragment = new MainFragment(); + mainFragment.setArguments(getIntent().getExtras()); + getSupportFragmentManager().beginTransaction() + .add(R.id.main_content, mainFragment).commit(); } - checkDialog(); - _handler.postDelayed(_updater, 100); - } - - @Override - public void onStop() { - super.onStop(); - _handler.removeCallbacks(_updater); - _handler.removeCallbacks(_oneShotUpdate); } + /* Called whenever we call invalidateOptionsMenu() */ @Override - public void onResume() { - super.onResume(); - updateOneShot(); + public boolean onPrepareOptionsMenu(Menu menu) { + // If the nav drawer is open, hide action items related to the content view + boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); + //menu.findItem(R.id.action_add_to_addressbook).setVisible(!drawerOpen); + return super.onPrepareOptionsMenu(menu); } @Override - public void onSaveInstanceState(Bundle outState) { - if(_savedStatus != null) { - outState.putString("status", _savedStatus); - } - super.onSaveInstanceState(outState); - } - - private void updateOneShot() { - _handler.postDelayed(_oneShotUpdate, 100); - } - - private class OneShotUpdate implements Runnable { - - public void run() { - updateVisibility(); - updateStatus(); + 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 + return super.onOptionsItemSelected(item); } - private class Updater implements Runnable { - - private int counter; - private final int delay = 1000; - private final int toloop = delay / 500; - public void run() { - updateVisibility(); - if(counter++ % toloop == 0) { - updateStatus(); - } - //_handler.postDelayed(this, 2500); - _handler.postDelayed(this, delay); + private class DrawerItemClickListener implements ListView.OnItemClickListener { + public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { + selectItem(pos); } } - private void updateVisibility() { - RouterService svc = _routerService; - boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) - && Util.isConnected(this); - Button start = (Button) findViewById(R.id.router_start_button); - start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE); + private void selectItem(int pos) { + Fragment fragment = Fragment.instantiate(MainActivity.this, mFragments[pos]); - boolean showStop = svc != null && _isBound && svc.canManualStop(); - // Old stop but leave in memory. Always hide for now. - // Button stop = (Button) findViewById(R.id.router_stop_button); - // stop.setVisibility( /* showStop ? View.VISIBLE : */ View.INVISIBLE); + // Insert the fragment by replacing any existing fragment + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction() + .replace(R.id.main_content, fragment) + .commit(); - Button quit = (Button) findViewById(R.id.router_quit_button); - quit.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE); + // Highlight the selected item, update the title, and close the drawer + mDrawerList.setItemChecked(pos, true); + setTitle(mFragmentTitles[pos]); + mDrawerLayout.closeDrawer(mDrawerList); } @Override - public void onBackPressed() { - RouterContext ctx = getRouterContext(); - // RouterService svc = _routerService; Which is better to use?! - _keep = Util.isConnected(this) && (ctx != null || _startPressed); - Util.d("*********************************************************"); - Util.d("Back pressed, Keep? " + _keep); - Util.d("*********************************************************"); - super.onBackPressed(); + public void setTitle(CharSequence title) { + mTitle = title; + getSupportActionBar().setTitle(mTitle); } @Override - public void onDestroy() { - super.onDestroy(); - if(!_keep) { - Thread t = new Thread(new KillMe()); - t.start(); - } - } - - private class KillMe implements Runnable { - - public void run() { - Util.d("*********************************************************"); - Util.d("KillMe started!"); - Util.d("*********************************************************"); - try { - Thread.sleep(500); // is 500ms long enough? - } catch(InterruptedException ex) { - } - System.exit(0); - } - } - - private void updateStatus() { - RouterContext ctx = getRouterContext(); - TextView tv = (TextView) findViewById(R.id.main_status_text); - - if(!Util.isConnected(this)) { - tv.setText("Router version: " + _ourVersion + "\nNo Internet connection is available"); - tv.setVisibility(View.VISIBLE); - } else if(ctx != null) { - if(_startPressed) { - _startPressed = false; - } - short reach = ctx.commSystem().getReachabilityStatus(); - int active = ctx.commSystem().countActivePeers(); - int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0); - int inEx = ctx.tunnelManager().getFreeTunnelCount(); - int outEx = ctx.tunnelManager().getOutboundTunnelCount(); - int inCl = ctx.tunnelManager().getInboundClientTunnelCount(); - int outCl = ctx.tunnelManager().getOutboundClientTunnelCount(); - int part = ctx.tunnelManager().getParticipatingCount(); - double dLag = ctx.statManager().getRate("jobQueue.jobLag").getRate(60000).getAverageValue(); - String jobLag = DataHelper.formatDuration((long) dLag); - String msgDelay = DataHelper.formatDuration(ctx.throttle().getMessageDelay()); - String uptime = DataHelper.formatDuration(ctx.router().getUptime()); - - String netstatus = "Unknown"; - if(reach == net.i2p.router.CommSystemFacade.STATUS_DIFFERENT) { - netstatus = "Different"; - } - if(reach == net.i2p.router.CommSystemFacade.STATUS_HOSED) { - netstatus = "Hosed"; - } - if(reach == net.i2p.router.CommSystemFacade.STATUS_OK) { - netstatus = "OK"; - } - if(reach == net.i2p.router.CommSystemFacade.STATUS_REJECT_UNSOLICITED) { - netstatus = "Reject Unsolicited"; - } - String tunnelStatus = ctx.throttle().getTunnelStatus(); - //ctx.commSystem().getReachabilityStatus(); - double inBW = ctx.bandwidthLimiter().getReceiveBps() / 1024; - double outBW = ctx.bandwidthLimiter().getSendBps() / 1024; - - // control total width - DecimalFormat fmt; - if(inBW >= 1000 || outBW >= 1000) { - fmt = new DecimalFormat("#0"); - } else if(inBW >= 100 || outBW >= 100) { - fmt = new DecimalFormat("#0.0"); - } else { - fmt = new DecimalFormat("#0.00"); - } - - double kBytesIn = ctx.bandwidthLimiter().getTotalAllocatedInboundBytes() / 1024; - double kBytesOut = ctx.bandwidthLimiter().getTotalAllocatedOutboundBytes() / 1024; - - // control total width - DecimalFormat kBfmt; - if(kBytesIn >= 1000 || kBytesOut >= 1000) { - kBfmt = new DecimalFormat("#0"); - } else if(kBytesIn >= 100 || kBytesOut >= 100) { - kBfmt = new DecimalFormat("#0.0"); - } else { - kBfmt = new DecimalFormat("#0.00"); - } - - String status = - "ROUTER STATUS" - + "\nNetwork: " + netstatus - + "\nPeers active/known: " + active + " / " + known - + "\nExploratory Tunnels in/out: " + inEx + " / " + outEx - + "\nClient Tunnels in/out: " + inCl + " / " + outCl; - - - // Need to see if we have the participation option set to on. - // I thought there was a router method for that? I guess not! WHY NOT? - // It would be easier if we had a number to test status. - String participate = "\nParticipation: " + tunnelStatus +" (" + part + ")"; - - String details = - "\nBandwidth in/out: " + fmt.format(inBW) + " / " + fmt.format(outBW) + " KBps" - + "\nData usage in/out: " + kBfmt.format(kBytesIn) + " / " + kBfmt.format(kBytesOut) + " KB" - + "\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) - + "B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' - + "\nJob Lag: " + jobLag - + "\nMsg Delay: " + msgDelay - + "\nUptime: " + uptime; - - _savedStatus = "Router version: " + _ourVersion + "\n" + status + participate + details; - tv.setText(_savedStatus); - tv.setVisibility(View.VISIBLE); - } else { - // network but no router context - tv.setText("Router version: " + _ourVersion + "\n"); - //tv.setVisibility(View.INVISIBLE); - /** - * ** - * RouterService svc = _routerService; String status = "connected? " - * + Util.isConnected(this) + "\nMemory: " + - * DataHelper.formatSize(Runtime.getRuntime().totalMemory() - - * Runtime.getRuntime().freeMemory()) + "B / " + - * DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' + - * "\nhave ctx? " + (ctx != null) + "\nhave svc? " + (svc != null) + - * "\nis bound? " + _isBound + "\nsvc state: " + (svc == null ? - * "null" : svc.getState()) + "\ncan start? " + (svc == null ? - * "null" : svc.canManualStart()) + "\ncan stop? " + (svc == null ? - * "null" : svc.canManualStop()); tv.setText(status); - * tv.setVisibility(View.VISIBLE); - *** - */ - } + protected void onPostCreate(Bundle savedInstanceState) { + Util.i("Initializing..."); + InitActivities init = new InitActivities(this); + init.debugStuff(); + init.initialize(); + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); } - private void checkDialog() { - String oldVersion = getPref(PREF_INSTALLED_VERSION, "??"); - if(oldVersion.equals("??")) { - showDialog(DIALOG_NEW_INSTALL); - } else { - String currentVersion = Util.getOurVersion(this); - if(!oldVersion.equals(currentVersion)) { - showDialog(DIALOG_NEW_VERSION); - } - } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Pass any configuration change to the drawer toggle + mDrawerToggle.onConfigurationChanged(newConfig); } @Override - protected Dialog onCreateDialog(int id) { - final String currentVersion = Util.getOurVersion(this); - Dialog rv = null; - AlertDialog.Builder b = new AlertDialog.Builder(this); - switch(id) { - case DIALOG_NEW_INSTALL: - b.setMessage(getResources().getText(R.string.welcome_new_install)).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int id) { - setPref(PREF_INSTALLED_VERSION, currentVersion); - dialog.cancel(); - MainActivity.this.removeDialog(id); - } - }).setNeutralButton("Release Notes", new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int id) { - setPref(PREF_INSTALLED_VERSION, currentVersion); - dialog.cancel(); - MainActivity.this.removeDialog(id); - Intent intent = new Intent(MainActivity.this, TextResourceActivity.class); - intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt); - startActivity(intent); - } - }).setNegativeButton("Licenses", new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int id) { - setPref(PREF_INSTALLED_VERSION, currentVersion); - dialog.cancel(); - MainActivity.this.removeDialog(id); - Intent intent = new Intent(MainActivity.this, LicenseActivity.class); - startActivity(intent); - } - }); - rv = b.create(); - break; - - case DIALOG_NEW_VERSION: - b.setMessage(getResources().getText(R.string.welcome_new_version) + " " + currentVersion).setCancelable(true).setPositiveButton("OK", new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int id) { - setPref(PREF_INSTALLED_VERSION, currentVersion); - try { - dialog.dismiss(); - } catch(Exception e) { - } - MainActivity.this.removeDialog(id); - } - }).setNegativeButton("Release Notes", new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int id) { - setPref(PREF_INSTALLED_VERSION, currentVersion); - try { - dialog.dismiss(); - } catch(Exception e) { - } - MainActivity.this.removeDialog(id); - Intent intent = new Intent(MainActivity.this, TextResourceActivity.class); - intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt); - startActivity(intent); - } - }); - - rv = b.create(); - break; + public void onBackPressed() { + I2PFragmentBase fragment = (I2PFragmentBase) getSupportFragmentManager().findFragmentById(R.id.main_content); + // If we shouldn't stay on this fragment, go back. + if (!fragment.onBackPressed()) { + super.onBackPressed(); } - return rv; } } diff --git a/src/net/i2p/android/router/activity/MainFragment.java b/src/net/i2p/android/router/activity/MainFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..40b1b979ec736c7121d5e7e7f8d14b449cb71940 --- /dev/null +++ b/src/net/i2p/android/router/activity/MainFragment.java @@ -0,0 +1,507 @@ +package net.i2p.android.router.activity; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; +import java.io.File; +import java.text.DecimalFormat; +import net.i2p.android.router.R; +import net.i2p.android.router.service.RouterService; +import net.i2p.android.router.util.Util; +import net.i2p.data.DataHelper; +import net.i2p.router.RouterContext; + +public class MainFragment extends I2PFragmentBase { + + private Handler _handler; + private Runnable _updater; + private Runnable _oneShotUpdate; + private String _savedStatus; + private String _ourVersion; + private boolean _keep = true; + private boolean _startPressed = false; + protected static final String PROP_NEW_INSTALL = "i2p.newInstall"; + protected static final String PROP_NEW_VERSION = "i2p.newVersion"; + protected static final int DIALOG_NEW_INSTALL = 0; + protected static final int DIALOG_NEW_VERSION = 1; + + /** + * Called when the fragment is first created. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Init stuff here so settings work. + _myDir = getActivity().getFilesDir().getAbsolutePath(); + if(savedInstanceState != null) { + String saved = savedInstanceState.getString("status"); + if(saved != null) { + _savedStatus = saved; + } + } + _ourVersion = Util.getOurVersion(getActivity()); + + _keep = true; + + _handler = new Handler(); + _updater = new Updater(); + _oneShotUpdate = new OneShotUpdate(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_main, container, false); + + Button b = (Button) v.findViewById(R.id.news_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), NewsFragment.class); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.releasenotes_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), TextResourceFragment.class); + intent.putExtra(TextResourceFragment.TEXT_RESOURCE_ID, R.raw.releasenotes_txt); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.licenses_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), LicenseActivity.class); + //Intent intent = new Intent(view.getContext(), TextResourceActivity.class); + //intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.licenses_txt); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.website_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), WebFragment.class); + //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/").build()); + intent.setData(Uri.parse("http://www.i2p2.de/")); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.faq_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), WebFragment.class); + //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/faq").build()); + intent.setData(Uri.parse("http://www.i2p2.de/faq")); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.welcome_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), WebFragment.class); + intent.putExtra(WebFragment.HTML_RESOURCE_ID, R.raw.welcome_html); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.addressbook_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), AddressbookActivity.class); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.logs_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), LogActivity.class); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.error_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), LogActivity.class); + intent.putExtra(LogActivity.ERRORS_ONLY, true); + startActivity(intent); + } + }); + + b = (Button) v.findViewById(R.id.peers_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), PeersFragment.class); + startActivity(intent); + } + }); + + /* + * hidden, unused b = (Button) v.findViewById(R.id.router_stop_button); + * b.setOnClickListener(new View.OnClickListener() { public void + * onClick(View view) { RouterService svc = _routerService; if (svc != + * null && _isBound) { setPref(PREF_AUTO_START, false); + * svc.manualStop(); updateOneShot(); } } }); + */ + + b = (Button) v.findViewById(R.id.router_start_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + _startPressed = true; + RouterService svc = _routerService; + if(svc != null && _isBound) { + setPref(PREF_AUTO_START, true); + svc.manualStart(); + } else { + (new File(_myDir, "wrapper.log")).delete(); + startRouter(); + } + updateOneShot(); + } + }); + + b = (Button) v.findViewById(R.id.router_quit_button); + b.setOnClickListener(new View.OnClickListener() { + + public void onClick(View view) { + RouterService svc = _routerService; + if(svc != null && _isBound) { + setPref(PREF_AUTO_START, false); + svc.manualQuit(); + updateOneShot(); + } + } + }); + + return v; + } + + @Override + public void onStart() { + super.onStart(); + _handler.removeCallbacks(_updater); + _handler.removeCallbacks(_oneShotUpdate); + if(_savedStatus != null) { + TextView tv = (TextView) getActivity().findViewById(R.id.main_status_text); + tv.setText(_savedStatus); + } + checkDialog(); + _handler.postDelayed(_updater, 100); + } + + @Override + public void onStop() { + super.onStop(); + _handler.removeCallbacks(_updater); + _handler.removeCallbacks(_oneShotUpdate); + } + + @Override + public void onResume() { + super.onResume(); + updateOneShot(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + if(_savedStatus != null) { + outState.putString("status", _savedStatus); + } + super.onSaveInstanceState(outState); + } + + private void updateOneShot() { + _handler.postDelayed(_oneShotUpdate, 100); + } + + private class OneShotUpdate implements Runnable { + + public void run() { + updateVisibility(); + updateStatus(); + } + } + + private class Updater implements Runnable { + + private int counter; + private final int delay = 1000; + private final int toloop = delay / 500; + public void run() { + updateVisibility(); + if(counter++ % toloop == 0) { + updateStatus(); + } + //_handler.postDelayed(this, 2500); + _handler.postDelayed(this, delay); + } + } + + private void updateVisibility() { + RouterService svc = _routerService; + boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) + && Util.isConnected(getActivity()); + Button start = (Button) getActivity().findViewById(R.id.router_start_button); + start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE); + + boolean showStop = svc != null && _isBound && svc.canManualStop(); + // Old stop but leave in memory. Always hide for now. + // Button stop = (Button) findViewById(R.id.router_stop_button); + // stop.setVisibility( /* showStop ? View.VISIBLE : */ View.INVISIBLE); + + Button quit = (Button) getActivity().findViewById(R.id.router_quit_button); + quit.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE); + } + + public boolean onBackPressed() { + RouterContext ctx = getRouterContext(); + // RouterService svc = _routerService; Which is better to use?! + _keep = Util.isConnected(getActivity()) && (ctx != null || _startPressed); + Util.d("*********************************************************"); + Util.d("Back pressed, Keep? " + _keep); + Util.d("*********************************************************"); + return false; + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(!_keep) { + Thread t = new Thread(new KillMe()); + t.start(); + } + } + + private class KillMe implements Runnable { + + public void run() { + Util.d("*********************************************************"); + Util.d("KillMe started!"); + Util.d("*********************************************************"); + try { + Thread.sleep(500); // is 500ms long enough? + } catch(InterruptedException ex) { + } + System.exit(0); + } + } + + private void updateStatus() { + RouterContext ctx = getRouterContext(); + TextView tv = (TextView) getActivity().findViewById(R.id.main_status_text); + + if(!Util.isConnected(getActivity())) { + tv.setText("Router version: " + _ourVersion + "\nNo Internet connection is available"); + tv.setVisibility(View.VISIBLE); + } else if(ctx != null) { + if(_startPressed) { + _startPressed = false; + } + short reach = ctx.commSystem().getReachabilityStatus(); + int active = ctx.commSystem().countActivePeers(); + int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0); + int inEx = ctx.tunnelManager().getFreeTunnelCount(); + int outEx = ctx.tunnelManager().getOutboundTunnelCount(); + int inCl = ctx.tunnelManager().getInboundClientTunnelCount(); + int outCl = ctx.tunnelManager().getOutboundClientTunnelCount(); + int part = ctx.tunnelManager().getParticipatingCount(); + double dLag = ctx.statManager().getRate("jobQueue.jobLag").getRate(60000).getAverageValue(); + String jobLag = DataHelper.formatDuration((long) dLag); + String msgDelay = DataHelper.formatDuration(ctx.throttle().getMessageDelay()); + String uptime = DataHelper.formatDuration(ctx.router().getUptime()); + + String netstatus = "Unknown"; + if(reach == net.i2p.router.CommSystemFacade.STATUS_DIFFERENT) { + netstatus = "Different"; + } + if(reach == net.i2p.router.CommSystemFacade.STATUS_HOSED) { + netstatus = "Hosed"; + } + if(reach == net.i2p.router.CommSystemFacade.STATUS_OK) { + netstatus = "OK"; + } + if(reach == net.i2p.router.CommSystemFacade.STATUS_REJECT_UNSOLICITED) { + netstatus = "Reject Unsolicited"; + } + String tunnelStatus = ctx.throttle().getTunnelStatus(); + //ctx.commSystem().getReachabilityStatus(); + double inBW = ctx.bandwidthLimiter().getReceiveBps() / 1024; + double outBW = ctx.bandwidthLimiter().getSendBps() / 1024; + + // control total width + DecimalFormat fmt; + if(inBW >= 1000 || outBW >= 1000) { + fmt = new DecimalFormat("#0"); + } else if(inBW >= 100 || outBW >= 100) { + fmt = new DecimalFormat("#0.0"); + } else { + fmt = new DecimalFormat("#0.00"); + } + + double kBytesIn = ctx.bandwidthLimiter().getTotalAllocatedInboundBytes() / 1024; + double kBytesOut = ctx.bandwidthLimiter().getTotalAllocatedOutboundBytes() / 1024; + + // control total width + DecimalFormat kBfmt; + if(kBytesIn >= 1000 || kBytesOut >= 1000) { + kBfmt = new DecimalFormat("#0"); + } else if(kBytesIn >= 100 || kBytesOut >= 100) { + kBfmt = new DecimalFormat("#0.0"); + } else { + kBfmt = new DecimalFormat("#0.00"); + } + + String status = + "ROUTER STATUS" + + "\nNetwork: " + netstatus + + "\nPeers active/known: " + active + " / " + known + + "\nExploratory Tunnels in/out: " + inEx + " / " + outEx + + "\nClient Tunnels in/out: " + inCl + " / " + outCl; + + + // Need to see if we have the participation option set to on. + // I thought there was a router method for that? I guess not! WHY NOT? + // It would be easier if we had a number to test status. + String participate = "\nParticipation: " + tunnelStatus +" (" + part + ")"; + + String details = + "\nBandwidth in/out: " + fmt.format(inBW) + " / " + fmt.format(outBW) + " KBps" + + "\nData usage in/out: " + kBfmt.format(kBytesIn) + " / " + kBfmt.format(kBytesOut) + " KB" + + "\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + + "B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' + + "\nJob Lag: " + jobLag + + "\nMsg Delay: " + msgDelay + + "\nUptime: " + uptime; + + _savedStatus = "Router version: " + _ourVersion + "\n" + status + participate + details; + tv.setText(_savedStatus); + tv.setVisibility(View.VISIBLE); + } else { + // network but no router context + tv.setText("Router version: " + _ourVersion + "\n"); + //tv.setVisibility(View.INVISIBLE); + /** + * ** + * RouterService svc = _routerService; String status = "connected? " + * + Util.isConnected(this) + "\nMemory: " + + * DataHelper.formatSize(Runtime.getRuntime().totalMemory() - + * Runtime.getRuntime().freeMemory()) + "B / " + + * DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' + + * "\nhave ctx? " + (ctx != null) + "\nhave svc? " + (svc != null) + + * "\nis bound? " + _isBound + "\nsvc state: " + (svc == null ? + * "null" : svc.getState()) + "\ncan start? " + (svc == null ? + * "null" : svc.canManualStart()) + "\ncan stop? " + (svc == null ? + * "null" : svc.canManualStop()); tv.setText(status); + * tv.setVisibility(View.VISIBLE); + *** + */ + } + } + + private void checkDialog() { + String oldVersion = getPref(PREF_INSTALLED_VERSION, "??"); + /*if(oldVersion.equals("??")) { + getActivity().showDialog(DIALOG_NEW_INSTALL); + } else { + String currentVersion = Util.getOurVersion(getActivity()); + if(!oldVersion.equals(currentVersion)) { + getActivity().showDialog(DIALOG_NEW_VERSION); + } + }*/ + } + + /*@Override + protected Dialog onCreateDialog(int id) { + final String currentVersion = Util.getOurVersion(this); + Dialog rv = null; + AlertDialog.Builder b = new AlertDialog.Builder(this); + switch(id) { + case DIALOG_NEW_INSTALL: + b.setMessage(getResources().getText(R.string.welcome_new_install)).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int id) { + setPref(PREF_INSTALLED_VERSION, currentVersion); + dialog.cancel(); + MainActivity.this.removeDialog(id); + } + }).setNeutralButton("Release Notes", new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int id) { + setPref(PREF_INSTALLED_VERSION, currentVersion); + dialog.cancel(); + MainActivity.this.removeDialog(id); + Intent intent = new Intent(MainActivity.this, TextResourceActivity.class); + intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt); + startActivity(intent); + } + }).setNegativeButton("Licenses", new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int id) { + setPref(PREF_INSTALLED_VERSION, currentVersion); + dialog.cancel(); + MainActivity.this.removeDialog(id); + Intent intent = new Intent(MainActivity.this, LicenseActivity.class); + startActivity(intent); + } + }); + rv = b.create(); + break; + + case DIALOG_NEW_VERSION: + b.setMessage(getResources().getText(R.string.welcome_new_version) + " " + currentVersion).setCancelable(true).setPositiveButton("OK", new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int id) { + setPref(PREF_INSTALLED_VERSION, currentVersion); + try { + dialog.dismiss(); + } catch(Exception e) { + } + MainActivity.this.removeDialog(id); + } + }).setNegativeButton("Release Notes", new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int id) { + setPref(PREF_INSTALLED_VERSION, currentVersion); + try { + dialog.dismiss(); + } catch(Exception e) { + } + MainActivity.this.removeDialog(id); + Intent intent = new Intent(MainActivity.this, TextResourceActivity.class); + intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt); + startActivity(intent); + } + }); + + rv = b.create(); + break; + } + return rv; + }*/ +} diff --git a/src/net/i2p/android/router/activity/NewsActivity.java b/src/net/i2p/android/router/activity/NewsFragment.java similarity index 76% rename from src/net/i2p/android/router/activity/NewsActivity.java rename to src/net/i2p/android/router/activity/NewsFragment.java index efe1ffdd5f32d12cb1e94154055d0db26e273243..a744c350de72b8d370ba403445abdcebfa0a93a2 100644 --- a/src/net/i2p/android/router/activity/NewsActivity.java +++ b/src/net/i2p/android/router/activity/NewsFragment.java @@ -3,6 +3,9 @@ package net.i2p.android.router.activity; import android.content.res.Resources; import android.os.Bundle; import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.webkit.WebView; import android.widget.TextView; import java.io.ByteArrayOutputStream; @@ -14,7 +17,7 @@ import java.io.UnsupportedEncodingException; import net.i2p.android.apps.NewsFetcher; import net.i2p.android.router.R; -public class NewsActivity extends I2PActivityBase { +public class NewsFragment extends I2PFragmentBase { private I2PWebViewClient _wvClient; private long _lastChanged; @@ -29,17 +32,18 @@ public class NewsActivity extends I2PActivityBase { private static final String FOOTER = "</body></html>"; @Override - public void onCreate(Bundle savedInstanceState) + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.news); - WebView wv = (WebView) findViewById(R.id.news_webview); + View v = inflater.inflate(R.layout.news, container, false); + WebView wv = (WebView) v.findViewById(R.id.news_webview); wv.getSettings().setLoadsImagesAutomatically(false); // http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855 wv.getSettings().setUseWideViewPort(true); - _wvClient = new I2PWebViewClient(this); + _wvClient = new I2PWebViewClient(); wv.setWebViewClient(_wvClient); wv.getSettings().setBuiltInZoomControls(true); + return v; } @Override @@ -49,7 +53,7 @@ public class NewsActivity extends I2PActivityBase { NewsFetcher nf = NewsFetcher.getInstance(); if (nf != null) { // always update the text - TextView tv = (TextView) findViewById(R.id.news_status); + TextView tv = (TextView) getActivity().findViewById(R.id.news_status); tv.setText(WARNING + nf.status().replace(" ", " ")); } @@ -60,7 +64,7 @@ public class NewsActivity extends I2PActivityBase { return; _lastChanged = System.currentTimeMillis(); - WebView wv = (WebView) findViewById(R.id.news_webview); + WebView wv = (WebView) getActivity().findViewById(R.id.news_webview); InputStream in = null; ByteArrayOutputStream out = new ByteArrayOutputStream(2048); @@ -94,16 +98,14 @@ public class NewsActivity extends I2PActivityBase { } @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - WebView wv = (WebView) findViewById(R.id.news_webview); - if ((keyCode == KeyEvent.KEYCODE_BACK)) { - _wvClient.cancelAll(); - wv.stopLoading(); - if (wv.canGoBack()) { - wv.goBack(); - return true; - } + public boolean onBackPressed() { + WebView wv = (WebView) getActivity().findViewById(R.id.news_webview); + _wvClient.cancelAll(); + wv.stopLoading(); + if (wv.canGoBack()) { + wv.goBack(); + return true; } - return super.onKeyDown(keyCode, event); + return false; } } diff --git a/src/net/i2p/android/router/activity/PeersActivity.java b/src/net/i2p/android/router/activity/PeersFragment.java similarity index 71% rename from src/net/i2p/android/router/activity/PeersActivity.java rename to src/net/i2p/android/router/activity/PeersFragment.java index 395ec02802a33f415eacc39fcd88f4eee74f5f48..83be6bbaad427a1b647dc21dbf77ed2607f66d9d 100644 --- a/src/net/i2p/android/router/activity/PeersActivity.java +++ b/src/net/i2p/android/router/activity/PeersFragment.java @@ -2,7 +2,10 @@ package net.i2p.android.router.activity; import android.os.Bundle; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import android.webkit.WebView; import java.io.IOException; import java.io.StringWriter; @@ -11,7 +14,7 @@ import net.i2p.android.router.service.RouterService; import net.i2p.android.router.util.Util; import net.i2p.router.CommSystemFacade; -public class PeersActivity extends I2PActivityBase { +public class PeersFragment extends I2PFragmentBase { private I2PWebViewClient _wvClient; @@ -20,17 +23,18 @@ public class PeersActivity extends I2PActivityBase { private static final String FOOTER = "</body></html>"; @Override - public void onCreate(Bundle savedInstanceState) + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.peers); - WebView wv = (WebView) findViewById(R.id.peers_webview); + View v = inflater.inflate(R.layout.peers, container, false); + WebView wv = (WebView) v.findViewById(R.id.peers_webview); wv.getSettings().setLoadsImagesAutomatically(true); // was false // http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855 wv.getSettings().setUseWideViewPort(true); - _wvClient = new I2PWebViewClient(this); + _wvClient = new I2PWebViewClient(); wv.setWebViewClient(_wvClient); wv.getSettings().setBuiltInZoomControls(true); + return v; } @Override @@ -49,7 +53,7 @@ public class PeersActivity extends I2PActivityBase { } private void update() { - WebView wv = (WebView) findViewById(R.id.peers_webview); + WebView wv = (WebView) getActivity().findViewById(R.id.peers_webview); wv.clearHistory(); // fixes having to hit back. CommSystemFacade comm = getCommSystem(); String data; @@ -77,25 +81,23 @@ public class PeersActivity extends I2PActivityBase { } @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - WebView wv = (WebView) findViewById(R.id.peers_webview); - if ((keyCode == KeyEvent.KEYCODE_BACK)) { - _wvClient.cancelAll(); - wv.stopLoading(); + public boolean onBackPressed() { + WebView wv = (WebView) getActivity().findViewById(R.id.peers_webview); + _wvClient.cancelAll(); + wv.stopLoading(); - // We do not want to go back, or keep history... Theere is no need to. - // What we DO want to do is exit! - //if (wv.canGoBack()) { - // wv.goBack(); - // return true; - //} - } - return super.onKeyDown(keyCode, event); + // We do not want to go back, or keep history... There is no need to. + // What we DO want to do is exit! + //if (wv.canGoBack()) { + // wv.goBack(); + // return true; + //} + return false; } @Override public boolean onOptionsItemSelected(MenuItem item) { - WebView wv = (WebView) findViewById(R.id.peers_webview); + WebView wv = (WebView) getActivity().findViewById(R.id.peers_webview); switch (item.getItemId()) { case R.id.menu_reload: update(); diff --git a/src/net/i2p/android/router/activity/TextResourceActivity.java b/src/net/i2p/android/router/activity/TextResourceFragment.java similarity index 77% rename from src/net/i2p/android/router/activity/TextResourceActivity.java rename to src/net/i2p/android/router/activity/TextResourceFragment.java index b9c2ed33d1d7050ee6177c727b7e8edd6fcd08d4..6bd00c21768d1d463b3ff5ff891ba053639e4235 100644 --- a/src/net/i2p/android/router/activity/TextResourceActivity.java +++ b/src/net/i2p/android/router/activity/TextResourceFragment.java @@ -4,6 +4,9 @@ import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.widget.TextView; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -16,24 +19,25 @@ import net.i2p.android.router.util.Util; * Display a raw text resource. * The resource ID must be passed as an extra in the intent. */ -public class TextResourceActivity extends I2PActivityBase { +public class TextResourceFragment extends I2PFragmentBase { final static String TEXT_RESOURCE_ID = "text_resource_id"; @Override - public void onCreate(Bundle savedInstanceState) + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.text_resource); - TextView tv = (TextView) findViewById(R.id.text_resource_text); + View v = inflater.inflate(R.layout.text_resource, container, false); + TextView tv = (TextView) v.findViewById(R.id.text_resource_text); tv.setMovementMethod(ScrollingMovementMethod.getInstance()); - Intent intent = getIntent(); + Intent intent = getActivity().getIntent(); int id = intent.getIntExtra(TEXT_RESOURCE_ID, R.raw.releasenotes_txt); if (id == R.raw.releasenotes_txt) - tv.setText("Release Notes for Release " + Util.getOurVersion(this) + "\n\n" + + tv.setText("Release Notes for Release " + Util.getOurVersion(getActivity()) + "\n\n" + getResourceAsString(id)); else tv.setText(getResourceAsString(id)); + return v; } private String getResourceAsString(int id) { diff --git a/src/net/i2p/android/router/activity/WebActivity.java b/src/net/i2p/android/router/activity/WebFragment.java similarity index 75% rename from src/net/i2p/android/router/activity/WebActivity.java rename to src/net/i2p/android/router/activity/WebFragment.java index b1953ff1ffffdfa6c176544faa3417fac58a10b1..0b6f04b2a8fecb462965245cfd4f1a409c75f28c 100644 --- a/src/net/i2p/android/router/activity/WebActivity.java +++ b/src/net/i2p/android/router/activity/WebFragment.java @@ -5,7 +5,10 @@ import android.content.res.Resources; import android.net.Uri; import android.os.Bundle; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import android.webkit.WebView; import android.widget.TextView; import java.io.ByteArrayOutputStream; @@ -14,7 +17,7 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import net.i2p.android.router.R; -public class WebActivity extends I2PActivityBase { +public class WebFragment extends I2PFragmentBase { private I2PWebViewClient _wvClient; @@ -24,19 +27,19 @@ public class WebActivity extends I2PActivityBase { "not anonymous. I2P pages may not load images or CSS."; @Override - public void onCreate(Bundle savedInstanceState) + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.web); - TextView tv = (TextView) findViewById(R.id.browser_status); + View v = inflater.inflate(R.layout.web, container, false); + TextView tv = (TextView) v.findViewById(R.id.browser_status); tv.setText(WARNING); - WebView wv = (WebView) findViewById(R.id.browser_webview); - _wvClient = new I2PWebViewClient(this); + WebView wv = (WebView) v.findViewById(R.id.browser_webview); + _wvClient = new I2PWebViewClient(); wv.setWebViewClient(_wvClient); wv.getSettings().setBuiltInZoomControls(true); // http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855 wv.getSettings().setUseWideViewPort(true); - Intent intent = getIntent(); + Intent intent = getActivity().getIntent(); Uri uri = intent.getData(); if (uri != null) { //wv.getSettings().setLoadsImagesAutomatically(true); @@ -50,6 +53,7 @@ public class WebActivity extends I2PActivityBase { if (id != 0) loadResource(wv, id); } + return v; } private void loadResource(WebView wv, int id) { @@ -77,24 +81,22 @@ public class WebActivity extends I2PActivityBase { } @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - WebView wv = (WebView) findViewById(R.id.browser_webview); - if ((keyCode == KeyEvent.KEYCODE_BACK)) { - _wvClient.cancelAll(); - wv.stopLoading(); - if (wv.canGoBack()) { - // TODO go into history, get url and call shouldOverrideUrlLoading() - // so we have control ??? But then back won't work right - wv.goBack(); - return true; - } + public boolean onBackPressed() { + WebView wv = (WebView) getActivity().findViewById(R.id.browser_webview); + _wvClient.cancelAll(); + wv.stopLoading(); + if (wv.canGoBack()) { + // TODO go into history, get url and call shouldOverrideUrlLoading() + // so we have control ??? But then back won't work right + wv.goBack(); + return true; } - return super.onKeyDown(keyCode, event); + return false; } @Override public boolean onOptionsItemSelected(MenuItem item) { - WebView wv = (WebView) findViewById(R.id.browser_webview); + WebView wv = (WebView) getActivity().findViewById(R.id.browser_webview); switch (item.getItemId()) { case R.id.menu_reload: _wvClient.cancelAll();