package au.id.teda.broadband.usage.util; import android.content.Context; import android.util.AttributeSet; import android.widget.ViewFlipper; /** * Works around Android Bug 6191 by catching IllegalArgumentException after * detached from the window. * * @author Eric Burke (eric@squareup.com) */ public class SafeViewFlipper extends ViewFlipper { //private static final String INFO_TAG = SafeViewFlipper.class.getSimpleName(); public SafeViewFlipper(Context context) { super(context); } public SafeViewFlipper(Context context, AttributeSet attrs) { super(context, attrs); } /** * Workaround for Android Bug 6191: * http://code.google.com/p/android/issues/detail?id=6191 * <p/> * ViewFlipper occasionally throws an IllegalArgumentException after screen * rotations. */ @Override protected void onDetachedFromWindow() { try { super.onDetachedFromWindow(); } catch (IllegalArgumentException e) { //Log.d(INFO_TAG, "SafeViewFlipper ignoring IllegalArgumentException"); // Call stopFlipping() in order to kick off updateRunning() stopFlipping(); } } } /** * Typical stack trace from the Android bug: * * Uncaught handler: thread main exiting due to uncaught exception * java.lang.IllegalArgumentException: Receiver not registered: * android.widget.ViewFlipper$1@447dc5d0 at * android.app.ActivityThread$PackageInfo * .forgetReceiverDispatcher(ActivityThread.java:667) at * android.app.ApplicationContext * .unregisterReceiver(ApplicationContext.java:747) at * android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321) at * android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104) at * android.view.View.dispatchDetachedFromWindow(View.java:5835) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) at * android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1570) at * android.view.ViewRoot.doDie(ViewRoot.java:2556) at * android.view.ViewRoot.die(ViewRoot.java:2526) at * android.view.WindowManagerImpl * .removeViewImmediate(WindowManagerImpl.java:218) at * android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:436) * at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498) * at * android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3599) * at android.app.ActivityThread.access$2300(ActivityThread.java:119) at * android.app.ActivityThread$H.handleMessage(ActivityThread.java:1867) at * android.os.Handler.dispatchMessage(Handler.java:99) at * android.os.Looper.loop(Looper.java:123) at * android.app.ActivityThread.main(ActivityThread.java:4363) at * java.lang.reflect.Method.invokeNative(Native Method) at * java.lang.reflect.Method.invoke(Method.java:521) at * com.android.internal.os.ZygoteInit$MethodAndArgsCaller * .run(ZygoteInit.java:860) at * com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) at * dalvik.system.NativeStart.main(Native Method) **/