Android Open Source - ImproveMyCity-Mobile Fragment_ New Issue B






From Project

Back to project page ImproveMyCity-Mobile.

License

The source code is released under:

GNU General Public License

If you think the Android project ImproveMyCity-Mobile listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/* Activity_NewIssueB */
package com.mk4droid.IMC_Activities;
//from  w  w w  . j  av a 2s  .com
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.flurry.android.FlurryAgent;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.GoogleMap.OnMyLocationChangeListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polygon;
import com.mk4droid.IMC_Services.Service_Data;
import com.mk4droid.IMC_Services.Service_Location;
import com.mk4droid.IMC_Services.Upload_Data;
import com.mk4droid.IMC_Store.Constants_API;
import com.mk4droid.IMC_Utils.GEO;
import com.mk4droid.IMCity_PackDemo.R;

/**
 * Second fragment for submitting an issue: selecting the location of the issue and submit to remote server  
 *
 * @copyright   Copyright (C) 2012 - 2013 Information Technology Institute ITI-CERTH. All rights reserved.
 * @license     GNU Affero General Public License version 3 or later; see LICENSE.txt
 * @author      Dimitrios Ververidis for the Multimedia Group (http://mklab.iti.gr). 
 *
 */
public class Fragment_NewIssueB extends Fragment implements OnMarkerDragListener, OnMarkerClickListener, OnInfoWindowClickListener{

  /** This fragment */
  public static Fragment_NewIssueB mfrag_nIssueB;
  
  /** Strings, images, etc. */
  public static Resources resources;
    
  /** The new issue coordinates for zooming on Main map after issue has been submitted successfulyl  */
  public static double LastIssLat, LastIssLong;
  
  /** The edittext where to set automatically or manually the address string */
  public static EditText etAddress;
  
  static Handler handlerBroadcastNewIssue;

  int tlv = Toast.LENGTH_LONG;
  double Lat_D,Long_D;

  // ---------- WINDOW --------
  DisplayMetrics metrics;
  public static Context ctx;

  //----------- GPS -----------
  String Address_STR = "";
  Handler handlerAddresUPD;

  ScrollView scr_NIB;
  ImageView  imv_transparent; 

  static Marker mMarker;

  static LatLng pos;
  static Button btSubmit;
  

  Polygon poly = null;
  //------------VARs ------------

  String UserNameSTR,PasswordSTR,UserID_STR;
  SharedPreferences mshPrefs;
  int IndexCatSpinner;


  View vframeLayout_nib;
  SupportMapFragment fmap;
  GoogleMap gmap;

  private ProgressDialog progressLoc;

  private static ProgressDialog progressSending,progressReported;

