0

could someone please help me. I'm having difficulty with LoadUrl and javascript.

The code below seems to work sorta ok (killing the app then trying again makes it work) on my old HTC running 2.3 however, my Xperia Z which runs the latest Android gets stuck on "Attempting to get Comments".

The section of code it is sticking on is InjectJavaScript() wherein this fails to LoadUrl (I know this as onPageFinished is never called). The strange thing is statistics part of the code works fine and its identical.

Sorry its pretty messy code...

@SuppressLint("SetJavaScriptEnabled")
public class MyIceland extends SherlockActivity {


    private static class FetchMyIceland extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... arg0) {
            setDialog("Checking Farera for WoW Data....",2);
            switch(FETCHFROMMYICELAND){
            case 0: //contact Farera for information.   
                Log.i("IcePlan","Farera Check/Empathica Front Page Retrieval...");
                MyIceland.url = MainActivity.BASE_URL+"android_get.php?action=myiceland&store="+MainActivity.STORE;
                try {
                    String Result = HTTPGET();
                    if(Result.startsWith("no")){ //content for today?
                        setDialog("No WoW Data Available for Today\nAbout to contact Empathica.com....",2);
                        activity.runOnUiThread(new Runnable(){@Override public void run() {MyIceland.FetchFromEmpathica("http://www.iceland.empathica.com/LogonIceland.aspx");;}}); }
                    else{FETCHFROMMYICELAND = 100;} //we do have content...
                } catch (IOException e1) {Log.i("IcePlan",e1.toString());} catch (Exception e1) {Log.i("IcePlan",e1.toString());
                } //we have data for today, so download and sort it.
            break;
            case 1: //get comments
                setDialog("About to Contact Empathica.com for Comments....",2);
                try {Thread.sleep(1000);} catch (InterruptedException e) {Log.i("IcePlan",e.toString());}
                activity.runOnUiThread(new Runnable(){@Override public void run() {MyIceland.FetchFromEmpathica("http://v2.empathica.com/Reporting1/ClientReporting/LiveDataReporting.aspx?RID=1&PID=Comments&TID=1a");}});
                break;
            case 2: //POST data
                setDialog("Posting all data to Farera.com \n So we don't have to do this again today....",2);
                 List<NameValuePair> params = new ArrayList<NameValuePair>();
                 try {params.add(new BasicNameValuePair("frontpage", URLEncoder.encode(FRONTPAGE, "utf-8")));} catch (UnsupportedEncodingException e) {Log.e("IcePlan",e.toString());}
                 try {params.add(new BasicNameValuePair("comments", URLEncoder.encode(COMMENTS, "utf-8")));} catch (UnsupportedEncodingException e) {Log.e("IcePlan",e.toString());}

                 MyIceland.url = MainActivity.BASE_URL+"android_get.php?action=store_myiceland&store="+MainActivity.STORE;
                 String POST = HTTPPOST(params);
                 if(POST != null){FETCHFROMMYICELAND = 100; }

                 break;


            }

            return null;
        }
        @Override
        protected void onPreExecute(){super.onPreExecute();}
        @Override
        protected void onPostExecute(Void arg0){

            if(FETCHFROMMYICELAND == 100) new MyIceland.DisplayMyIceland().execute();
            }

    }
    //------------------------------------------------------
    //-----------------------------------------------------
    //-----------------------------------------------------

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_iceland);
        ctx = getApplicationContext();
        activity = this;
        //webView2 = (WebView) findViewById(R.id.myIwebview2_widget);
        /********************************************************/
        /****************** ABS ********************************/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().show();
        // This is a workaround for http://b.android.com/15340 from
        // http://stackoverflow.com/a/5852198/132047

        BitmapDrawable bg = (BitmapDrawable) getResources().getDrawable(
                R.drawable.bg_striped);
        bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        getSupportActionBar().setBackgroundDrawable(bg);

        BitmapDrawable bgSplit = (BitmapDrawable) getResources().getDrawable(
                R.drawable.bg_striped);
        bgSplit.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        getSupportActionBar().setSplitBackgroundDrawable(bgSplit);
        /************************************************************/
        try {
            ov_e = (TextView) findViewById(R.id.overall_exp_tx);
            ov_r= (TextView) findViewById(R.id.overall_rank_tx);
            s_e= (TextView) findViewById(R.id.storeexp_tx);
            st_e= (TextView) findViewById(R.id.staffexp_tx);
            t_e= (TextView) findViewById(R.id.tillexp_tx);
            res= (TextView) findViewById(R.id.responses_tx);
            res_r= (TextView) findViewById(R.id.resp_rank_tx);

            MyIceland.list = (ListView) findViewById(R.id.wow_lv); // set list
            MyIceland.adapter = new SeparatedListAdapter(ctx, false); // initialise adapter
            //authenticate
            CookieSyncManager.createInstance(this);
            SetUp(); //Set up webView
            setDialog("Loading MyIceland data...\n Please be Patient...",0);
            new FetchMyIceland().execute(); //get data
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.i("IcePlan",e.toString());
        }

    }

    private static String HTTPPOST(List<NameValuePair> params){
        String Resp = null;
        try {
            HttpClient client = new DefaultHttpClient();  
            String postURL = MyIceland.url;
            HttpPost post = new HttpPost(postURL); 
                //List<NameValuePair> params = new ArrayList<NameValuePair>();
                //params.add(new BasicNameValuePair("user", "kris"));
                UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
                post.setEntity(ent);
                HttpResponse responsePOST = client.execute(post);  
                HttpEntity resEntity = responsePOST.getEntity();  
                if (resEntity != null) {  
                    Resp = "not null";

                }
        } catch (Exception e) {
            Log.e("IcePlan HTTPPOST",e.toString());
        }
        return Resp;
    }
    private static String HTTPGET() throws Exception, IOException{
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        HttpResponse response = client.execute(request);
        InputStream in = response.getEntity().getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder str = new StringBuilder();
        String line = null;
        while((line = reader.readLine()) != null)
        {
            str.append(line);
        }
        in.close();
        Log.i("IcePlan",str.toString());
        return str.toString();
    }   
    private void SetUp(){
        webView = (WebView) findViewById(R.id.myIwebview_widget); //load custom webview
        webView.clearView(); //clear view of browser
        webView.clearFormData(); //clear form data
        webView.setNetworkAvailable(MainActivity.isOnline(ctx)); //set network state
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setPluginsEnabled(false); //no flash
        webView.getSettings().setJavaScriptEnabled(true); // enable javascript
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
        webView.getSettings().setSavePassword(false); //don't show password dialog
        webView.setVerticalScrollBarEnabled(false); //no scrolling!
        webView.setHorizontalScrollBarEnabled(false); //no scrolling!
        webView.getSettings().setLoadsImagesAutomatically(false); // NO Images
        webView.getSettings().setSaveFormData(false); //Don't save form data

        //webView.setVisibility(View.VISIBLE);
        return;
    }
    private static void FetchFromEmpathica(String EmpathURL){

     /*****************************************************
     * setWebViewClient to load pages
     *****************************************************
     *****************************************************
     */
    webView.loadUrl(EmpathURL);
    MyIceland.page = 0; 
    webView.setWebViewClient(new WebViewClient() {  

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            //Log.i("IcePlan",url);
              view.loadUrl(url);
              return true;
               }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.i("IcePlan","Starting...");
            super.onPageStarted(view, url, favicon);

        }
           @Override
           public void onPageFinished(WebView view, String url) {

               Log.i("IcePlan","Loaded...");
               switch(FETCHFROMMYICELAND){
               case 0:
                   if(MyIceland.page == 0){

                       MyIceland.page=1;
                       try {Thread.sleep(500);}catch (InterruptedException e) {Log.e("IcePlan",e.toString());}
                       view.loadUrl("javascript: {" +
                                    "document.forms[0].elements['userNameBox'].value = 'xxx.xxxxx';" +
                                    "setTimeout(function(){document.forms[0].elements['passwordBox'].value = 'xxxxxxx';},300);" +
                                    "setTimeout(function(){document.forms[0].elements['loginButton'].click();},300); };");  
                   }else if(MyIceland.page == 1){
                       MyIceland.page=2;
                       try {Thread.sleep(1000);}catch (InterruptedException e) {Log.e("IcePlan",e.toString());}

                       String oAuthUrl=("v2.empathica.com");
                        if(url.indexOf(oAuthUrl) > -1)
                        {
                             Log.i("Contains","Auth URL");  
                              InjectJavaScript(view);
                        }else{view.loadUrl("javascript:{};");}
                   }else if (MyIceland.page ==2){
                       if(MyIceland.FRONTPAGE == null){
                       Log.i("IcePlan","Inject");
                       InjectJavaScript(view);
                       }else{MyIceland.page=3;}

                   }
                   break;
               case 1:
                       if(MyIceland.COMMENTS == null){
                           Log.i("IcePlan","Inject Comments");
                           InjectJavaScript(view);
                        }else{MyIceland.page=100;} //else end

                   break;
               }

               super.onPageFinished(view, url);
           }
        });
    return;

}



    }
    private static void setDialog(final String msg, final int dothis){
        activity.runOnUiThread(new Runnable() {
              @Override
            public void run() {
        switch(dothis){
        case 0: //set up and show
            if (dlg == null) {
                dlg = new ProgressDialog(activity);
                dlg.setTitle("Loading...");
                dlg.setMessage(msg);
                dlg.setCancelable(activity.isFinishing());
                dlg.show();
            }
            break;
        case 1: //remove and reset to null
            if (dlg.isShowing() || dlg!=null) {
                dlg.hide();
                dlg = null;
            }
            break;
        case 2:
            if (dlg.isShowing() || dlg!=null) {
                dlg.setMessage(msg);
            }
        }
              }});
        return;
    }   

