package com.example.mysql_tester;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.example.mysql_tester.library.*;
public class AddItem_tab extends SherlockFragmentActivity implements LocationListener {
UserFunctions userFunctions;
ActionBar actionBar;
//SherlockActionBar
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter,tabText;
//Process Dialog ���bŪ������ܮ�
private ProgressDialog pDialog;
//�s�@�@��JSONParser������
JSONParser jsonParser = new JSONParser();
//JSON Node �W��
private static final String TAG_SUCCESS = "success";
//���GPS��T
private static final int ONE_MINUTE = 1000 * 60;
Location currentBestLocation = null;
LocationManager locateManager = null;
String fineProvide,networkProvide;
Double double_latitude = 0.0,double_longitude = 0.0;
int account_uID = 0;
boolean isLocationEdited = false;
SharedPreferences addItemPre;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.add_item_pager);
setContentView(mViewPager);
//ActionBar
actionBar = getSupportActionBar();
//�]�wActionBar����ܼҦ�
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//�]�wActionBar �i�H��App�ϥܦ^�W�@��
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
mTabsAdapter = new TabsAdapter(this, mViewPager);
//GPS�w��ϥ�
locateManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Criteria fine_criteria = new Criteria(); //��GPS���o
fine_criteria.setAccuracy(Criteria.ACCURACY_FINE);
fineProvide = locateManager.getBestProvider(fine_criteria, false);
Criteria network_criteria = new Criteria(); //�� WiFi/3G���o��m
network_criteria.setAccuracy(Criteria.ACCURACY_COARSE);
network_criteria.setPowerRequirement(Criteria.POWER_LOW);
networkProvide = locateManager.getBestProvider(network_criteria, false);
gpsFix(); //Request �@��GPS��m
//�qBundle �������X ItemList �����
Intent mapInterface = this.getIntent();
if (!isLocationEdited) {
Bundle myPosition = mapInterface.getExtras();
double_latitude = myPosition.getDouble("latitude", 23.979548); //�n��
double_longitude = myPosition.getDouble("longitude", 120.696745); //�g��
}
getMyAddress();
//���X�ϥΪ̪�uID
userFunctions = new UserFunctions();
boolean loginCheck = userFunctions.isUserLoggedIn(getApplicationContext());
if (loginCheck == true) {
account_uID = userFunctions.getUserUid(getApplicationContext());
//Toast.makeText(getApplicationContext(), ""+account_uID, Toast.LENGTH_SHORT).show();
}
setActionbarTabs();
}
private void setActionbarTabs() {
mTabsAdapter.addTabs(actionBar.newTab().setText(getResources().getString(R.string.ItemTab_tabName1)).setIcon(android.R.drawable.ic_menu_info_details),AddItem.class, null, "tab1");
mTabsAdapter.addTabs(actionBar.newTab().setText(getResources().getString(R.string.ItemTab_tabName2)).setIcon(android.R.drawable.ic_menu_recent_history),AddItem_page2.class, null, "tab2");
mTabsAdapter.addTabs(actionBar.newTab().setText(getResources().getString(R.string.ItemTab_tabName3)).setIcon(android.R.drawable.ic_menu_agenda),AddItem_page3.class, null, "tab3");
}
//���oGPS��m
public void gpsFix() {
if (locateManager.isProviderEnabled(fineProvide)) {
locateManager.requestLocationUpdates(networkProvide, 0, 0, this);
locateManager.requestLocationUpdates(fineProvide, 1, 0, this);
return;
}
else {
locateManager.requestLocationUpdates(networkProvide, 1, 0, this);
Toast.makeText(getApplicationContext(), getResources().getString(R.string.gpsRequest), Toast.LENGTH_SHORT).show();
}
}
//TabAdapter
public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener,ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
private final String tags;
TabInfo(Class<?> _cClass, Bundle _args, String _tags) {
clss = _cClass;
args = _args;
tags = _tags;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
mViewPager.setOffscreenPageLimit(2); //Access the behind page
}
public void addTabs(ActionBar.Tab tab,Class<?> clss,Bundle args, String tags) {
TabInfo info = new TabInfo(clss, args, tags);
tab.setTag(tags);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public void onPageScrollStateChanged(int state) {}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onTabSelected(Tab tab,FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0;i < mTabs.size();i++) {
if (mTabs.get(i).tags == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab,FragmentTransaction ft) {}
@Override
public void onTabReselected(Tab tab,FragmentTransaction ft) {}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public int getCount() {
return mTabs.size();
}
}
//Source code from my past version
//�b�I������G�s�W�@��Item
class CreateNewItem extends AsyncTask<String,String,String>{
//�b�I���}�lŪ���H�e�A���Progress Dialog(��ܤ��)
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(AddItem_tab.this);
pDialog.setMessage(getResources().getString(R.string.ItemTab_processing));
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
//�b�I����@
@Override
protected String doInBackground(String... args) {
//�qBundle�����o����A�åB�ন�r���int
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
String name = addItemPre.getString("sName", "");
String price = addItemPre.getString("sMinCharge", "");
String phone = addItemPre.getString("sPhone", "");
String sCountry = addItemPre.getString("sCountry", "�O�_��");
String sTownship = addItemPre.getString("sTownship", "");
String sLocation = addItemPre.getString("sLocation", "");
int Is24Hours = addItemPre.getInt("is24Hours", 0);
String startTime = addItemPre.getString("startTime", "");
String closeTime = addItemPre.getString("closeTime", "");
String rest_day = addItemPre.getString("sWeek", "");
String sMemo = addItemPre.getString("sMemo", "");
String email = addItemPre.getString("sEmail", "");
String webpage = addItemPre.getString("sURL", "");
int sCanDelivery = addItemPre.getInt("sCanDelivery",0);
int sCanToGo = addItemPre.getInt("sCanToGo",0);
//Building Parameters�A�@���x�s��ƪ���Ƶ��c
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("action", "create_store")); //set for action
params.add(new BasicNameValuePair("uID", Integer.toString(account_uID)));
params.add(new BasicNameValuePair("sLatitude", Double.toString(double_latitude))); //���n
params.add(new BasicNameValuePair("sLongitude", Double.toString(double_longitude))); //���n
params.add(new BasicNameValuePair("sName",name)); //���a�W��,���n
params.add(new BasicNameValuePair("sMinCharge",price)); //�C�P
params.add(new BasicNameValuePair("sPhone",phone)); //�q��
params.add(new BasicNameValuePair("sLocation",sLocation)); //��Y�a�}
params.add(new BasicNameValuePair("sTownship",sTownship)); //�m���Ϧa�}
params.add(new BasicNameValuePair("sCountry",sCountry)); //�[�J�a�}
params.add(new BasicNameValuePair("is24Hours", Integer.toString(Is24Hours))); //�O���O24�p��
params.add(new BasicNameValuePair("startTime",startTime)); //�}�l��~�ɶ�
params.add(new BasicNameValuePair("closeTime",closeTime)); //������~�ɶ�
params.add(new BasicNameValuePair("sWeek",rest_day)); //�𮧤�
params.add(new BasicNameValuePair("sMemo",sMemo)); //�Ƶ�
params.add(new BasicNameValuePair("sEmail",email)); //E-mail
params.add(new BasicNameValuePair("sURL",webpage)); //����
params.add(new BasicNameValuePair("sCanDelivery",Integer.toString(sCanDelivery))); //�i�~�e
params.add(new BasicNameValuePair("sCanToGo",Integer.toString(sCanToGo))); //�i�~�a
//���oJSON����
//Note that create item url accepts POST method
//String action = "create_store"; //�ϫ汹�I
JSONObject json = jsonParser.makeHttpRequest("POST",params);
//�ˬdLog cat�ݬݦ��S���^��
Log.d("Create Response",json.toString());
//�ˬdSUCCESS TAG
try{
int success = json.getInt(TAG_SUCCESS);
if (success == 1){
//�إߦ��\�A�^�춵�زM�樺��
Intent go_item_list = new Intent(AddItem_tab.this,ItemList.class);
go_item_list.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(go_item_list);
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
addItemPre.edit().clear().commit();
finish(); //�����o��Activity
}
else{
//�إߥ���
}
}
catch(JSONException e){
e.printStackTrace();
}
return null;
}
//�����I���@�~��A�����ܮظ��X��
protected void onPostExecute(String file_url) {
//��������ܮ�
pDialog.dismiss();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getSupportMenuInflater().inflate(R.menu.add_page, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case android.R.id.home:
Intent go_back = new Intent(AddItem_tab.this,ItemList.class);
go_back.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
addItemPre.edit().clear().commit();
startActivity(go_back);
break;
case R.id.add_an_object:
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
String name = addItemPre.getString("sName", "");
String price = addItemPre.getString("sMinCharge", "");
String phone = addItemPre.getString("sPhone", "");
String sCountry = addItemPre.getString("sCountry", "�O�_��");
String sTownship = addItemPre.getString("sTownship", "");
String sLocation = addItemPre.getString("sLocation", "");
String startTime = addItemPre.getString("startTime", "");
String closeTime = addItemPre.getString("closeTime", "");
String rest_day = addItemPre.getString("sWeek", "");
if (double_latitude == 0.0 && double_longitude == 0.0) {
Toast.makeText(getApplicationContext(), getResources().getString(R.string.waitForGps), Toast.LENGTH_SHORT).show();
break;
}
if (name.equals("") || sCountry.equals(getResources().getString(R.string.ItemTab_countryNull))){
Toast.makeText(getApplicationContext(), getResources().getString(R.string.ItemTab_nameOrCountryError), Toast.LENGTH_SHORT).show();
}
else{
//Toast.makeText(getApplicationContext(), "�g:" +double_longitude +",�n:" +double_latitude, Toast.LENGTH_SHORT).show(); //Just Test
new AlertDialog.Builder(AddItem_tab.this)
.setTitle(getResources().getString(R.string.alertComfirmTitle))
.setIcon(R.drawable.ic_launcher)
.setMessage(getResources().getString(R.string.ItemTab_comfirmMessage1)
+getResources().getString(R.string.ItemTab_comfirmMessage2)+name
+getResources().getString(R.string.ItemTab_comfirmMessage3)+price
+getResources().getString(R.string.ItemTab_comfirmMessage4)+phone
+getResources().getString(R.string.ItemTab_comfirmMessage5)+sCountry+sTownship+sLocation
+getResources().getString(R.string.ItemTab_comfirmMessage6)+startTime
+getResources().getString(R.string.ItemTab_comfirmMessage7)+closeTime
+getResources().getString(R.string.ItemTab_comfirmMessage8)+rest_day
+getResources().getString(R.string.ItemTab_comfirmMessage9))
.setNegativeButton(getResources().getString(R.string.alertDialogCancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton(getResources().getString(R.string.alertDialogOkay), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//�b�I���B�z�G�s�W�@��Item
new CreateNewItem().execute();
}
})
.show();
}
break;
case R.id.addItem_modifyLocation:
if (double_latitude != 0.0 || double_longitude != 0.0) {
Intent location_confirm = new Intent(AddItem_tab.this,MapDragger.class);
Bundle bundle = new Bundle();
bundle.putString("tag", "AddItem");
bundle.putDouble("oriLatitude", double_latitude);
bundle.putDouble("oriLongitude", double_longitude);
location_confirm.putExtras(bundle);
startActivityForResult(location_confirm, 1);
}
else {
Toast.makeText(getApplicationContext(), getResources().getString(R.string.waitForGps), Toast.LENGTH_SHORT).show();
}
break;
case R.id.addItem_refresh:
isLocationEdited = false;
gpsFix();
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
//�ϥΪ̰e�^�F��m��T
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == 1) {
isLocationEdited = true;
locateManager.removeUpdates(this);
double_latitude = data.getDoubleExtra("sLatitude", 0.0);
double_longitude = data.getDoubleExtra("sLongitude", 0.0);
if (double_latitude == null || double_latitude == 0.0 ||
double_longitude == null || double_longitude == 0.0) {
gpsFix(); //�p�G�S�����o��ƨ���N���s�w��
Toast.makeText(getApplicationContext(), getResources().getString(R.string.ItemTab_dataGetError), Toast.LENGTH_SHORT).show();
}
//Toast.makeText(getApplicationContext(), "�g��:" +double_longitude +"�n��:" +double_latitude, Toast.LENGTH_LONG).show();
}
}
/*To fix the IllegalArgumentException�G��V���D*/
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
try{
pDialog.dismiss();
}
catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onLocationChanged(Location location) {
if (isBetterLocation(location, currentBestLocation) == true) {
currentBestLocation = location;
double_latitude = location.getLatitude();
double_longitude = location.getLongitude();
}
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Criteria fine_criteria = new Criteria(); //��GPS���o
fine_criteria.setAccuracy(Criteria.ACCURACY_FINE);
fineProvide = locateManager.getBestProvider(fine_criteria, false);
Criteria network_criteria = new Criteria(); //�� WiFi/3G���o��m
network_criteria.setAccuracy(Criteria.ACCURACY_COARSE);
networkProvide = locateManager.getBestProvider(network_criteria, false);
}
//�O�_����n�� Location �ˬd
protected boolean isBetterLocation(Location location,Location currentBestLocation) {
//Determine whether one Location reading is better than the current Location fix
//@Param location The new location that you want to evaluate
//@Param currentBestLocation The current Location fix, to which you want to compare the new one
if (currentBestLocation == null) {
//A new location is always better than no location
return true;
}
//Check whether the new location fix is newer or older
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSegnificantlyNewer = timeDelta > ONE_MINUTE;
boolean isSegnificantlyOlder = timeDelta < ONE_MINUTE;
boolean isNewer = timeDelta > 0;
//if it's been more than one minute since the current location,use the new location
//because the user has likely moved
if (isSegnificantlyNewer) {
return true;
}
//if the new location is more than one minuted older, it must be worst
else if (isSegnificantlyOlder) {
return false;
}
//Check whether the new location fix is more or less accurate
int accuracyDelta = (int)(location.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSegnificantlyLessAccurate = accuracyDelta > 200;
//Check if the old and new location are from the same provider
boolean isFromSameProvider = isSameProvider(location.getProvider(),currentBestLocation.getProvider());
//Determine location quality using a combination of timeliness and accuracy
if (isMoreAccurate) {
return true;
}
else if (isNewer && !isLessAccurate) {
return true;
}
else if (isNewer && !isSegnificantlyLessAccurate && isFromSameProvider) {
return true;
}
return false;
}
/*�ˬd���Provider�O���O�P�@��*/
private boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return false;
}
return provider1.equals(provider2);
}
@Override
protected void onResume() {
super.onResume();
//��ܤW���w�쪺��m
if (!isLocationEdited) {
Location lastLocation = locateManager.getLastKnownLocation(fineProvide);
currentBestLocation = lastLocation;
if (lastLocation != null) {
double_latitude = lastLocation.getLatitude();
double_longitude = lastLocation.getLongitude();
}
else {
Location lastLocation_network = locateManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
currentBestLocation = lastLocation_network;
if (lastLocation_network != null) {
double_latitude = lastLocation_network.getLatitude();
double_longitude = lastLocation_network.getLongitude();
}
}
}
}
@Override
protected void onStop() {
super.onStop();
locateManager.removeUpdates(this);
}
/*���o�ѦҦa�}*/
public void getMyAddress() {
try {
Geocoder geocoder = new Geocoder(getBaseContext());
List<Address> addresses = null;
if (double_latitude != 0.0 && double_longitude != 0.0){
addresses = geocoder.getFromLocation(double_latitude, double_longitude, 1);
String subLocality = addresses.get(0).getSubLocality();
if (subLocality == null) subLocality = "";
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
Editor preWriter = addItemPre.edit(); //�]�w�nEditor
preWriter.putString("sampleAdd1", addresses.get(0).getAddressLine(0));
preWriter.putString("sampleAdd2", addresses.get(0).getLocality());
preWriter.putString("sampleAdd3", subLocality +addresses.get(0).getThoroughfare() + addresses.get(0).getFeatureName() +getResources().getString(R.string.ItemTab_addressNo));
preWriter.putString("sampleAdd4", addresses.get(0).getAdminArea());
preWriter.commit(); //�g�J�I
}
else {
}
}
catch (Exception e) {
e.printStackTrace();
}
}
//���}����
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
new AlertDialog.Builder(AddItem_tab.this)
.setTitle(getResources().getString(R.string.ItemTab_cancelToEdit))
.setIcon(R.drawable.ic_launcher)
.setMessage(getResources().getString(R.string.ItemTab_cancelToEditMessage))
.setPositiveButton(getResources().getString(R.string.alertDialogOkay), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
addItemPre = getSharedPreferences("addItem_tmp", MODE_PRIVATE);
addItemPre.edit().clear().commit();
finish();
}
})
.setNegativeButton(getResources().getString(R.string.alertDialogCancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
return true;
}
return super.onKeyDown(keyCode, event);
}
}