胡斌

use firefox geckoview

@@ -21,17 +21,30 @@ android { @@ -21,17 +21,30 @@ android {
21 targetCompatibility 1.8 21 targetCompatibility 1.8
22 sourceCompatibility 1.8 22 sourceCompatibility 1.8
23 } 23 }
  24 + flavorDimensions "abi"
  25 +
  26 + productFlavors {
  27 + arm { dimension "abi" }
  28 + // aarch64 { dimension "abi" }
  29 + }
  30 +}
  31 +
  32 +ext {
  33 + geckoviewChannel = "nightly"
  34 + // geckoviewVersion = "64.0.20180927100037"
  35 + // geckoviewVersion = "66.0.20181231091417"
  36 + geckoviewVersion = "66.0.20190116093310"
24 } 37 }
25 38
26 dependencies { 39 dependencies {
27 implementation fileTree(dir: 'libs', include: ['*.jar']) 40 implementation fileTree(dir: 'libs', include: ['*.jar'])
28 - implementation 'com.android.support:appcompat-v7:26.1.0'  
29 - implementation 'com.android.support:design:26.1.0'  
30 - implementation 'com.android.support.constraint:constraint-layout:1.0.2'  
31 - implementation 'com.android.support:support-vector-drawable:26.1.0'  
32 - implementation 'org.webrtc:google-webrtc:1.0.+' 41 + implementation 'com.android.support:appcompat-v7:27.1.1'
  42 + implementation 'com.android.support:design:27.1.0'
  43 + implementation 'com.android.support.constraint:constraint-layout:1.1.3'
  44 + implementation 'com.android.support:support-vector-drawable:27.1.0'
33 // testImplementation 'junit:junit:4.12' 45 // testImplementation 'junit:junit:4.12'
34 // androidTestImplementation 'com.android.support.test:runner:1.0.1' 46 // androidTestImplementation 'com.android.support.test:runner:1.0.1'
35 // androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 47 // androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
  48 + armImplementation "org.mozilla.geckoview:geckoview-${geckoviewChannel}-armeabi-v7a:${geckoviewVersion}"
36 } 49 }
37 50
@@ -18,6 +18,10 @@ @@ -18,6 +18,10 @@
18 </intent-filter> 18 </intent-filter>
19 </activity> 19 </activity>
20 </application> 20 </application>
  21 + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  22 + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  23 + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  24 + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
21 <uses-permission android:name ="android.permission.RECORD_AUDIO"/> 25 <uses-permission android:name ="android.permission.RECORD_AUDIO"/>
22 <uses-permission android:name ="android.permission.MODIFY_AUDIO_SETTINGS"/> 26 <uses-permission android:name ="android.permission.MODIFY_AUDIO_SETTINGS"/>
23 <uses-permission android:name="android.permission.CAMERA" /> 27 <uses-permission android:name="android.permission.CAMERA" />
@@ -7,6 +7,7 @@ import android.content.pm.PackageManager; @@ -7,6 +7,7 @@ import android.content.pm.PackageManager;
7 import android.net.Uri; 7 import android.net.Uri;
8 import android.os.Build; 8 import android.os.Build;
9 import android.os.Bundle; 9 import android.os.Bundle;
  10 +import android.os.SystemClock;
10 import android.support.annotation.NonNull; 11 import android.support.annotation.NonNull;
11 import android.support.design.widget.BottomNavigationView; 12 import android.support.design.widget.BottomNavigationView;
12 import android.support.v4.app.ActivityCompat; 13 import android.support.v4.app.ActivityCompat;
@@ -15,22 +16,24 @@ import android.support.v7.app.AppCompatActivity; @@ -15,22 +16,24 @@ import android.support.v7.app.AppCompatActivity;
15 import android.util.Log; 16 import android.util.Log;
16 import android.view.MenuItem; 17 import android.view.MenuItem;
17 import android.view.View; 18 import android.view.View;
18 -import android.webkit.ConsoleMessage;  
19 -import android.webkit.PermissionRequest;  
20 -import android.webkit.WebChromeClient;  
21 -import android.webkit.WebSettings;  
22 -import android.webkit.WebView;  
23 -import android.webkit.WebViewClient; 19 +import org.mozilla.geckoview.GeckoRuntime;
  20 +import org.mozilla.geckoview.GeckoSession;
  21 +import org.mozilla.geckoview.GeckoView;