  //============== OnCreate ==================
  /**
   *  Set content view. 
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    pos = new LatLng(Service_Location.locUser.getLatitude(), Service_Location.locUser.getLongitude() );
    mshPrefs        = PreferenceManager.getDefaultSharedPreferences(getActivity());

    IndexCatSpinner = getArguments() != null ? getArguments().getInt("IndexSpinner") : -1; // Serial Index of the issue
    resources       = SetResources();
  }


  /**
   *    on Create View of this fragment
   */
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);    

    ctx = this.getActivity();

    if (vframeLayout_nib != null) {
      ViewGroup parent = (ViewGroup) vframeLayout_nib.getParent();
      parent.removeView(vframeLayout_nib);
    } else 
      vframeLayout_nib = inflater.inflate(R.layout.framelayout_newissue_b, container, false);

    mfrag_nIssueB = this;
    
    resources = SetResources();

    //--------------------------
    if (fmap == null){
      fmap  = SupportMapFragment.newInstance();
      getChildFragmentManager().beginTransaction().add(R.id.flmapnewissue, fmap).commit();
    }

    etAddress = (EditText) vframeLayout_nib.findViewById(R.id.etAddress);
    etAddress.setCompoundDrawablesWithIntrinsicBounds(resources.getDrawable(R.drawable.ic_location), null, null, null);

    scr_NIB = (ScrollView) vframeLayout_nib.findViewById(R.id.scrNIB);
    imv_transparent = (ImageView) vframeLayout_nib.findViewById(R.id.imv_overlaymap_NIB);

    imv_transparent.setOnTouchListener(new View.OnTouchListener() {

      @Override
      public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
          // Disallow ScrollView to intercept touch events.
          scr_NIB.requestDisallowInterceptTouchEvent(true);
          // Disable touch on transparent view
          return false;

        case MotionEvent.ACTION_UP:
          // Allow ScrollView to intercept touch events.
          scr_NIB.requestDisallowInterceptTouchEvent(false);
          return true;

        case MotionEvent.ACTION_MOVE:
          scr_NIB.requestDisallowInterceptTouchEvent(true);
          return false;

        default: 
          return true;
        }   
      }
    });


    //----- Handler for setting address string ------------
    handlerAddresUPD = new Handler()
    {
      public void handleMessage(Message msg)
      {

        if (msg.arg1 == 2) { // Location not found, get from predefined

          pos = new LatLng(Constants_API.locUserPred_Lat, Constants_API.locUserPred_Long);

          gmap.moveCamera(CameraUpdateFactory.newLatLngZoom(pos,14));     // Cannot zoom to bounds until the map has a size.

          mMarker = gmap.addMarker(new MarkerOptions()
          .position(pos)
          .title(resources.getString(R.string.Issueposition))
          .snippet(resources.getString(R.string.Dragndrop))
          .draggable(true));
        }

        Lat_D  = mMarker.getPosition().latitude;
        Long_D = mMarker.getPosition().longitude;

        LatLng pt = new LatLng(Lat_D, Long_D); 

        Address_STR = GEO.ConvertGeoPointToAddress(pt, ctx);

        if (Address_STR!="")
          etAddress.setText(Address_STR);

        progressLoc.dismiss();

        super.handleMessage(msg);
      }
    };

    //-------- Broadcast new Issue was send through a handler ---------
    handlerBroadcastNewIssue = new Handler(){
      public void handleMessage(Message msg){
        if (msg.arg1 == 1) // Refresh Button
          ctx.sendBroadcast(new Intent("android.intent.action.MAIN").putExtra("NewIssueAdded", "ok"));  

        super.handleMessage(msg);
      }
    };

    return vframeLayout_nib;
  }

  //============== On Resume =====================
  /**
   * Executed after activity is created or after changing tab
   */
  @Override
  public void onResume() {
    super.onResume();

    // The new issue coordinates
    LastIssLat  = 0;
    LastIssLong = 0;

    progressLoc = ProgressDialog.show(ctx, "", "", true);
    progressLoc.setContentView(R.layout.dialog_transparent_progress);
    ((TextView) progressLoc.findViewById(R.id.tv_prog)).setText("");


    resources = SetResources();



    //---------- Map ------
    gmap = fmap.getMap();

    // Check if we were successful in obtaining the map.
    if (gmap != null) {
      gmap.clear();
      gmap.setOnInfoWindowClickListener(this);
      
      //------- Create Polygon ----------
      if (poly==null)
        poly = GEO.MakeBorders(gmap, getResources());




      gmap.moveCamera(CameraUpdateFactory.newLatLngZoom(pos,14));

      gmap.setOnMyLocationChangeListener(new OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location arg0) {

          if (mMarker==null){
            pos = new LatLng(arg0.getLatitude(), arg0.getLongitude());

            gmap.moveCamera(CameraUpdateFactory.newLatLngZoom(pos,14));     // Cannot zoom to bounds until the map has a size.

            mMarker = gmap.addMarker(new MarkerOptions()
            .position(pos)
            .title(resources.getString(R.string.Issueposition))
            .snippet(resources.getString(R.string.Dragndrop))
            .draggable(true));


            Message msg = new Message();
            msg.arg1 = 1;
            handlerAddresUPD.sendMessage(msg);
          }
        }
      });

      gmap.setOnMarkerDragListener(this);
      gmap.setMyLocationEnabled(true);

      //----- Timed Trigger to ensure that if loc not found then get prefined loc ---
      new Thread(new Runnable() {

        @Override
        public void run() {

          try {
            Thread.sleep(6000);

            if (progressLoc.isShowing()){
              Message msg = new Message();
              msg.arg1 = 2;
              handlerAddresUPD.sendMessage(msg);
            }

          } catch (InterruptedException e) {
          }

        }
      }).start();

    }

    // ============ SUBMIT BUTTON ====================
    btSubmit = (Button) vframeLayout_nib.findViewById(R.id.btReport_new_issue);

    btSubmit.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {

        String titleData_STR       = Fragment_NewIssueA.et_title.getText().toString();  // 1. Title Data
        String descriptionData_STR = Fragment_NewIssueA.et_descr.getText().toString();  // 3. Description Data
        Address_STR                = etAddress.getText().toString();

        String ImageFN_target = "";

        // Check if Image is taken else do not sent  
        if (Fragment_NewIssueA.flagPictureTaken){
          String FileNameExt = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss'.jpg'").format(new Date());

          FileNameExt  =  FileNameExt.replace("-", "_");
          FileNameExt  =  FileNameExt.replace(" ", "t");
          ImageFN_target = UserID_STR + "d" + FileNameExt;
        }

        double Lat_D  = mMarker.getPosition().latitude;
        double Long_D = mMarker.getPosition().longitude;

        // Check if title is long enough and sent
        if ( Fragment_NewIssueA.et_title.getText().toString().length() > 2 && 
            etAddress.getText().toString().length()>0 && 
            Fragment_NewIssueA.et_descr.getText().toString().length() > 2){

          if (GEO.insidePoly(poly, Long_D, Lat_D)){
            new AsynchTask_ReportIssue(ImageFN_target, titleData_STR, IndexCatSpinner, 
                Lat_D, Long_D, descriptionData_STR, Address_STR, UserNameSTR, PasswordSTR).execute();
          } else {
            Toast.makeText(ctx,  resources.getString(R.string.Issueoutofmunicipalitylimits),  tlv).show();
          }
        }else if ( Fragment_NewIssueA.et_title.getText().toString().length() <= 2){
          Toast.makeText(ctx, resources.getString(R.string.LongerTitle), tlv).show();
        }else if ( etAddress.getText().toString().length() == 0){
          Toast.makeText(ctx, resources.getString(R.string.WriteAddress), tlv).show();
        }else if ( Fragment_NewIssueA.et_descr.getText().toString().length() <= 2){
          Toast.makeText(ctx, resources.getString(R.string.LongerDescription), tlv).show();
        }

      }});

    //----------- Flurry Analytics --------
    boolean AnalyticsSW = mshPrefs.getBoolean("AnalyticsSW", true);
    if (AnalyticsSW)
      FlurryAgent.onStartSession(ctx, Constants_API.Flurry_Key);
  }

  //================= onPause =========================
  /**
   *    Hinter map visibility and stop Flurry analytics
   */
  @Override
  public void onPause() {
    super.onPause();

    btSubmit.setText(resources.getString(R.string.ReportIss));

    if (gmap!=null){
      gmap.setMyLocationEnabled(false);
      poly = null;  
    }

    mMarker = null;
    //----------- Flurry Analytics --------
    boolean AnalyticsSW = mshPrefs.getBoolean("AnalyticsSW", true);

    if (AnalyticsSW)
      FlurryAgent.onEndSession(ctx);
  }  


  //============   Set Resources =========================== 
  /* Retrieve preferences and set resources language */ 
  private Resources SetResources(){

    String LangSTR          = mshPrefs.getString("LanguageAR", Constants_API.DefaultLanguage);
    UserID_STR              = mshPrefs.getString("UserID_STR", "");

    
    
    UserNameSTR      = mshPrefs.getString("UserNameAR", "");
    PasswordSTR      = mshPrefs.getString("PasswordAR", "");

    Configuration conf = getResources().getConfiguration();
    conf.locale = new Locale(LangSTR.substring(0, 2)); //----- Convert Greek -> el ---------
    metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    return new Resources(getActivity().getAssets(), metrics, conf);
  }


  /**
   *    OnMarker drag end set Position
   */
  @Override
  public void onMarkerDragEnd(Marker arg0) {

    progressLoc = ProgressDialog.show(ctx, "", "", true);
    progressLoc.setContentView(R.layout.dialog_transparent_progress);
    ((TextView) progressLoc.findViewById(R.id.tv_prog)).setText("");

    Message msg = new Message();
    msg.arg1 = 1;
    handlerAddresUPD.sendMessage(msg);
  }


  /**
   *    OnMarker drag start vibrate
   */
  @Override
  public void onMarkerDragStart(Marker arg0) {
    //Vibrate
    Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(500);    
  }

  @Override
  public void onMarkerDrag(Marker arg0) {}



  /**
   *   Report Issue Asynchronously 
   *   
   * @copyright   Copyright (C) 2012 - 2013 Information Technology Institute ITI-CERTH. All rights reserved.
   * @license     GNU Affero General Public License version 3 or later; see LICENSE.txt
   * @author      Dimitrios Ververidis for the Multimedia Group (http://mklab.iti.gr). 
   *
   */
  private static class AsynchTask_ReportIssue extends AsyncTask<String, String, Boolean>{

    private String imagepathtarget = "";
    private String title = "";
    private int IndexCatSpinner;
    private double Lat_D, Long_D;
    private String descriptionData_STR, Address_STR, UserNameSTR, PasswordSTR;
    /**
     * 
     */
    public AsynchTask_ReportIssue(String imagepathtarget_in, String title_in, int IndexCatSpinner_in, 
        double Lat_D_in, double  Long_D_in, String descriptionData_STR_in, String Address_STR_in, String UserNameSTR_in, String PasswordSTR_in) {

      imagepathtarget = imagepathtarget_in;
      title = title_in;
      IndexCatSpinner = IndexCatSpinner_in;
      Lat_D = Lat_D_in;
      Long_D = Long_D_in;
      descriptionData_STR = descriptionData_STR_in;
      Address_STR = Address_STR_in;
      UserNameSTR =UserNameSTR_in;
      PasswordSTR = PasswordSTR_in;
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
      progressSending = ProgressDialog.show(ctx, "", "", true);
      progressSending.setContentView(R.layout.dialog_transparent_progress);
      ((TextView) progressSending.findViewById(R.id.tv_prog)).setText(resources.getString(R.string.Uploading));

      super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... params) {

      boolean successIadd = false ;

      successIadd = Upload_Data.SendIssue(Fragment_NewIssueA.image_path_source_temp, imagepathtarget, 
          title, Fragment_NewIssueA.SpinnerArrID[IndexCatSpinner],
          Lat_D, Long_D, descriptionData_STR, Address_STR, UserNameSTR, PasswordSTR );



      return successIadd;
    };


    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(Boolean success) {

      progressSending.dismiss();

      if (success){
        btSubmit.setText(resources.getString(R.string.IssueReported));

        //------- Reset GUI --------
        Fragment_NewIssueA.flagPictureTaken = false;
        Fragment_NewIssueA.flagStarter = true;
        Fragment_NewIssueA.btAttachImage.setScaleType(ScaleType.CENTER_INSIDE);
        Fragment_NewIssueA.btAttachImage.setImageResource(R.drawable.bt_custom_camera_round);
        Fragment_NewIssueA.spPosition = -1;
        Fragment_NewIssueA.et_title.setText("");
        Fragment_NewIssueA.et_descr.setText("");

        progressReported = ProgressDialog.show(ctx, "", "", true);
        progressReported.setContentView(R.layout.dialog_transparent_issue_success);

        Button btClose =  (Button) progressReported.findViewById(R.id.bt_close_issrep);

        btClose.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            progressReported.dismiss();

            LastIssLat  = Lat_D;
            LastIssLong = Long_D;

            // ------- Send Broadcast through a handler -------
            Message msg = new Message();
            msg.arg1 = 1;
            handlerBroadcastNewIssue.sendMessage(msg);
          }
        });
      } else {
        if (!Service_Data.HasInternet)
          Toast.makeText(ctx, resources.getString(R.string.NoInternet), Toast.LENGTH_LONG).show();
        else 
          Toast.makeText(ctx, resources.getString(R.string.FailMes), Toast.LENGTH_LONG).show();

        LastIssLat  = 0;
        LastIssLong = 0;
      }
      super.onPostExecute(success);
    }
  }

  /* (non-Javadoc)
   * @see com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener#onInfoWindowClick(com.google.android.gms.maps.model.Marker)
   */
  @Override
  public void onInfoWindowClick(Marker mM) {
    mM.hideInfoWindow();
  }

  /* (non-Javadoc)
   * @see com.google.android.gms.maps.GoogleMap.OnMarkerClickListener#onMarkerClick(com.google.android.gms.maps.model.Marker)
   */
  @Override
  public boolean onMarkerClick(Marker mM) {
    mM.hideInfoWindow();
    return false;
  }
}




