/*
* Tint Browser for Android
*
* Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 3 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package com.seal.ui.fragments;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.app.Application;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ExpandableListView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.seal.R;
import com.seal.data.GsonDataRequest;
import com.seal.data.RequestManager;
import com.seal.model.Weather;
import com.seal.model.WeatherDetail;
import com.seal.model.WeatherDetail.WeatherFuture;
import com.seal.ui.activities.SLAppication;
import com.seal.ui.activities.SealBrowserActivity;
import com.seal.ui.adapter.ExpandableListViewAdapter;
import com.seal.ui.adapter.WeatherViewAdapter;
import com.seal.ui.managers.UIManager;
import com.seal.ui.views.DepthPageTransformer;
import com.seal.ui.views.ViewPagerCompat;
import com.seal.ui.views.ViewPagerCompat.OnPageChangeListener;
import com.seal.utils.Constants;
import com.seal.utils.NetUtil;
import com.seal.utils.WeatherUtils;
public abstract class StartPageFragment extends Fragment {
private View viewOne = null;
private View viewTwo = null;
private View mParentView = null;
private View[] views = null;
protected UIManager mUIManager;
private boolean mInitialized;
private ExpandableListView mStartListView;
private ExpandableListViewAdapter mStartListViewAdapter;
// weather
private Map<String, String> mMaps;
private LocationClient mLocationClient;
private static final int LOACTION_OK = 0;
private Application mApplication;
private GridView futureWeatherGrid;
private LinearLayout news;
private LinearLayout nav;
private LinearLayout baidu;
private LinearLayout shipin;
private WeatherViewAdapter futureWeatherAdapter;
private ArrayList<WeatherFuture> datas;
private String currentCity = null;
private TextView weatherTitle;
private TextView locationTitle;
private TextView pm25Title;
private ImageView weatherRefresh;
private TextView loadingTitle;
// viewpager
private ViewPagerCompat start_viewpager;
private ImageView indicator_1;
private ImageView indicator_2;
public StartPageFragment() {
mInitialized = false;
}
public interface OnStartPageItemClickedListener {
public void onStartPageItemClicked(String url);
}
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case LOACTION_OK:
Bundle b = msg.getData();
locationTitle.setText(b.getString("cityname") + b.getString("discname"));
currentCity = b.getString("cityname");
getBeautyData(currentCity);
break;
default:
break;
}
}
};
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!mInitialized) {
try {
mUIManager = ((SealBrowserActivity) activity).getUIManager();
} catch (ClassCastException e) {
Log.e("StartPageFragment.onAttach()", e.getMessage());
}
mInitialized = true;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMaps = new HashMap<String, String>();
datas = new ArrayList<WeatherFuture>();
mApplication = SLAppication.getInstance();
mLocationClient = ((SLAppication) mApplication).getLocationClient();
mLocationClient.registerLocationListener(mLocationListener);
if (NetUtil.isNetworkConnected()) {
mLocationClient.start();
mLocationClient.requestLocation();
} else {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mParentView == null) {
mParentView = inflater.inflate(getStartPageFragmentLayout(), container, false);
}
viewOne = inflater.inflate(R.layout.phone_start_page_one, null);
viewTwo = inflater.inflate(R.layout.phone_start_page_two, null);
views = new View[] { viewOne, viewTwo };
initView();
return mParentView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
iniListener();
super.onActivityCreated(savedInstanceState);
}
private void initView() {
start_viewpager = (ViewPagerCompat) mParentView.findViewById(R.id.start_viewpager);
start_viewpager.setPageTransformer(true, new DepthPageTransformer());
indicator_1 = (ImageView) mParentView.findViewById(R.id.indicator_1);
indicator_2 = (ImageView) mParentView.findViewById(R.id.indicator_2);
futureWeatherGrid = (GridView) viewOne.findViewById(R.id.ll_future_weather);
news = (LinearLayout) viewOne.findViewById(R.id.news);
nav = (LinearLayout) viewOne.findViewById(R.id.nav);
baidu = (LinearLayout) viewOne.findViewById(R.id.baidu);
shipin = (LinearLayout) viewOne.findViewById(R.id.shipin);
mStartListView = (ExpandableListView) viewTwo.findViewById(R.id.startListView);
weatherTitle = (TextView) viewOne.findViewById(R.id.weatherTitle);
locationTitle = (TextView) viewOne.findViewById(R.id.tvTitle);
weatherRefresh = (ImageView) viewOne.findViewById(R.id.weatherRefresh);
loadingTitle = (TextView) viewOne.findViewById(R.id.loadingTitle);
pm25Title = (TextView) viewOne.findViewById(R.id.pm25Title);
weatherTitle.setText("N/A");
pm25Title.setText("N/A");
}
private void iniListener() {
if (mUIManager != null) {
mStartListViewAdapter = new ExpandableListViewAdapter(getActivity(), mUIManager);
mStartListView.setAdapter(mStartListViewAdapter);
mStartListView.expandGroup(0);
mStartListView.expandGroup(1);
mStartListView.expandGroup(2);
}
futureWeatherGrid.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
mUIManager.loadUrl("http://m.weather.com.cn");
}
});
start_viewpager.setAdapter(new PagerAdapter() {
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(views[position]);
return views[position];
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views[position]);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public int getCount() {
return views.length;
}
});
start_viewpager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
switch (position) {
case 0:
indicator_1.setImageResource(R.drawable.ic_pageindicator_current);
indicator_2.setImageResource(R.drawable.ic_pageindicator_default);
break;
case 1:
indicator_1.setImageResource(R.drawable.ic_pageindicator_default);
indicator_2.setImageResource(R.drawable.ic_pageindicator_current);
break;
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
});
weatherRefresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (!TextUtils.isEmpty(currentCity)) {
getBeautyData(currentCity);
}
}
});
news.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mUIManager.loadUrl("http://m.toutiao.com");
}
});
nav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mUIManager.loadUrl("http://m.hao123.com");
}
});
baidu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mUIManager.loadUrl("http://m.baidu.com");
}
});
shipin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mUIManager.loadUrl("http://m.video.baidu.com");
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
}
protected abstract int getStartPageFragmentLayout();
private void getBeautyData(String city) {
loadingTitle.setVisibility(View.VISIBLE);
mMaps.put("output", "json");
mMaps.put("ak", Constants.BAIDU_MAP_KAY);
mMaps.put("mcode", Constants.BAIDU_MAP_MCODE);
try {
executeRequest(new GsonDataRequest<Weather>(Constants.BAIDU_BASE_URL + URLEncoder.encode(city, "utf-8"), Weather.class, mMaps,
responseListener(), errorListener()));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void executeRequest(Request<?> request) {
RequestManager.addRequest(request, this);
}
private Response.Listener<Weather> responseListener() {
return new Response.Listener<Weather>() {
@Override
public void onResponse(Weather weather) {
loadingTitle.setVisibility(View.GONE);
if (weather != null) {
ArrayList<WeatherDetail> details = weather.results;
WeatherDetail detail = details.get(0);
// String currentCity = detail.currentCity;
datas = detail.weather_data;
weatherTitle.setText(datas.get(0).temperature);
pm25Title.setText(WeatherUtils.setWeatherAQI(Integer.parseInt(detail.pm25)));
futureWeatherAdapter = new WeatherViewAdapter(SLAppication.getContext(), datas);
futureWeatherGrid.setAdapter(futureWeatherAdapter);
}
}
};
}
/**
* 获取数据错误回调
*
* @return
*/
protected Response.ErrorListener errorListener() {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
volleyError.printStackTrace();
// loadingTitle.setVisibility(View.GONE);
}
};
}
BDLocationListener mLocationListener = new BDLocationListener() {
@Override
public void onReceivePoi(BDLocation arg0) {
// do nothing
}
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || TextUtils.isEmpty(location.getCity())) {
return;
}
String disctrictName = location.getDistrict();
mLocationClient.stop();
Message msg = mHandler.obtainMessage();
msg.what = LOACTION_OK;
Bundle b = new Bundle();
b.putString("cityname", location.getCity());
if (!TextUtils.isEmpty(disctrictName)) b.putString("discname", disctrictName);
else
b.putString("discname", "市区");
msg.setData(b);
mHandler.sendMessage(msg);
}
};
}