24 22
25 import com.xuedianyun.cloudclass.R; 23 import com.xuedianyun.cloudclass.R;
26 24
  25 +import java.util.Locale;
  26 +
27 public class MainActivity extends AppCompatActivity { 27 public class MainActivity extends AppCompatActivity {
28 private static final int CAMERA_REQUEST = 1888; 28 private static final int CAMERA_REQUEST = 1888;
29 29
30 - private WebView mWebView; 30 + private GeckoView mWebView;
  31 + private GeckoSession mSession;
31 //private String mCustomURL = "https://pclive.xuedianyun.com/pcBase/agora/"; 32 //private String mCustomURL = "https://pclive.xuedianyun.com/pcBase/agora/";
32 private String mCustomURL = "https://webrtc.github.io/samples/src/content/devices/input-output/"; 33 private String mCustomURL = "https://webrtc.github.io/samples/src/content/devices/input-output/";
33 private String mWebrtcURL = "https://janus.conf.meetecho.com/videoroomtest.html"; 34 private String mWebrtcURL = "https://janus.conf.meetecho.com/videoroomtest.html";
  35 + private String mUrl;
  36 + private static final int REQUEST_PERMISSIONS = 2;
34 37
35 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 38 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
36 = new BottomNavigationView.OnNavigationItemSelectedListener() { 39 = new BottomNavigationView.OnNavigationItemSelectedListener() {
@@ -39,16 +42,18 @@ public class MainActivity extends AppCompatActivity { @@ -39,16 +42,18 @@ public class MainActivity extends AppCompatActivity {
39 public boolean onNavigationItemSelected(@NonNull MenuItem item) { 42 public boolean onNavigationItemSelected(@NonNull MenuItem item) {
40 switch (item.getItemId()) { 43 switch (item.getItemId()) {
41 case R.id.navigation_custom: 44 case R.id.navigation_custom:
42 - mWebView.loadUrl(mCustomURL); 45 + mUrl = mCustomURL;
  46 + mSession.loadUri(mUrl);
43 return true; 47 return true;
44 case R.id.navigation_webrtc: 48 case R.id.navigation_webrtc:
45 - mWebView.loadUrl(mWebrtcURL); 49 + mUrl = mWebrtcURL;
  50 + mSession.loadUri(mUrl);
46 return true; 51 return true;
47 case R.id.navigation_refresh: 52 case R.id.navigation_refresh:
48 - mWebView.reload(); 53 + mSession.reload();
49 return true; 54 return true;
50 case R.id.navigation_open: 55 case R.id.navigation_open:
51 - openBrowserWithURL(mWebView.getUrl()); 56 + openBrowserWithURL(mUrl);
52 return true; 57 return true;
53 } 58 }
54 return false; 59 return false;
@@ -84,6 +89,12 @@ public class MainActivity extends AppCompatActivity { @@ -84,6 +89,12 @@ public class MainActivity extends AppCompatActivity {
84 89
85 return; 90 return;
86 } 91 }
  92 + case REQUEST_PERMISSIONS: {
  93 + final ExamplePermissionDelegate permission = (ExamplePermissionDelegate)
  94 + mSession.getPermissionDelegate();
  95 + permission.onRequestPermissionsResult(permissions, grantResults);
  96 + return;
  97 + }
87 98
88 // other 'case' lines to check for other 99 // other 'case' lines to check for other
89 // permissions this app might request 100 // permissions this app might request
@@ -92,40 +103,17 @@ public class MainActivity extends AppCompatActivity { @@ -92,40 +103,17 @@ public class MainActivity extends AppCompatActivity {
92 103
93 private void createWebView() { 104 private void createWebView() {
94 105
95 - mWebView = (WebView) findViewById(R.id.webview);  
96 - setUpWebViewDefaults(mWebView);  
97 - mWebView.loadUrl(mCustomURL);  
98 - mWebView.setWebChromeClient(new WebChromeClient() {  
99 -  
100 - public boolean onConsoleMessage(ConsoleMessage m) {  
101 - Log.d("getUserMedia, WebView", m.message() + " -- From line "  
102 - + m.lineNumber() + " of "  
103 - + m.sourceId());  
104 -  
105 - return true;  
106 - }  
107 -  
108 - @Override  
109 - public void onPermissionRequest(final PermissionRequest request) {  
110 -  
111 - // getActivity().  
112 - MainActivity.this.runOnUiThread(new Runnable() {  
113 - @TargetApi(Build.VERSION_CODES.LOLLIPOP)  
114 - @Override  
115 - public void run() {  
116 - // Below isn't necessary, however you might want to:  
117 - // 1) Check what the site is and perhaps have a blacklist  
118 - // 2) Have a pop up for the user to explicitly give permission  
119 - //if(request.getOrigin().toString().equals("https://pclive.xuedianyun.com/") ||  
120 - // request.getOrigin().toString().equals("https://janus.conf.meetecho.com/")) {  
121 - request.grant(request.getResources());  
122 - // } else {  
123 - // request.deny();  
124 - // }  
125 - }  
126 - });  
127 - }  
128 - }); 106 + mWebView = (GeckoView) findViewById(R.id.webview);
  107 + mSession = new GeckoSession();
  108 + GeckoRuntime runtime = GeckoRuntime.create(this);
  109 +
  110 + mSession.open(runtime);
  111 + mWebView.setSession(mSession);
  112 + mUrl = mCustomURL;
  113 + final ExamplePermissionDelegate permission = new ExamplePermissionDelegate();
  114 + permission.androidPermissionRequestCode = REQUEST_PERMISSIONS;
  115 + mSession.setPermissionDelegate(permission);
  116 + mSession.loadUri(mUrl);
129 } 117 }
130 118
131 private void checkForAndAskForPermissions() { 119 private void checkForAndAskForPermissions() {
@@ -160,30 +148,89 @@ public class MainActivity extends AppCompatActivity { @@ -160,30 +148,89 @@ public class MainActivity extends AppCompatActivity {
160 } 148 }
161 } 149 }
162 150
163 - private void setUpWebViewDefaults(WebView webView) {  
164 151
165 - WebSettings settings = webView.getSettings();  
166 - settings.setJavaScriptEnabled(true); 152 + private class ExamplePermissionDelegate implements GeckoSession.PermissionDelegate {
  153 +
  154 + public int androidPermissionRequestCode = 1;
  155 + private Callback mCallback;
  156 +
  157 + public void onRequestPermissionsResult(final String[] permissions,
  158 + final int[] grantResults) {
  159 + if (mCallback == null) {
  160 + return;
  161 + }
  162 +
  163 + final Callback cb = mCallback;
  164 + mCallback = null;
  165 + for (final int result : grantResults) {
  166 + if (result != PackageManager.PERMISSION_GRANTED) {
  167 + // At least one permission was not granted.
  168 + cb.reject();
  169 + return;
  170 + }
  171 + }
  172 + cb.grant();
  173 + }
167 174
168 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {  
169 - webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 175 + @Override
  176 + public void onAndroidPermissionsRequest(final GeckoSession session, final String[] permissions,
  177 + final Callback callback) {
  178 + if (Build.VERSION.SDK_INT >= 23) {
  179 + // requestPermissions was introduced in API 23.
  180 + mCallback = callback;
  181 + requestPermissions(permissions, androidPermissionRequestCode);
  182 + } else {
  183 + callback.grant();
  184 + }
170 } 185 }
171 186
172 - settings.setCacheMode(WebSettings.LOAD_NO_CACHE);  
173 - settings.setAllowContentAccess(true);  
174 - settings.setAllowFileAccessFromFileURLs(true);  
175 - settings.setAllowUniversalAccessFromFileURLs(true);  
176 - settings.setJavaScriptCanOpenWindowsAutomatically(true);  
177 - settings.setMediaPlaybackRequiresUserGesture(false); 187 + @Override
  188 + public void onContentPermissionRequest(final GeckoSession session, final String uri,
  189 + final int type, final Callback callback) {
  190 + final int resId;
  191 + /* if (PERMISSION_GEOLOCATION == type) {
  192 + resId = R.string.request_geolocation;
  193 + } else if (PERMISSION_DESKTOP_NOTIFICATION == type) {
  194 + resId = R.string.request_notification;
  195 + } else if (PERMISSION_AUTOPLAY_MEDIA == type) {
  196 + resId = R.string.request_autoplay;
  197 + } else {
  198 + Log.w(LOGTAG, "Unknown permission: " + type);
  199 + callback.reject();
  200 + return;
  201 + }
178 202
179 - // Enable remote debugging via chrome://inspect  
180 - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
181 - WebView.setWebContentsDebuggingEnabled(true); 203 + final String title = getString(resId, Uri.parse(uri).getAuthority());
  204 + final BasicGeckoViewPrompt prompt = (BasicGeckoViewPrompt)
  205 + mGeckoSession.getPromptDelegate();
  206 + prompt.onPermissionPrompt(session, title, callback);*/
  207 + callback.grant();
182 } 208 }
183 209
184 - webView.clearCache(true);  
185 - webView.clearHistory();  
186 - webView.setWebViewClient(new WebViewClient()); 210 + @Override
  211 + public void onMediaPermissionRequest(final GeckoSession session, final String uri,
  212 + final MediaSource[] video, final MediaSource[] audio,
  213 + final MediaCallback callback) {
  214 + /* final String host = Uri.parse(uri).getAuthority();
  215 + final String title;
  216 + if (audio == null) {
  217 + title = getString(R.string.request_video, host);
  218 + } else if (video == null) {
  219 + title = getString(R.string.request_audio, host);
  220 + } else {
  221 + title = getString(R.string.request_media, host);
  222 + }
  223 +
  224 + String[] videoNames = normalizeMediaName(video);
  225 + String[] audioNames = normalizeMediaName(audio);
  226 +
  227 + final BasicGeckoViewPrompt prompt = (BasicGeckoViewPrompt)
  228 + mGeckoSession.getPromptDelegate();
  229 + prompt.onMediaPrompt(session, title, video, audio, videoNames, audioNames, callback);*/
  230 + MediaSource v = video.length > 0 ? video[0] : null;
  231 + MediaSource a = video.length > 0 ? audio[0]:null;
  232 + callback.grant(v,a);
  233 + }
187 } 234 }
188 235
189 private void openBrowserWithURL(String url) { 236 private void openBrowserWithURL(String url) {
@@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
19 app:layout_constraintRight_toRightOf="parent" 19 app:layout_constraintRight_toRightOf="parent"
20 app:menu="@menu/navigation" /> 20 app:menu="@menu/navigation" />
21 21
22 - <WebView 22 + <org.mozilla.geckoview.GeckoView
23 android:id="@+id/webview" 23 android:id="@+id/webview"
24 android:layout_width="fill_parent" 24 android:layout_width="fill_parent"
25 android:layout_height="fill_parent" /> 25 android:layout_height="fill_parent" />
@@ -19,6 +19,9 @@ allprojects { @@ -19,6 +19,9 @@ allprojects {
19 repositories { 19 repositories {
20 google() 20 google()
21 jcenter() 21 jcenter()
  22 + maven {
  23 + url "https://maven.mozilla.org/maven2/"
  24 + }
22 } 25 }
23 } 26 }
24 27