Java Source Code List

com.mk4droid.IMC_Activities.Activity_Information_Detailed.java
com.mk4droid.IMC_Activities.Activity_Register.java
com.mk4droid.IMC_Activities.Activity_Setup.java
com.mk4droid.IMC_Activities.Activity_Splash_Login.java
com.mk4droid.IMC_Activities.Activity_Thinking.java
com.mk4droid.IMC_Activities.FActivity_TabHost.java
com.mk4droid.IMC_Activities.Fragment_Comments.java
com.mk4droid.IMC_Activities.Fragment_Filters.java
com.mk4droid.IMC_Activities.Fragment_Issue_Details.java
com.mk4droid.IMC_Activities.Fragment_List.java
com.mk4droid.IMC_Activities.Fragment_Map.java
com.mk4droid.IMC_Activities.Fragment_NewIssueA.java
com.mk4droid.IMC_Activities.Fragment_NewIssueB.java
com.mk4droid.IMC_Activities.package-info.java
com.mk4droid.IMC_Constructors.Category.java
com.mk4droid.IMC_Constructors.Comment.java
com.mk4droid.IMC_Constructors.IssueListItem.java
com.mk4droid.IMC_Constructors.IssuePic.java
com.mk4droid.IMC_Constructors.Issue.java
com.mk4droid.IMC_Constructors.VersionDB.java
com.mk4droid.IMC_Constructors.Vote.java
com.mk4droid.IMC_Constructors.package-info.java
com.mk4droid.IMC_Core.FilterCateg_ExpandableListAdapter.java
com.mk4droid.IMC_Core.ImageView_Zoom.java
com.mk4droid.IMC_Core.InfoWindowAdapterButtoned.java
com.mk4droid.IMC_Core.Issues_ListAdapter.java
com.mk4droid.IMC_Core.Preference_About.java
com.mk4droid.IMC_Core.Preference_AccountOperations.java
com.mk4droid.IMC_Core.Preference_Email.java
com.mk4droid.IMC_Core.Preference_PlainText.java
com.mk4droid.IMC_Core.Preference_Reset.java
com.mk4droid.IMC_Core.Preference_SeekBar.java
com.mk4droid.IMC_Core.SpinnerAdapter_NewIssueCateg.java
com.mk4droid.IMC_Core.package-info.java
com.mk4droid.IMC_Services.DatabaseHandler.java
com.mk4droid.IMC_Services.Download_Data.java
com.mk4droid.IMC_Services.InternetConnCheck.java
com.mk4droid.IMC_Services.Security.java
com.mk4droid.IMC_Services.Service_Data.java
com.mk4droid.IMC_Services.Service_Location.java
com.mk4droid.IMC_Services.Upload_Data.java
com.mk4droid.IMC_Services.package-info.java
com.mk4droid.IMC_Store.Constants_API.java
com.mk4droid.IMC_Store.Phptasks.java
com.mk4droid.IMC_Store.package-info.java
com.mk4droid.IMC_Utils.GEO.java
com.mk4droid.IMC_Utils.My_Crypt_Utils.java
com.mk4droid.IMC_Utils.My_Date_Utils.java
com.mk4droid.IMC_Utils.My_System_Utils.java
com.mk4droid.IMC_Utils.RestCaller.java
com.mk4droid.IMC_Utils.RestClient.java
com.mk4droid.IMC_Utils.package-info.java