/*********************************************************
 * HACK - Inject Javascript to get the HTML we want!
 *********************************************************/
    private static void InjectJavaScript(WebView view){
        switch(FETCHFROMMYICELAND){
        case 0: //get front page
            setDialog("Attempting to get Statistics...",2);
        view.loadUrl("javascript:{" +
                "var element =  document.getElementById('ReportDivFPRank');"+
                "if (typeof(element) != 'undefined' && element != null)"+
                "{" +
                "var e=document.getElementById(\"ReportDivFPCR\");"+
                "var content=e.innerHTML;"+
                "window.HTMLOUT.processHTML(content);"+// exists.
                "}" +
                "};");
        break;
        case 1: //get comments
            setDialog("Attempting to get Comments....",2);
            view.loadUrl("javascript:{" +
                    "var element =  document.getElementById('AddNPSDetails');"+
                    "if (typeof(element) != 'undefined' && element != null)"+
                    "{" +
                    "var e=document.getElementById(\"_ctl1_ReportDiv\");"+
                    "var content=e.innerHTML;"+
                    "window.HTMLOUT.processHTML(content);"+// exists.
                    "}" +
                    "};");
            break;
        }
        return;
        }
    /*********************************************************
     * Class injected into Empathica website to get HTML
     * Continues onto our controlling AsyncTask
     * @author Vince
     *
     ********************************************************/
    public static class MyJavaScriptInterface
      {

          public void processHTML(final String html)
          {
              setDialog("Caught RAW data....",2);
              if(html != ""){
                  //MyIceland.webView2.loadDataWithBaseURL("notreal/", html, "text/htm", "utf-8",null);
                  if(FETCHFROMMYICELAND == 0){ setDialog("Retrieved Area Statistics....",2); MyIceland.FRONTPAGE = html;}
                  else if(FETCHFROMMYICELAND == 1){ setDialog("Retrieved Area Comments....",2); MyIceland.COMMENTS = html;}
                  FETCHFROMMYICELAND++;
                  new MyIceland.FetchMyIceland().execute();

                  }

             return;  
            }
          } 

}
Biosonik
  • 43
  • 6
  • Xperia Z android is 4.1.2. Just tested code in Emulator 4.1.2 and it works fine...is there something wrong with the Xperia Z? – Biosonik May 01 '13 at 22:48

1 Answers1

0

I see that FetchFromEmpathica is going to be called again when you load the second page, and you set again a new WebViewClient() to the webview, put it on the setup() method so it is going to be called once.

Make sure that your Xperia is 4.1.2, nonetheless look what is mentioned on

Reference: JavascriptInterface methods in WebViews must now be annotated

Beginning in Android 4.2, you will now have to explicitly annotate public methods with @JavascriptInterface in order to make them accessible from hosted JavaScript. Note that this also only takes effect only if you have set your app's minSdkVersion or targetSdkVersion to 17 or higher.

Add it and import android.webkit.JavascriptInterface

So the code will be up-to-date to last versions.

      @JavascriptInterface
      public void processHTML(final String html)
      {
        //code
      }
AlexBcn
  • 2,450
  • 2
  • 17
  • 28