/* GENERATED SOURCE. DO NOT MODIFY. */
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 **********************************************************************
 * Copyright (c) 2003-2010, International Business Machines
 * Corporation and others.  All Rights Reserved.
 **********************************************************************
 * Author: Alan Liu
 * Created: October 2 2003
 * Since: ICU 2.8
 **********************************************************************
 */


package android.icu.impl;

@SuppressWarnings({"unchecked", "deprecation", "all"})
public class TimeZoneAdapter extends java.util.TimeZone {

TimeZoneAdapter() { throw new RuntimeException("Stub!"); }

public static java.util.TimeZone wrap(android.icu.util.TimeZone tz) { throw new RuntimeException("Stub!"); }

public void setID(java.lang.String ID) { throw new RuntimeException("Stub!"); }

public boolean hasSameRules(java.util.TimeZone other) { throw new RuntimeException("Stub!"); }

public int getOffset(int era, int year, int month, int day, int dayOfWeek, int millis) { throw new RuntimeException("Stub!"); }

public int getRawOffset() { throw new RuntimeException("Stub!"); }

public void setRawOffset(int offsetMillis) { throw new RuntimeException("Stub!"); }

public boolean useDaylightTime() { throw new RuntimeException("Stub!"); }

public boolean inDaylightTime(java.util.Date date) { throw new RuntimeException("Stub!"); }

public java.lang.Object clone() { throw new RuntimeException("Stub!"); }

public synchronized int hashCode() { throw new RuntimeException("Stub!"); }

public boolean equals(java.lang.Object obj) { throw new RuntimeException("Stub!"); }

public java.lang.String toString() { throw new RuntimeException("Stub!"); }
}

