android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
+
+ <activity android:name=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
- <service android:name="org.eclipse.paho.android.service.MqttService" />
- <activity android:name=".AboutActivity" />
+ <activity android:name=".activity.AboutActivity" />
<activity android:name=".activity.SettingsActivity" />
<service
android:enabled="true"
android:exported="false" />
- <activity android:name=".HandbookActivity"
+ <activity
+ android:name=".activity.HandbookActivity"
android:icon="@mipmap/ic_shield_1"
android:label="@string/app_name_hand">
<!--
-package com.acmetensortoys.ctfwstimer;
+package com.acmetensortoys.ctfwstimer.activity;
import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
-import android.content.Context;
import android.content.Intent;
-import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Build;
-import android.os.IBinder;
import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TextView;
+import com.acmetensortoys.ctfwstimer.BuildConfig;
+import com.acmetensortoys.ctfwstimer.utils.CtFwSDisplayTinyChrono;
+import com.acmetensortoys.ctfwstimer.R;
import com.acmetensortoys.ctfwstimer.lib.CtFwSGameStateManager;
+import com.acmetensortoys.ctfwstimer.service.MainService;
import com.acmetensortoys.ctfwstimer.utils.CheckedAsyncDownloader;
import java.util.Arrays;
import java.util.Locale;
import java.util.SortedSet;
-public class AboutActivity extends AppCompatActivity {
+public class AboutActivity extends CtFwSActivityBase {
private static final String TAG = "About";
- private MainService.LocalBinder mSrvBinder;
private CtFwSDisplayTinyChrono mTitleChronoObs;
private static final String TAB_PROG = "TabProg";
}
};
- private void doRegisterObservers() {
+ protected void doRegisterObservers() {
mSrvBinder.registerObserver(mSrvObs);
mSrvBinder.getGameState().registerObserver(mCtFwSObs);
if (mTitleChronoObs != null) {
}
}
- private final ServiceConnection ctfwssc = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mSrvBinder = (MainService.LocalBinder) service;
- doRegisterObservers();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- mSrvBinder = null;
- }
- };
-
@Override
public void onStart() {
Log.d(TAG, "onStart");
super.onStart();
-
- if (mSrvBinder == null) {
- Intent si = new Intent(this, MainService.class);
- bindService(si, ctfwssc, Context.BIND_AUTO_CREATE | Context.BIND_ABOVE_CLIENT);
- }
}
@Override
public void onResume() {
Log.d(TAG, "onResume");
super.onResume();
-
- if (mSrvBinder != null) {
- doRegisterObservers();
- }
}
@Override
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
- unbindService(ctfwssc);
-
super.onDestroy();
}
}
--- /dev/null
+package com.acmetensortoys.ctfwstimer.activity;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.support.v7.app.AppCompatActivity;
+
+import com.acmetensortoys.ctfwstimer.service.MainService;
+
+/*
+ * Basically all of our activities bind to the MainService and so
+ * contain code that looks like this.
+ */
+
+public abstract class CtFwSActivityBase extends AppCompatActivity {
+
+ protected MainService.LocalBinder mSrvBinder;
+
+ /*
+ * Register the activity's observer(s). Unregister in onPause.
+ */
+ abstract protected void doRegisterObservers();
+
+ private final ServiceConnection ctfwssc = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mSrvBinder = (MainService.LocalBinder) service;
+ doRegisterObservers();
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mSrvBinder = null;
+ }
+ };
+
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ if (mSrvBinder == null) {
+ Intent si = new Intent(this, MainService.class);
+ bindService(si, ctfwssc, Context.BIND_AUTO_CREATE | Context.BIND_ABOVE_CLIENT);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if (mSrvBinder != null) {
+ doRegisterObservers();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ unbindService(ctfwssc);
+ super.onDestroy();
+ }
+}
-package com.acmetensortoys.ctfwstimer;
+package com.acmetensortoys.ctfwstimer.activity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.IBinder;
import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.SearchView;
import android.widget.Toast;
+import com.acmetensortoys.ctfwstimer.utils.CtFwSDisplayTinyChrono;
+import com.acmetensortoys.ctfwstimer.R;
+import com.acmetensortoys.ctfwstimer.service.MainService;
import com.acmetensortoys.ctfwstimer.utils.CheckedAsyncDownloader;
import java.io.File;
-public class HandbookActivity extends AppCompatActivity {
+public class HandbookActivity extends CtFwSActivityBase {
public static final String HAND_FILE_NAME = "handbook.html";
private static final String TAG = "CtFwSHandbook";
@Override
public void onHandbookFetch(MainService.LocalBinder b, CheckedAsyncDownloader.DL dl) {
display();
- if (dl.getResult() == CheckedAsyncDownloader.Result.RES_OK) {
+ if (dl != null && dl.getResult() == CheckedAsyncDownloader.Result.RES_OK) {
Toast.makeText(HandbookActivity.this,
R.string.hand_new,
Toast.LENGTH_SHORT)
}
};
- private MainService.LocalBinder mSrvBinder;
-
- private void doRegisterObservers() {
+ protected void doRegisterObservers() {
mSrvBinder.registerObserver(mSrvObs);
if (mTitleChronoObs != null) {
mSrvBinder.getGameState().registerObserver(mTitleChronoObs);
}
}
- private final ServiceConnection ctfwssc = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mSrvBinder = (MainService.LocalBinder) service;
- doRegisterObservers();
- mSrvBinder.connect(false);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- mSrvBinder = null;
- }
- };
-
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
public void onStart() {
Log.d(TAG, "onStart");
super.onStart();
-
- if (mSrvBinder == null) {
- Intent si = new Intent(this, MainService.class);
- bindService(si, ctfwssc, Context.BIND_AUTO_CREATE | Context.BIND_ABOVE_CLIENT);
- }
}
@Override
public void onResume() {
Log.d(TAG, "onResume");
super.onResume();
-
- if (mSrvBinder != null) {
- doRegisterObservers();
- }
}
@Override
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
- unbindService(ctfwssc);
-
super.onDestroy();
}
}
-package com.acmetensortoys.ctfwstimer;
+package com.acmetensortoys.ctfwstimer.activity;
import android.content.ComponentName;
import android.content.Context;
import android.view.WindowManager;
import android.widget.TextView;
+import com.acmetensortoys.ctfwstimer.BuildConfig;
+import com.acmetensortoys.ctfwstimer.R;
+import com.acmetensortoys.ctfwstimer.service.MainService;
import com.acmetensortoys.ctfwstimer.utils.AndroidResourceUtils;
+import com.acmetensortoys.ctfwstimer.utils.CheckedAsyncDownloader;
-public class MainActivity extends AppCompatActivity {
+public class MainActivity extends CtFwSActivityBase {
private static final String TAG = "CtFwS";
private final MainActivityBuildHooks mabh = new MainActivityBuildHooksImpl();
- private MainService.LocalBinder mSrvBinder; // set once connection completed
private MainService.MqttServerEvent mLastMSE;
private final MainService.Observer mSrvObs = new MainService.Observer() {
@Override
private MenuItem mMenuReconn;
- private CtFwSDisplayLocal mCdl; // set in onStart
+ private MainActivityCtFwSDisplay mCdl; // set in onStart
private TextView mTvSU; // set in onStart
private TextView mTvSS; // set in onStart
private void setServerStateText(@StringRes final int resid, Object... args) {
mTvSU = findViewById(R.id.tv_mqtt_server_uri);
mTvSS = findViewById(R.id.tv_mqtt_state);
- mCdl = new CtFwSDisplayLocal(this);
+ mCdl = new MainActivityCtFwSDisplay(this);
}
- private final ServiceConnection ctfwssc = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mSrvBinder = (MainService.LocalBinder) service;
- mSrvBinder.getGameState().registerObserver(mCdl);
- mSrvBinder.registerObserver(mSrvObs);
- mabh.onStart(MainActivity.this, mSrvBinder);
- mSrvBinder.connect(false);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- mSrvBinder = null;
- mLastMSE = MainService.MqttServerEvent.MSE_DISCONN; /* sort of, anyway */
- }
- };
+ protected void doRegisterObservers(){
+ mSrvBinder.getGameState().registerObserver(mCdl);
+ mSrvBinder.registerObserver(mSrvObs);
+ mabh.onRegisterObservers(MainActivity.this, mSrvBinder);
+ }
@Override
public void onStart() {
Log.d(TAG, "onStart");
super.onStart();
-
- if (mSrvBinder == null) {
- Intent si = new Intent(this, MainService.class);
- bindService(si, ctfwssc, Context.BIND_AUTO_CREATE | Context.BIND_ABOVE_CLIENT);
- }
}
@Override
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
- unbindService(ctfwssc);
-
super.onDestroy();
}
case R.id.mainmenu_hand:
startActivity(new Intent(this, HandbookActivity.class));
return true;
+ case R.id.mainmenu_judge:
+ startActivity(new Intent(this, JudgeActivity.class));
+ return true;
case R.id.mainmenu_screenwake:
boolean checked = mi.isChecked();
if (checked) {
-package com.acmetensortoys.ctfwstimer;
+package com.acmetensortoys.ctfwstimer.activity;
+
+import com.acmetensortoys.ctfwstimer.service.MainService;
// The MainActivity expects a "MainActivityBuildHooksImpl" class that ascribes to this interface
// per build flavor. This will be used when, for example, we kick on Google Play for Wear
// interaction and want to push messages out to the wearable data network.
-interface MainActivityBuildHooks {
- void onStart(MainActivity ma, MainService.LocalBinder b);
+public interface MainActivityBuildHooks {
+ void onRegisterObservers(MainActivity ma, MainService.LocalBinder b);
}
-package com.acmetensortoys.ctfwstimer;
+package com.acmetensortoys.ctfwstimer.activity;
import android.app.Activity;
import android.content.res.Resources;
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.acmetensortoys.ctfwstimer.R;
import com.acmetensortoys.ctfwstimer.lib.CtFwSGameStateManager;
import com.acmetensortoys.ctfwstimer.utils.AndroidResourceUtils;
import static android.view.View.INVISIBLE;
// TODO nwf is bad at UI design; someone who isn't him should improve this
-class CtFwSDisplayLocal implements CtFwSGameStateManager.Observer {
+class MainActivityCtFwSDisplay implements CtFwSGameStateManager.Observer {
final private Activity mAct;
String gameStateLabelText;
private final StunTimer stun_short, stun_long;
- CtFwSDisplayLocal(Activity a) {
+ MainActivityCtFwSDisplay(Activity a) {
mAct = a;
gameStateLabelText = mAct.getResources().getString(R.string.header_gamestate0);
-package com.acmetensortoys.ctfwstimer;
+package com.acmetensortoys.ctfwstimer.utils;
import android.content.res.Resources;
import android.os.SystemClock;
import android.widget.Chronometer;
+import com.acmetensortoys.ctfwstimer.R;
import com.acmetensortoys.ctfwstimer.lib.CtFwSGameStateManager;
import java.util.SortedSet;
* in the headers. This provides that for us.
*/
-class CtFwSDisplayTinyChrono implements CtFwSGameStateManager.Observer {
+public class CtFwSDisplayTinyChrono implements CtFwSGameStateManager.Observer {
private final Chronometer mCh;
private final Resources mRes;
import android.support.v4.util.Consumer;
import android.util.Log;
-import com.acmetensortoys.ctfwstimer.HandbookActivity;
+import com.acmetensortoys.ctfwstimer.activity.HandbookActivity;
import org.eclipse.paho.client.mqttv3.IMqttAsyncClient;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.acmetensortoys.ctfwstimer.AboutActivity">
+ tools:context="com.acmetensortoys.ctfwstimer.activity.AboutActivity">
<TabHost
android:layout_width="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
- tools:context="com.acmetensortoys.ctfwstimer.MainActivity">
+ tools:context="com.acmetensortoys.ctfwstimer.activity.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.acmetensortoys.ctfwstimer.AboutActivity">
+ tools:context="com.acmetensortoys.ctfwstimer.activity.AboutActivity">
<TabHost
android:layout_width="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
- tools:context="com.acmetensortoys.ctfwstimer.MainActivity">
+ tools:context="com.acmetensortoys.ctfwstimer.activity.MainActivity">
<LinearLayout
android:layout_width="match_parent"
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="hand_tab_div_size">4dp</dimen>
+ <dimen name="fab_margin">16dp</dimen>
</resources>
+++ /dev/null
-package com.acmetensortoys.ctfwstimer;
-
-class MainActivityBuildHooksImpl implements MainActivityBuildHooks {
- @Override
- public void onStart(MainActivity ma, MainService.LocalBinder b) {
- // NOP
- }
-}
--- /dev/null
+package com.acmetensortoys.ctfwstimer.activity;
+
+import com.acmetensortoys.ctfwstimer.activity.MainActivity;
+import com.acmetensortoys.ctfwstimer.activity.MainActivityBuildHooks;
+import com.acmetensortoys.ctfwstimer.service.MainService;
+
+class MainActivityBuildHooksImpl implements MainActivityBuildHooks {
+ @Override
+ public void onRegisterObservers(MainActivity ma, MainService.LocalBinder b) {
+ // NOP
+ }
+}