MrM
MrM

Reputation: 85

Android webview Notification from Javascript

How can I make the showToast inside the JavaScriptInteface call the CreateNotification?

Here is my code:

CheckInventoryActivity.java

package com.CheckInventory;;


import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

@SuppressWarnings("unused")
public class CheckInventory;Activity extends Activity {
    WebView webview;
    String username; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.setBackgroundColor(0);
        webView.setBackgroundResource(R.drawable.myimage);
        webView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
        WebSettings webSettings = webview.getSettings();
        webSettings.setLoadWithOverviewMode(true);

        webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setDatabasePath("/data/data/"+this.getPackageName()+"/databases/");
        webSettings.setDomStorageEnabled(true);
        webview.setWebChromeClient(new WebChromeClient());
        webview.loadUrl("http://192.168.0.124/android");
        webview.setWebViewClient(new HelloWebViewClient());

    }

    public void OnResume(Bundle savedInstanceState) {
        super.onResume();
         CancelNotification();
    }


    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
        {
            super.onReceivedError(view, errorCode, description, failingUrl);
            webview.loadUrl("file:///android_asset/nodata.html");
            Toast.makeText(getApplicationContext(),"Not online", Toast.LENGTH_LONG).show();
        }
    }


    public void CreateNotification()
    {
        Toast.makeText(getApplicationContext(),"Notifying", Toast.LENGTH_LONG).show();

        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

        int icon = R.drawable.ic_launcher;              // icon from resources
        long when = System.currentTimeMillis();         // notification time
        Context context = getApplicationContext();      // application Context
        CharSequence tickerText = "Chess";              // ticker-text
        CharSequence contentTitle = "CheckInventory;";      // message title
        CharSequence contentText = "You have an action to take";      // message text

        Intent notificationIntent = new Intent(CheckInventory;Activity.this, CheckInventory;Activity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(CheckInventory;Activity.this, 0, notificationIntent, 0);
        Notification notification = new Notification(icon, tickerText, when);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE | Notification.FLAG_AUTO_CANCEL;    
        mNotificationManager.notify(1234, notification);
    }

    public void CancelNotification()
    {
        Toast.makeText(getApplicationContext(),"Lets get it on!!", Toast.LENGTH_LONG).show();
        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
        mNotificationManager.cancel(1234);
    }
}

JavaScriptInterface.java

package com.CheckInventory;

import android.widget.Toast;
import android.content.Context;

public class JavaScriptInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_LONG).show();
    }
}

I'm new at working with Java and Android, at when I try to call the method, it gives me an error because it is not static. Bottom line I am looking for the JavaScriptInterface to create a Notification.

Since I am this new, I would need a sample code that has direct relation to my problem.

Your help is appreciated!!

Thx

Upvotes: 0

Views: 5295

Answers (1)

A--C
A--C

Reputation: 36449

Besides the fact that CheckInventory;Activity is not a valid class name, the rest seems to be alright. If notifying the user has to be done in your Activity, this is one approach. In your JavaScriptInterface's showToast() call CreateNotification as so:

((CheckInventoryActivity)mContext).CreateNotification();

This casts your mContext variable so it is a CheckInventoryActivity then calls your CreateNotification method.

If mContext is not always an instance of CheckInventoryActivity then you will need to do something like this:

 if (mContext instanceof CheckInventoryActivity){
      ((CheckInventoryActivity)mContext).CreateNotification();
    }

However, I don't understand why you don't put your notification code directly in JavaScriptInterface. You have a Context variable (mContext), and the Notification & Intents require a Context variable as one of the arguments. Simply put, you seem to have the necessary tools to display a Notification right from that Non-Activity Class. Just make sure to call getSystemService(ns); as context.getSystemService(ns); and to remove all the getApplicationContext() method calls.

Upvotes: 1

Related Questions