/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.util;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.TimeZone;
import android.content.Context;
import android.support.v4.util.LongSparseArray;
import android.text.TextUtils;
import com.galaxy.meetup.client.android.R;
/**
*
* @author sihai
*
*/
public class TimeZoneHelper {
private static String sGenericTimeZonePrefix;
private static String sTimeZoneFormat;
private Calendar mCalendar;
private LongSparseArray mOffsetToTimeZonesMapping;
private List mOrderedTimeZoneInfoList;
public static final class TimeZoneGroup
{
List mExcludedTimeZoneInfoList;
HashSet mSeenDisplayNames;
List mTimeZoneInfoList;
public TimeZoneGroup()
{
mTimeZoneInfoList = new ArrayList();
mExcludedTimeZoneInfoList = new ArrayList();
mSeenDisplayNames = new HashSet();
}
}
public static final class TimeZoneInfo implements Comparable
{
public final int compareTo(Object obj)
{
TimeZoneInfo timezoneinfo = (TimeZoneInfo)obj;
return mTimeZone.getDisplayName().compareToIgnoreCase(timezoneinfo.mTimeZone.getDisplayName());
}
public final long getOffset()
{
return mOffset;
}
public final int getPosition()
{
return mPosition;
}
public final TimeZone getTimeZone()
{
return mTimeZone;
}
public final void setOffset(long l)
{
mOffset = l;
}
public final void setPosition(int i)
{
mPosition = i;
}
private long mOffset;
private int mPosition;
private TimeZone mTimeZone;
public TimeZoneInfo(TimeZone timezone)
{
mTimeZone = timezone;
mPosition = -1;
}
}
public TimeZoneHelper(Context context)
{
initialize(context);
}
public static boolean areTimeZoneIdsEquivalent(String s, String s1)
{
boolean flag;
if(s != null && s1 != null)
flag = TextUtils.equals(s.toLowerCase(), s1.toLowerCase());
else
flag = false;
return flag;
}
private static LongSparseArray buildMapping(String as[], String s, Calendar calendar)
{
LongSparseArray longsparsearray = new LongSparseArray();
int i = -1 + as.length;
while(i >= 0)
{
TimeZone timezone = getSystemTimeZone(as[i]);
long l = getOffset(timezone, calendar);
TimeZoneGroup timezonegroup1 = (TimeZoneGroup)longsparsearray.get(l);
if(timezonegroup1 == null)
{
timezonegroup1 = new TimeZoneGroup();
longsparsearray.put(l, timezonegroup1);
}
TimeZoneInfo timezoneinfo = new TimeZoneInfo(timezone);
timezoneinfo.setOffset(l);
String s1 = timezone.getDisplayName();
if(!timezonegroup1.mSeenDisplayNames.contains(s1))
{
if(s != null && s1.startsWith(s))
timezonegroup1.mExcludedTimeZoneInfoList.add(timezoneinfo);
else
timezonegroup1.mTimeZoneInfoList.add(timezoneinfo);
timezonegroup1.mSeenDisplayNames.add(s1);
}
i--;
}
for(int j = -1 + longsparsearray.size(); j >= 0; j--)
{
TimeZoneGroup timezonegroup = (TimeZoneGroup)longsparsearray.get(longsparsearray.keyAt(j));
if(timezonegroup.mTimeZoneInfoList.isEmpty() && !timezonegroup.mExcludedTimeZoneInfoList.isEmpty())
{
Collections.sort(timezonegroup.mExcludedTimeZoneInfoList);
timezonegroup.mTimeZoneInfoList.add(timezonegroup.mExcludedTimeZoneInfoList.get(0));
}
timezonegroup.mExcludedTimeZoneInfoList.clear();
Collections.sort(timezonegroup.mTimeZoneInfoList);
}
return longsparsearray;
}
public static String getDisplayString(String s, Calendar calendar, boolean flag) {
TimeZone timezone;
TimeZone timezone1;
timezone = getSystemTimeZone(s);
timezone1 = calendar.getTimeZone();
if(timezone == null)
return null;
long l = getOffset(timezone1, calendar);
long l1 = getOffset(timezone, calendar);
if(!areTimeZoneIdsEquivalent(timezone.getID(), s) || !flag && l == l1) {
return null;
}
return timezone.getDisplayName();
}
private static long getOffset(TimeZone timezone, Calendar calendar) {
int i = calendar.get(0);
int j = calendar.get(1);
int k = calendar.get(5);
int l = calendar.get(2);
int i1 = calendar.get(11);
int j1 = calendar.get(12);
return (long)timezone.getOffset(i, j, l, k, calendar.get(7), 60000 * (j1 + i1 * 60));
}
public static TimeZone getSystemTimeZone(String s) {
if(!TextUtils.isEmpty(s)) {
TimeZone timezone = TimeZone.getTimeZone(s);
if(timezone == null)
timezone = TimeZone.getDefault();
return timezone;
} else {
return TimeZone.getDefault();
}
}
private TimeZoneInfo getTimeZoneInfo(String s, Long long1)
{
int i = mOffsetToTimeZonesMapping.size();
if(TextUtils.isEmpty(s) && null == long1) {
return getCurrentTimeZoneInfo();
}
TimeZone timezone = getSystemTimeZone(s);
String s1 = null;
if(timezone != null) {
if(areTimeZoneIdsEquivalent(timezone.getID(), s))
{
s1 = timezone.getDisplayName();
long1 = Long.valueOf(getOffset(timezone, mCalendar));
} else
{
s1 = null;
if(long1 == null)
{
return getCurrentTimeZoneInfo();
}
}
}
TimeZoneInfo timezoneinfo = null;
TimeZoneInfo timezoneinfo1 = null;
if(i > 0)
{
int j = 0;
timezoneinfo = null;
if(long1 != null)
{
j = mOffsetToTimeZonesMapping.indexOfKey(long1.longValue());
timezoneinfo = null;
if(j < 0)
j = 0;
}
for(; j < i; j++)
{
long l = mOffsetToTimeZonesMapping.keyAt(j);
List arraylist = ((TimeZoneGroup)mOffsetToTimeZonesMapping.get(l)).mTimeZoneInfoList;
int k = arraylist.size();
for(int i1 = 0; i1 < k; i1++)
{
timezoneinfo1 = (TimeZoneInfo)arraylist.get(i1);
boolean flag = TextUtils.equals(timezoneinfo1.getTimeZone().getDisplayName(), s1);
if(l == long1.longValue() && (flag || TextUtils.isEmpty(s1)))
return timezoneinfo1;
if(flag || i1 == 0)
timezoneinfo = timezoneinfo1;
}
}
}
return timezoneinfo;
}
public static void initialize(Context context)
{
if(sTimeZoneFormat == null)
{
sTimeZoneFormat = context.getResources().getString(R.string.time_zone_utc_format);
sGenericTimeZonePrefix = context.getResources().getString(R.string.time_zone_generic_system_prefix);
}
}
public final void configure(Calendar calendar)
{
mCalendar = calendar;
mOrderedTimeZoneInfoList = new ArrayList();
mOffsetToTimeZonesMapping = buildMapping(TimeZone.getAvailableIDs(), sGenericTimeZonePrefix, calendar);
int i = mOffsetToTimeZonesMapping.size();
int j = 0;
for(int k = 0; k < i;)
{
long l = mOffsetToTimeZonesMapping.keyAt(k);
List arraylist = ((TimeZoneGroup)mOffsetToTimeZonesMapping.get(l)).mTimeZoneInfoList;
int i1 = arraylist.size();
int j1 = 0;
int k1;
int l1;
for(k1 = j; j1 < i1; k1 = l1)
{
TimeZoneInfo timezoneinfo = (TimeZoneInfo)arraylist.get(j1);
l1 = k1 + 1;
timezoneinfo.setPosition(k1);
mOrderedTimeZoneInfoList.add(timezoneinfo);
j1++;
}
k++;
j = k1;
}
}
public final TimeZoneInfo getCurrentTimeZoneInfo()
{
TimeZone timezone = mCalendar.getTimeZone();
return getTimeZoneInfo(timezone.getID(), Long.valueOf(getOffset(timezone, mCalendar)));
}
public final long getOffset(TimeZone timezone)
{
return getOffset(timezone, mCalendar);
}
public final TimeZone getTimeZone(String s, Long long1)
{
TimeZoneInfo timezoneinfo = getTimeZoneInfo(s, null);
TimeZone timezone = null;
if(timezoneinfo != null)
timezone = timezoneinfo.getTimeZone();
return timezone;
}
public final List getTimeZoneInfos()
{
return mOrderedTimeZoneInfoList;
}
public final int getTimeZonePos(String s, Long long1)
{
TimeZoneInfo timezoneinfo = getTimeZoneInfo(s, null);
int i;
if(timezoneinfo != null)
i = timezoneinfo.getPosition();
else
i = -1;
return i;
}
}