Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.conceptualsystems.kitmobile;
- import java.util.*;
- import android.app.*;
- import android.os.*;
- import android.content.*;
- import android.database.*;
- import android.database.sqlite.*;
- import android.widget.*;
- import android.view.*;
- import android.util.Log;
- import com.moonlightcheese.btsrv.*;
- public class ShipActivity extends Activity
- {
- //UI elements n stuff
- private ListView mShipKitListView;
- private LayoutInflater mInflater;
- protected SharedPreferences mPrefs;
- private ShipKitAdapter mShipKitAdapter;
- private DbOpenHelper mDbHelper;
- private SQLiteDatabase mDb;
- private Cursor mShipCursor;
- private TextView mTotalGross;
- private TextView mTotalNet;
- private TextView mTargetWeight;
- private TextView mRemainingWeight;
- private String mDrvIdTX;
- private String mCustIdTX;
- //constants
- private String LOG_TAG = "KitMobile - ShipActivity.java";
- private final static int DIALOG_BT_RECONNECT = 1;
- private final static int DIALOG_TARGET_WEIGHT = 2;
- private final static int DIALOG_ETX = 3;
- private final static int DIALOG_FAIL = 4;
- private final static int DIALOG_TX_PROGRESS = 5;
- private final static int DIALOG_TRANSMIT = 6;
- private final static int DIALOG_INVALID_KIT = 7;
- private static String TX_FAIL_TEXT = "error";
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- mPrefs = getSharedPreferences("kitmobileprefs", Context.MODE_PRIVATE);
- mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mDbHelper = new DbOpenHelper(getApplicationContext());
- mDb = mDbHelper.getReadableDatabase();
- //data init
- //mShipKitList = new ArrayList<Map<String, String>>();
- initScreen();
- if(!mPrefs.contains("targetweight")) {
- showDialog(DIALOG_TARGET_WEIGHT);
- } else {
- new SummaryTask().execute();
- }
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- if(mShipCursor!=null)
- mShipCursor.close();
- if(mDb!=null)
- mDb.close();
- }
- @Override
- public void onResume() {
- super.onResume();
- IntentFilter filter = new IntentFilter();
- filter.addAction(ScannerService.ACTION_READ_SCANNER);
- filter.addAction(ScannerService.ACTION_REQUEST_RECONNECT);
- registerReceiver(mReceiver, filter);
- mShipCursor.requery();
- }
- @Override
- public void onPause() {
- super.onPause();
- unregisterReceiver(mReceiver);
- }
- private final Runnable txRunnable = new Runnable() {
- public void run() {
- Bundle b = new Bundle();
- String tm = prepareData();
- boolean sent = false;
- sent = sendData(tm);
- if(sent)
- b.putBoolean("success", true);
- else
- b.putBoolean("success", false);
- Message m = new Message();
- m.setData(b);
- txHandle.sendMessage(m);
- }
- };
- private final Handler txHandle = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- boolean success = msg.getData().getBoolean("success");
- dismissDialog(DIALOG_TX_PROGRESS);
- if(success) {
- clearFields();
- finish();
- } else {
- removeDialog(DIALOG_FAIL);
- showDialog(DIALOG_FAIL);
- }
- }
- };
- public void clearFields() {
- mDbHelper.resetShipment(mDb);
- SharedPreferences.Editor edit = mPrefs.edit();
- edit.remove("targetweight");
- edit.commit();
- }
- /** inner classes **/
- public class ShipKitAdapter extends CursorAdapter {
- public ShipKitAdapter(Context context, Cursor cur) {
- super(context, cur, true);
- }
- public void bindView(View view, Context context, Cursor cursor) {
- try {
- ((TextView)view.findViewById(R.id.kit_id)).setText(cursor.getString(cursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_ID)));
- ((TextView)view.findViewById(R.id.net_units)).setText(cursor.getString(cursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_NET)));
- ((TextView)view.findViewById(R.id.net_uom)).setText("lbs");
- ((TextView)view.findViewById(R.id.product_name)).setText(cursor.getString(cursor.getColumnIndex(DbSchema.ProductSchema.TABLE_NAME+DbSchema.ProductSchema.COLUMN_NAME)));
- ((TextView)view.findViewById(R.id.gross_units)).setText(cursor.getString(cursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_GROSS)));
- ((TextView)view.findViewById(R.id.gross_uom)).setText("lbs");
- } catch(Exception e) {
- Log.i(LOG_TAG, "error getting a field: "+e.getMessage());
- }
- }
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- return mInflater.inflate(R.layout.ship_list_item, parent, false);
- }
- };
- private class DbOpenHelper extends SQLiteOpenHelper {
- DbOpenHelper(Context context) {
- //
- super(context,DbSchema.DATABASE_NAME, null, DbSchema.DATABASE_VERSION);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- }
- @Override
- public void onOpen(SQLiteDatabase db) {
- //open db
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- //upgrade db
- }
- public void resetShipment(SQLiteDatabase db) {
- db.execSQL(DbSchema.ShipmentSchema.DROP_TABLE);
- db.execSQL(DbSchema.ShipmentSchema.CREATE_TABLE);
- }
- public void resetCustomers(SQLiteDatabase db) {
- db.execSQL(DbSchema.CustomerSchema.DROP_TABLE);
- db.execSQL(DbSchema.CustomerSchema.CREATE_TABLE);
- }
- public void resetKits(SQLiteDatabase db) {
- db.execSQL(DbSchema.KitSchema.DROP_TABLE);
- db.execSQL(DbSchema.KitSchema.CREATE_TABLE);
- }
- public void resetProducts(SQLiteDatabase db) {
- db.execSQL(DbSchema.ProductSchema.DROP_TABLE);
- db.execSQL(DbSchema.ProductSchema.CREATE_TABLE);
- }
- }
- // Create a BroadcastReceiver for ACTION_FOUND, ACTION_STATE_CHANGED, ACTION_DISCOVERY_FINISHED
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (ScannerService.ACTION_READ_SCANNER.equals(action)) {
- String extra = intent.getStringExtra("scannerRead");
- Log.i(LOG_TAG, "read message: " + extra);
- //if this kit id exists, add it to the list.
- new ScanTask().execute(extra);
- }
- if(ScannerService.ACTION_REQUEST_RECONNECT.equals(action)) {
- //ask the user real nice if they want the bluetooth scanner reconnected after a disconnect
- Log.i(LOG_TAG, "requested reconnect!");
- //removeDialog(DIALOG_BT_RECONNECT);
- showDialog(DIALOG_BT_RECONNECT);
- }
- }
- };
- private class ScanTask extends AsyncTask<String, Void, Boolean> {
- String kitId;
- int fail_code = 0;
- //valid failure codes for this AsyncTask
- final static int FAILURE_NO_KIT = 1;
- final static int FAILURE_DUPLICATE = 2;
- protected Boolean doInBackground(String... kitIds) {
- if(kitIds != null && !kitIds[0].equals("") && mDb!=null) {
- kitId = kitIds[0];
- //check for the existence of the kit in the kit list
- Cursor kitCursor;
- String kitquery = "SELECT * FROM " + DbSchema.KitSchema.TABLE_NAME + " WHERE " + DbSchema.KitSchema.COLUMN_ID + "='" + kitId + "'";
- kitCursor = mDb.rawQuery(kitquery, null);
- if(kitCursor.getCount()>0) {
- //we're cool, keep on truckin'
- } else {
- Log.e(LOG_TAG, "kit was not added. no such kit exists. try using 'resync kits'");
- fail_code = FAILURE_NO_KIT;
- return false;
- }
- //check if the kit is already in the shipment list. we don't want it in there twice.
- String shipquery = "SELECT * FROM " + DbSchema.ShipmentSchema.TABLE_NAME +
- " WHERE " +DbSchema.ShipmentSchema.COLUMN_ID + "='" + kitId + "'";
- Cursor shipmentCursor = mDb.rawQuery(shipquery, null);
- if(shipmentCursor.getCount()<=0) { //if does not exist
- //we're cool, keep on truckin'
- } else { //record already exists, don't add it to the shipment list twice.
- Log.e(LOG_TAG, "kit was not added. record already exists in shipment.");
- fail_code = FAILURE_DUPLICATE;
- return false;
- }
- //insert the record into the database
- ContentValues cv = new ContentValues();
- cv.put(DbSchema.ShipmentSchema.COLUMN_ID, kitId);
- mDb.insert(DbSchema.ShipmentSchema.TABLE_NAME, null, cv);
- } else {
- //null kit id
- Log.e(LOG_TAG, "kitId was null in ScanTask");
- return false;
- }
- return true;
- }
- protected void onPostExecute(Boolean exists) {
- if(exists) {
- Log.i(LOG_TAG, "adding kit to ship list...");
- refreshShipKitListView();
- Log.i(LOG_TAG, "added.");
- } else {
- processFailCode(fail_code);
- }
- }
- };
- public void processFailCode(int fail_code) {
- switch(fail_code) {
- case ScanTask.FAILURE_NO_KIT:
- //do things
- Toast.makeText(this, "Not a valid kit", Toast.LENGTH_SHORT).show();
- showDialog(DIALOG_INVALID_KIT);
- break;
- case ScanTask.FAILURE_DUPLICATE:
- //do things
- Toast.makeText(this, "Kit is already in the list", Toast.LENGTH_SHORT).show();
- break;
- default:
- //
- break;
- }
- }
- private class SummaryTask extends AsyncTask<Void, Void, Boolean> {
- Integer totalGross = 0;
- Integer totalNet = 0;
- Integer maxWeight = 0;
- protected Boolean doInBackground(Void... unused) {
- //get the information from the kits
- mShipCursor.moveToFirst();
- do {
- try {
- Log.i(LOG_TAG, "Kit: "+mShipCursor.getInt(mShipCursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_ID)));
- totalGross += mShipCursor.getInt(mShipCursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_GROSS));
- totalNet += mShipCursor.getInt(mShipCursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_NET));
- Log.i(LOG_TAG, ""+totalGross);
- Log.i(LOG_TAG, ""+totalNet);
- } catch(Exception e) {
- //Log.i(LOG_TAG, "problem fetching Cursor row: "+mShipCursor.getPosition());
- Log.i(LOG_TAG, "problem fetching Cursor row");
- }
- } while(mShipCursor.moveToNext());
- maxWeight = mPrefs.getInt("targetweight", 0);
- return true;
- }
- protected void onPostExecute(Boolean exists) {
- if(totalGross>0)
- mTotalGross.setText(totalGross.toString());
- else
- mTotalGross.setText("0");
- if(totalNet>0)
- mTotalNet.setText(totalNet.toString());
- else
- mTotalNet.setText("0");
- Integer remWeight = maxWeight;
- remWeight -= totalGross;
- mRemainingWeight.setText(remWeight.toString());
- mTargetWeight.setText(maxWeight.toString());
- }
- };
- public void refreshShipKitListView() {
- mShipCursor.requery();
- new SummaryTask().execute();
- }
- private void initScreen() {
- setContentView(R.layout.ship);
- mTargetWeight = (TextView)findViewById(R.id.target_weight);
- mRemainingWeight = (TextView)findViewById(R.id.remaining_weight);
- mTotalGross = (TextView)findViewById(R.id.gross_weight);
- mTotalNet = (TextView)findViewById(R.id.net_weight);
- mShipKitListView = (ListView)findViewById(R.id.kit_list);
- String screenquery = "SELECT " +
- DbSchema.ShipmentSchema.TABLE_NAME+"."+DbSchema.ShipmentSchema._ID+" AS " + DbSchema.ShipmentSchema._ID + ", " +
- DbSchema.ShipmentSchema.TABLE_NAME+"."+DbSchema.ShipmentSchema.COLUMN_ID+" AS " + DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_ID + ", " +
- DbSchema.KitSchema.TABLE_NAME+"."+DbSchema.KitSchema.COLUMN_FIN_ID+" AS "+DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_FIN_ID + ", " +
- DbSchema.KitSchema.TABLE_NAME+"."+DbSchema.KitSchema.COLUMN_GROSS+" AS "+DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_GROSS + ", " +
- DbSchema.KitSchema.TABLE_NAME+"."+DbSchema.KitSchema.COLUMN_NET+" AS "+DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_NET + ", " +
- DbSchema.ProductSchema.TABLE_NAME+"."+DbSchema.ProductSchema.COLUMN_NAME+" AS "+DbSchema.ProductSchema.TABLE_NAME+DbSchema.ProductSchema.COLUMN_NAME + ", " +
- DbSchema.ProductSchema.TABLE_NAME+"."+DbSchema.ProductSchema.COLUMN_ID+" AS "+DbSchema.ProductSchema.TABLE_NAME+DbSchema.ProductSchema.COLUMN_ID +
- " FROM " + DbSchema.ShipmentSchema.TABLE_NAME +
- " LEFT OUTER JOIN " + DbSchema.KitSchema.TABLE_NAME +
- " ON " + DbSchema.KitSchema.TABLE_NAME+"."+DbSchema.KitSchema.COLUMN_ID+"="+DbSchema.ShipmentSchema.TABLE_NAME+"."+DbSchema.ShipmentSchema.COLUMN_ID +
- " LEFT OUTER JOIN " + DbSchema.ProductSchema.TABLE_NAME +
- " ON " + DbSchema.KitSchema.TABLE_NAME+"."+DbSchema.KitSchema.COLUMN_FIN_ID+"="+DbSchema.ProductSchema.TABLE_NAME+"."+DbSchema.ProductSchema.COLUMN_ID +
- " ORDER BY " +DbSchema.ShipmentSchema.TABLE_NAME+"."+DbSchema.ShipmentSchema._ID + " DESC";
- mShipCursor = mDb.rawQuery(screenquery, null);
- mShipKitAdapter = new ShipKitAdapter(
- ShipActivity.this,
- mShipCursor
- );
- mShipKitListView.setAdapter(mShipKitAdapter);
- final SQLiteDatabase mDbFinal = mDb;
- final Cursor kitCursor = mShipKitAdapter.getCursor();
- mShipKitListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
- public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
- //long press deletes a shipment record.
- kitCursor.moveToPosition(position);
- String kit_id = kitCursor.getString(kitCursor.getColumnIndex(DbSchema.KitSchema.TABLE_NAME+DbSchema.KitSchema.COLUMN_ID));
- mDb.delete(DbSchema.ShipmentSchema.TABLE_NAME, DbSchema.ShipmentSchema.COLUMN_ID+"=?", new String[] {kit_id} );
- refreshShipKitListView();
- return true;
- }
- });
- }
- private void addFakeListItem(String id) {
- int position = mShipKitAdapter.getCount();
- Map<String, String> m = new HashMap<String, String>();
- m.put("kit_id", id);
- m.put("net_units", "5027");
- m.put("net_uom", "lbs");
- m.put("gross_units", "5155");
- m.put("gross_uom", "lbs");
- m.put("product_name", "COPPER #1");
- //mShipKitAdapter.add(m);
- mShipKitAdapter.notifyDataSetChanged();
- }
- // OPTIONS MENU
- ///////////////
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.ship_options, menu);
- return true;
- }
- public boolean onOptionsItemSelected(MenuItem item) {
- switch(item.getItemId()) {
- case R.id.opt_clear:
- //add a fake item to the list
- clearFields();
- finish();
- return true;
- case R.id.opt_transmit:
- //refreshShipKitListView();
- removeDialog(DIALOG_TRANSMIT);
- showDialog(DIALOG_TRANSMIT);
- return true;
- case R.id.opt_refresh:
- new SummaryTask().execute();
- return true;
- default:
- super.onOptionsItemSelected(item);
- return true;
- }
- }
- // DIALOG STUFF
- ///////////////
- @Override
- protected Dialog onCreateDialog(int id, Bundle b) {
- switch(id) {
- case DIALOG_BT_RECONNECT:
- {
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle("Scanner Error");
- builder.setMessage("Scanner has been disconnected!");
- builder.setPositiveButton("Reconnect", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- Intent reconnectIntent = new Intent();
- reconnectIntent.setAction(ScannerService.ACTION_RECONNECT);
- sendBroadcast(reconnectIntent);
- }
- });
- dialog = builder.create();
- return dialog;
- }
- case DIALOG_TARGET_WEIGHT:
- {
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- final View dialogLayout = mInflater.inflate(R.layout.dialog_target_weight, null);
- builder.setTitle("Max Weight");
- builder.setView(dialogLayout);
- final EditText target = (EditText)dialogLayout.findViewById(R.id.target_weight);
- final SharedPreferences prefFinal = mPrefs;
- builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- SharedPreferences.Editor edit = prefFinal.edit();
- edit.putInt("targetweight", new Integer(target.getText().toString()));
- new SummaryTask().execute();
- edit.commit();
- dialog.dismiss();
- }
- });
- dialog = builder.create();
- return dialog;
- }
- case DIALOG_FAIL:
- {
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage(TX_FAIL_TEXT);
- builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.dismiss();
- }
- });
- dialog = builder.create();
- return dialog;
- }
- case DIALOG_INVALID_KIT:
- {
- //do things
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage("You've scanned a kit that is not in the device's kit list. Please perform a 'Sync' on the main screen if you feel you have received this message in error.");
- builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.dismiss();
- }
- });
- dialog = builder.create();
- return dialog;
- }
- case DIALOG_TX_PROGRESS:
- {
- ProgressDialog dialog = new ProgressDialog(this);
- dialog = new ProgressDialog(this);
- dialog.setMessage("Transmitting...");
- dialog.setIndeterminate(true);
- dialog.setCancelable(false);
- return dialog;
- }
- case DIALOG_TRANSMIT:
- {
- Dialog dialog = new Dialog(this);
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- final View dialogLayout = mInflater.inflate(R.layout.dialog_transmit, null);
- builder.setTitle("Transmit");
- builder.setView(dialogLayout);
- final EditText drvIn = (EditText)dialogLayout.findViewById(R.id.drv_in);
- final Spinner custSpn = (Spinner)dialogLayout.findViewById(R.id.cust_spn);
- final Cursor custCursor = mDb.rawQuery("SELECT * FROM "+DbSchema.CustomerSchema.TABLE_NAME, null);
- SimpleCursorAdapter custAdapter = new SimpleCursorAdapter(
- this,
- android.R.layout.simple_spinner_item,
- custCursor,
- new String[] { DbSchema.CustomerSchema.COLUMN_NAME },
- new int[] { android.R.id.text1 }
- );
- custAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- custSpn.setAdapter(custAdapter);
- builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- showDialog(DIALOG_TX_PROGRESS);
- Cursor cc = (Cursor)(custSpn.getSelectedItem());
- mCustIdTX = cc.getString(cc.getColumnIndex(DbSchema.CustomerSchema.COLUMN_ID));
- mDrvIdTX = drvIn.getText().toString();
- Thread t = new Thread(txRunnable);
- t.start();
- dialog.dismiss();
- if(cc!=null) {
- cc.close();
- }
- if(custCursor!=null) {
- custCursor.close();
- }
- }
- });
- dialog = builder.create();
- return dialog;
- }
- default:
- {
- return null;
- }
- }
- }
- public String prepareData() {
- //
- String dataMessage = "STX,H,";
- dataMessage += mPrefs.getString("activation", null) + ",";
- dataMessage += mCustIdTX + ",";
- dataMessage += mDrvIdTX + ",";
- String query = "SELECT * FROM "+DbSchema.ShipmentSchema.TABLE_NAME;
- Cursor kc = mDb.rawQuery(query, null);
- kc.moveToFirst();
- dataMessage += kc.getCount() + ",";
- boolean firstEntry = true;
- do {
- try {
- if(firstEntry) {
- dataMessage += kc.getString(kc.getColumnIndex(DbSchema.ShipmentSchema.COLUMN_ID));
- firstEntry = false;
- } else {
- dataMessage += "@";
- dataMessage += kc.getString(kc.getColumnIndex(DbSchema.ShipmentSchema.COLUMN_ID));
- }
- } catch(Exception e) {
- //
- }
- } while(kc.moveToNext());
- dataMessage += ",ETX";
- return dataMessage;
- }
- public boolean sendData(String command) {
- String tempLabel = mPrefs.getString("site_id", "New Site");
- String query = "SELECT * FROM " + DbSchema.SiteSchema.TABLE_NAME + " WHERE " + DbSchema.SiteSchema.COLUMN_LABEL + "='" + tempLabel + "'";
- Cursor tempCur = mDb.rawQuery(query, null);
- tempCur.moveToFirst();
- String port = null;
- String ip = null;
- ListIterator<ContentValues> iter = null;
- if(tempCur.getCount()>0) {
- ip = tempCur.getString(tempCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_IP));
- port = tempCur.getString(tempCur.getColumnIndex(DbSchema.SiteSchema.COLUMN_PORT));
- SocketConnection conn;
- boolean success = false;
- try {
- conn = new SocketConnection(this);
- conn.open(ip, new Integer(port));
- conn.sendCommand(command);
- String reply = conn.getReply();
- Log.e("smsreply", reply);
- if(!reply.contains("Shipment Data Transmitted!")) {
- //removeDialog(DIALOG_FAIL);
- TX_FAIL_TEXT = reply;
- //Log.e("smsreply", reply);
- //showDialog(DIALOG_FAIL);
- //throw new IOException();
- conn.close();
- return false;
- }
- conn.close();
- tempCur.close();
- return true;
- } catch(Exception e) {
- Log.e("smsmain", ""+e.toString());
- }
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement