--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/LobbyActivity.java Mon Jul 23 00:17:06 2012 +0200
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/LobbyActivity.java Tue Jul 24 16:57:48 2012 +0200
@@ -1,51 +1,113 @@
package org.hedgewars.hedgeroid.netplay;
-import java.util.ArrayList;
-
import org.hedgewars.hedgeroid.R;
+import org.hedgewars.hedgeroid.netplay.NetplayService.NetplayBinder;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.ServiceConnection;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
+import android.os.IBinder;
import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.view.ViewPager;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TabHost;
-import android.widget.TabWidget;
+import android.widget.TextView;
+import android.widget.Toast;
public class LobbyActivity extends FragmentActivity {
- TabHost mTabHost;
- ViewPager mViewPager;
- TabsAdapter mTabsAdapter;
-
+ private TabHost tabHost;
+ private NetplayService service;
+
+ private final BroadcastReceiver disconnectReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String message = intent.getStringExtra(NetplayService.EXTRA_MESSAGE);
+ Toast.makeText(getApplicationContext(), "Disconnected: "+message, Toast.LENGTH_LONG).show();
+ finish();
+ }
+ };
+
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(disconnectReceiver, new IntentFilter(NetplayService.ACTION_DISCONNECTED));
+ bindService(new Intent(this, NetplayService.class), serviceConnection, 0);
setContentView(R.layout.activity_lobby);
- mTabHost = (TabHost)findViewById(android.R.id.tabhost);
- if(mTabHost != null) {
- mTabHost.setup();
-
- mViewPager = (ViewPager)findViewById(R.id.pager);
-
- mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
+ tabHost = (TabHost)findViewById(android.R.id.tabhost);
+ if(tabHost != null) {
+ tabHost.setup();
+ tabHost.getTabWidget().setOrientation(LinearLayout.VERTICAL);
+
+ tabHost.addTab(tabHost.newTabSpec("rooms").setIndicator(createIndicatorView(tabHost, "Rooms", null)).setContent(R.id.roomListFragment));
+ tabHost.addTab(tabHost.newTabSpec("chat").setIndicator(createIndicatorView(tabHost, "Chat", null)).setContent(R.id.chatFragment));
+ tabHost.addTab(tabHost.newTabSpec("players").setIndicator(createIndicatorView(tabHost, "Players", null)).setContent(R.id.playerListFragment));
- mTabsAdapter.addTab(mTabHost.newTabSpec("roomlist").setIndicator("Rooms"),
- RoomlistFragment.class, null);
- mTabsAdapter.addTab(mTabHost.newTabSpec("chat").setIndicator("Chat"),
- LobbyChatFragment.class, null);
- mTabsAdapter.addTab(mTabHost.newTabSpec("players").setIndicator("Players"),
- PlayerlistFragment.class, null);
-
- if (savedInstanceState != null) {
- mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
+ if (icicle != null) {
+ tabHost.setCurrentTabByTag(icicle.getString("currentTab"));
}
}
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(disconnectReceiver);
+ unbindService(serviceConnection);
+ }
+
+ private View createIndicatorView(TabHost tabHost, CharSequence label, Drawable icon) {
+ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ View tabIndicator = inflater.inflate(R.layout.tab_indicator,
+ tabHost.getTabWidget(), // tab widget is the parent
+ false); // no inflate params
+
+ final TextView tv = (TextView) tabIndicator.findViewById(R.id.title);
+ tv.setText(label);
+
+ if(icon != null) {
+ final ImageView iconView = (ImageView) tabIndicator.findViewById(R.id.icon);
+ iconView.setImageDrawable(icon);
+ }
+
+ return tabIndicator;
+ }
+
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ getMenuInflater().inflate(R.menu.lobby_options, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch(item.getItemId()) {
+ case R.id.room_create:
+ Toast.makeText(this, R.string.not_implemented_yet, Toast.LENGTH_SHORT).show();
+ return true;
+ case R.id.disconnect:
+ if(service != null && service.isConnected()) {
+ service.disconnect();
+ }
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
/*@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
@@ -78,108 +140,20 @@
}*/
@Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if(mTabHost != null) {
- outState.putString("tab", mTabHost.getCurrentTabTag());
+ protected void onSaveInstanceState(Bundle icicle) {
+ super.onSaveInstanceState(icicle);
+ if(tabHost != null) {
+ icicle.putString("currentTab", tabHost.getCurrentTabTag());
}
}
-
- /**
- * This is a helper class that implements the management of tabs and all
- * details of connecting a ViewPager with associated TabHost. It relies on a
- * trick. Normally a tab host has a simple API for supplying a View or
- * Intent that each tab will show. This is not sufficient for switching
- * between pages. So instead we make the content part of the tab host
- * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
- * view to show as the tab content. It listens to changes in tabs, and takes
- * care of switch to the correct paged in the ViewPager whenever the selected
- * tab changes.
- */
- public static class TabsAdapter extends FragmentPagerAdapter
- implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
- private final Context mContext;
- private final TabHost mTabHost;
- private final ViewPager mViewPager;
- private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
-
- static final class TabInfo {
- private final Class<?> clss;
- private final Bundle args;
-
- TabInfo(Class<?> _class, Bundle _args) {
- clss = _class;
- args = _args;
- }
- }
-
- static class DummyTabFactory implements TabHost.TabContentFactory {
- private final Context mContext;
-
- public DummyTabFactory(Context context) {
- mContext = context;
- }
-
- public View createTabContent(String tag) {
- View v = new View(mContext);
- v.setMinimumWidth(0);
- v.setMinimumHeight(0);
- return v;
- }
+
+ private ServiceConnection serviceConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName className, IBinder binder) {
+ service = ((NetplayBinder) binder).getService();
}
- public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
- super(activity.getSupportFragmentManager());
- mContext = activity;
- mTabHost = tabHost;
- mViewPager = pager;
- mTabHost.setOnTabChangedListener(this);
- mViewPager.setAdapter(this);
- mViewPager.setOnPageChangeListener(this);
- }
-
- public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
- tabSpec.setContent(new DummyTabFactory(mContext));
-
- TabInfo info = new TabInfo(clss, args);
- mTabs.add(info);
- mTabHost.addTab(tabSpec);
- notifyDataSetChanged();
- }
-
- @Override
- public int getCount() {
- return mTabs.size();
+ public void onServiceDisconnected(ComponentName className) {
+ service = null;
}
-
- @Override
- public Fragment getItem(int position) {
- TabInfo info = mTabs.get(position);
- return Fragment.instantiate(mContext, info.clss.getName(), info.args);
- }
-
- public void onTabChanged(String tabId) {
- int position = mTabHost.getCurrentTab();
- mViewPager.setCurrentItem(position);
- }
-
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- }
-
- public void onPageSelected(int position) {
- // Unfortunately when TabHost changes the current tab, it kindly
- // also takes care of putting focus on it when not in touch mode.
- // The jerk.
- // This hack tries to prevent this from pulling focus out of our
- // ViewPager.
- TabWidget widget = mTabHost.getTabWidget();
- int oldFocusability = widget.getDescendantFocusability();
- widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
- mTabHost.setCurrentTab(position);
- widget.setDescendantFocusability(oldFocusability);
- }
-
- public void onPageScrollStateChanged(int state) {
- }
- }
+ };
}