Bug 3251 - RCApp constantly crashes when receiving updates

This commit is contained in:
Peter Siegmund
2015-09-01 10:47:28 +02:00
parent c07e16ee24
commit 91a975baa7
12 changed files with 122 additions and 31 deletions
@@ -0,0 +1,76 @@
package com.sap.sailing.android.shared.util;
import java.util.LinkedList;
import java.util.Queue;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v4.content.LocalBroadcastManager;
public class BroadcastManager {
private final static String TAG = BroadcastManager.class.getName();
private static BroadcastManager mInstance;
private final Context mContext;
private Queue<Intent> mQueue;
private DelayedTask mTask;
private BroadcastManager(Context context) {
mContext = context.getApplicationContext();
mQueue = new LinkedList<>();
}
public synchronized static BroadcastManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new BroadcastManager(context);
}
return mInstance;
}
public void addIntent(Intent intent) {
mQueue.add(intent);
if (mTask == null || !mTask.isRunning()) {
mTask = new DelayedTask();
mTask.execute();
}
}
private class DelayedTask extends AsyncTask<Void, Void, Void> {
private boolean mIsRunning = false;
@Override
protected Void doInBackground(Void... params) {
mIsRunning = true;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// nö
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (mQueue.size() > 0) {
Intent intent = mQueue.remove();
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
if (mQueue.size() > 0) {
mTask = new DelayedTask();
mTask.execute();
}
}
mIsRunning = false;
}
public boolean isRunning() {
return mIsRunning;
}
}
}
@@ -31,6 +31,7 @@ import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.EventBase;
@@ -108,7 +109,7 @@ public class LoginActivity extends BaseActivity
//send intent to open the course area selection list
Intent intent = new Intent(AppConstants.INTENT_ACTION_TOGGLE);
intent.putExtra(AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_AREA);
LocalBroadcastManager.getInstance(LoginActivity.this).sendBroadcast(intent);
BroadcastManager.getInstance(LoginActivity.this).addIntent(intent);
}
};
private ItemSelectedListener<CourseArea> courseAreaSelectionListener = new ItemSelectedListener<CourseArea>() {
@@ -129,7 +130,7 @@ public class LoginActivity extends BaseActivity
//send intent to open the position selection list
Intent intent = new Intent(AppConstants.INTENT_ACTION_TOGGLE);
intent.putExtra(AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_POSITION);
LocalBroadcastManager.getInstance(LoginActivity.this).sendBroadcast(intent);
BroadcastManager.getInstance(LoginActivity.this).addIntent(intent);
}
};
@@ -1,9 +1,17 @@
package com.sap.sailing.racecommittee.app.ui.activities;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import android.annotation.TargetApi;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.*;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
@@ -15,10 +23,16 @@ import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.internal.widget.TintImageView;
import android.support.v7.widget.Toolbar;
import android.view.*;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.CollectionUtils;
import com.sap.sailing.domain.base.CourseArea;
@@ -51,10 +65,6 @@ import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
public class RacingActivity extends SessionActivity implements RaceInfoListener, RaceListCallbacks {
private static final String TAG = RacingActivity.class.getName();
private static final String WIND = "wind";
@@ -8,7 +8,6 @@ import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.LayoutInflater;
@@ -20,6 +19,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
@@ -146,7 +146,7 @@ public class ManagedRaceListAdapter extends ArrayAdapter<RaceListDataType> imple
public void onClick(View v) {
Intent intent = new Intent(AppConstants.INTENT_ACTION_SHOW_PROTEST);
intent.putExtra(AppConstants.INTENT_ACTION_EXTRA, header.toString());
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
BroadcastManager.getInstance(getContext()).addIntent(intent);
}
});
} else if (type == ViewType.RACE.index) {
@@ -6,7 +6,6 @@ import java.lang.reflect.Method;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@@ -15,6 +14,7 @@ import android.widget.ImageView;
import android.widget.PopupMenu;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
@@ -128,7 +128,7 @@ public class LoginBackdrop extends Fragment {
private void refreshData() {
Intent intent = new Intent(AppConstants.INTENT_ACTION_RESET);
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
BroadcastManager.getInstance(getActivity()).addIntent(intent);
}
private void openInfo() {
@@ -3,9 +3,9 @@ package com.sap.sailing.racecommittee.app.ui.fragments;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.racecommittee.app.AppConstants;
@@ -108,7 +108,7 @@ public abstract class RaceFragment extends LoggableFragment implements TickListe
if (extra_key != null) {
intent.putExtra(extra_key, extra_value);
}
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
BroadcastManager.getInstance(getActivity()).addIntent(intent);
}
}
@@ -39,6 +39,7 @@ import android.widget.ListView;
import android.widget.TextView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
import com.sap.sailing.racecommittee.app.AppConstants;
@@ -125,7 +126,7 @@ public class RaceListFragment extends LoggableFragment implements OnItemClickLis
extra += RaceHelper.getSeriesName(race.getSeries());
extra += RaceHelper.getFleetName(race.getFleet());
intent.putExtra(AppConstants.INTENT_ACTION_EXTRA, extra);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
BroadcastManager.getInstance(context).addIntent(intent);
}
private void dataChanged(ReadonlyRaceState changedState) {
@@ -5,6 +5,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.common.racelog.Flags;
@@ -77,15 +78,15 @@ public class AbortFlagsFragment extends RaceFragment implements AbortFlagItemCli
private void logFlag(Flags flag) {
switch (flag) {
case ALPHA:
ExLog.i(getActivity(), LogEvent.RACE_CHOOSE_ABORT_ALPHA, getRace().getId().toString());
ExLog.i(getActivity(), LogEvent.RACE_CHOOSE_ABORT_ALPHA, getRace().getId());
break;
case HOTEL:
ExLog.i(getActivity(), LogEvent.RACE_CHOOSE_ABORT_HOTEL, getRace().getId().toString());
ExLog.i(getActivity(), LogEvent.RACE_CHOOSE_ABORT_HOTEL, getRace().getId());
break;
default:
ExLog.i(getActivity(), LogEvent.RACE_CHOOSE_ABORT_NONE, getRace().getId().toString());
ExLog.i(getActivity(), LogEvent.RACE_CHOOSE_ABORT_NONE, getRace().getId());
break;
}
}
@@ -1,12 +1,16 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import java.util.List;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.widget.TextView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState;
@@ -29,8 +33,6 @@ import com.sap.sailing.racecommittee.app.utils.TimeUtils;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.util.List;
public abstract class BaseRaceInfoRaceFragment<ProcedureType extends RacingProcedure> extends RaceFragment {
private final RaceStateChangedListener mRaceStateChangedListener;
@@ -161,8 +163,7 @@ public abstract class BaseRaceInfoRaceFragment<ProcedureType extends RacingProce
private void showMainContent() {
Intent intent = new Intent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT);
RacingActivity activity = (RacingActivity) getActivity();
activity.processIntent(intent);
BroadcastManager.getInstance(getActivity()).addIntent(intent);
}
private class FlagPoleCache {
@@ -1,8 +1,9 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import java.util.Calendar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -10,6 +11,8 @@ import android.widget.NumberPicker;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.impl.Result;
@@ -18,8 +21,6 @@ import com.sap.sailing.racecommittee.app.utils.TimeUtils;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.util.Calendar;
public class RaceTimeChangeFragment extends BaseFragment implements View.OnClickListener {
public final static int START_TIME_MODE = 0;
@@ -217,6 +218,6 @@ public class RaceTimeChangeFragment extends BaseFragment implements View.OnClick
private void closeFragment() {
Intent intent = new Intent(AppConstants.INTENT_ACTION_SHOW_SUMMARY_CONTENT);
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
BroadcastManager.getInstance(getActivity()).addIntent(intent);
}
}
@@ -12,7 +12,6 @@ import java.util.Map;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -23,6 +22,7 @@ import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult;
@@ -739,6 +739,7 @@ public class StartTimeFragment extends BaseFragment
}
fragment.setArguments(args);
getFragmentManager().beginTransaction().replace(viewId, fragment).commit();
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent(AppConstants.INTENT_ACTION_CLEAR_TOGGLE));
Intent intent = new Intent(AppConstants.INTENT_ACTION_CLEAR_TOGGLE);
BroadcastManager.getInstance(getActivity()).addIntent(intent);
}
}
@@ -11,10 +11,10 @@ import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.sap.sailing.android.shared.data.http.HttpGetRequest;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.NetworkHelper;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.AppPreferences;
@@ -41,11 +41,10 @@ public class WindHelper {
NetworkHelper.getInstance(context).executeHttpJsonRequestAsnchronously(request, new NetworkHelper.NetworkHelperSuccessListener() {
@Override
public void performAction(JSONObject response) {
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
Intent notifyTrackedIntent = new Intent();
notifyTrackedIntent.putExtra(AppConstants.INTENT_ACTION_IS_TRACKING_EXTRA, checkResponseForTracking(response, race));
notifyTrackedIntent.setAction(AppConstants.INTENT_ACTION_IS_TRACKING);
manager.sendBroadcast(notifyTrackedIntent);
BroadcastManager.getInstance(context).addIntent(notifyTrackedIntent);
}
}, new NetworkHelper.NetworkHelperFailureListener() {
@Override