Browse Source

更改logo , web server 实现

liuyuqi-dellpc 3 years ago
parent
commit
db53212349
33 changed files with 373 additions and 240 deletions
  1. 1 0
      .gitignore
  2. 20 5
      app/build.gradle
  3. 8 2
      app/src/main/AndroidManifest.xml
  4. 19 0
      app/src/main/java/me/yoqi/android/nanohttpdemo/App.java
  5. 9 9
      app/src/main/java/me/yoqi/android/nanohttpdemo/MainActivity.java
  6. 199 10
      app/src/main/java/me/yoqi/android/nanohttpdemo/net/LocalHttpService.java
  7. 3 2
      app/src/main/java/me/yoqi/android/nanohttpdemo/service/LocalService.java
  8. 66 0
      app/src/main/java/me/yoqi/android/nanohttpdemo/ui/EditActivity.java
  9. BIN
      app/src/main/res/drawable-hdpi/ic_launcher.png
  10. BIN
      app/src/main/res/drawable-mdpi/ic_launcher.png
  11. 0 30
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  12. BIN
      app/src/main/res/drawable-xhdpi/ic_launcher.png
  13. BIN
      app/src/main/res/drawable-xxhdpi/ic_launcher.png
  14. 0 170
      app/src/main/res/drawable/ic_launcher_background.xml
  15. 16 0
      app/src/main/res/layout/activity_edit.xml
  16. 2 2
      app/src/main/res/layout/activity_main.xml
  17. 0 5
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  18. 0 5
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  19. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  20. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  21. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  22. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  23. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  24. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  25. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  26. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  27. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  28. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  29. 5 0
      app/src/main/res/values-zh/strings.xml
  30. 1 0
      app/src/main/res/values/strings.xml
  31. 6 0
      app/src/main/res/values/themes.xml
  32. 2 0
      build.gradle
  33. 16 0
      config.bak.gradle

+ 1 - 0
.gitignore

@@ -14,3 +14,4 @@
 .cxx
 local.properties
 /.idea
+/config.gradle

+ 20 - 5
app/build.gradle

@@ -2,23 +2,38 @@ plugins {
     id 'com.android.application'
 }
 
+def sign = rootProject.ext.sign
+def build = rootProject.ext.build
+
 android {
+    signingConfigs {
+        release {
+            storeFile file(sign.storeFile)
+            keyAlias sign.keyAlias
+            keyPassword sign.keyPassword
+            storePassword sign.storePassword
+        }
+    }
     compileSdkVersion 29
 
     defaultConfig {
         applicationId "me.yoqi.android.nanohttpdemo"
-        minSdkVersion 16
-        targetSdkVersion 29
-        versionCode 1
-        versionName "1.0"
+        minSdkVersion build.minSdkVersion
+        targetSdkVersion build.targetSdkVersion
+        versionCode build.versionCode
+        versionName build.versionName
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
 
     buildTypes {
-        release {
+        debug {
             minifyEnabled false
+        }
+        release {
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.release
         }
     }
     compileOptions {

+ 8 - 2
app/src/main/AndroidManifest.xml

@@ -18,13 +18,15 @@
     <uses-permission android:name="android.permission.CAMERA" />
 
     <application
+        android:name=".App"
         android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
+        android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
-        android:roundIcon="@mipmap/ic_launcher_round"
+        android:roundIcon="@drawable/ic_launcher"
         android:supportsRtl="true"
         android:theme="@style/Theme.NanoHTTPDemo"
         android:usesCleartextTraffic="true">
+
         <activity android:name=".MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -32,6 +34,10 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity
+            android:name=".ui.EditActivity"
+            android:theme="@style/Theme.NanoHTTPDemo.NoTitleBar" />
+
         <service android:name=".service.LocalService" />
     </application>
 

+ 19 - 0
app/src/main/java/me/yoqi/android/nanohttpdemo/App.java

@@ -0,0 +1,19 @@
+package me.yoqi.android.nanohttpdemo;
+
+import android.app.Application;
+import android.content.Context;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 12/19/2020
+ */
+public class App extends Application {
+
+    public static Context mContext;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mContext = this;
+    }
+}

+ 9 - 9
app/src/main/java/me/yoqi/android/nanohttpdemo/MainActivity.java

@@ -4,15 +4,14 @@ import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
-import android.webkit.WebResourceRequest;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
-import android.webkit.WebViewClient;
 import android.widget.Button;
 
 import androidx.appcompat.app.AppCompatActivity;
 
 import me.yoqi.android.nanohttpdemo.service.LocalService;
+import me.yoqi.android.nanohttpdemo.ui.EditActivity;
 
 public class MainActivity extends AppCompatActivity {
     Button btnStart;
@@ -58,13 +57,14 @@ public class MainActivity extends AppCompatActivity {
                     startHttpd();
                     flag = true;
                     btnStart.setText("已启动");
-                    webView.loadUrl("http://localhost:7600");
-                    webView.setWebViewClient(new WebViewClient() {
-                        @Override
-                        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
-                            return super.shouldOverrideUrlLoading(view, request);
-                        }
-                    });
+//                    webView.loadUrl("http://localhost:7600");
+//                    webView.setWebViewClient(new WebViewClient() {
+//                        @Override
+//                        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
+//                            return super.shouldOverrideUrlLoading(view, request);
+//                        }
+//                    });
+                    startActivity(new Intent(mContext, EditActivity.class));
                 } else {
                     stopHttpd();
                     flag = false;

+ 199 - 10
app/src/main/java/me/yoqi/android/nanohttpdemo/net/LocalHttpService.java

@@ -1,6 +1,20 @@
 package me.yoqi.android.nanohttpdemo.net;
 
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
 import fi.iki.elonen.NanoHTTPD;
+import me.yoqi.android.nanohttpdemo.App;
 
 /**
  * @author liuyuqi.gov@msn.cn
@@ -8,24 +22,199 @@ import fi.iki.elonen.NanoHTTPD;
  */
 public class LocalHttpService extends NanoHTTPD {
 
+    private final File rootDir;
+    static Object waitMonitor = new Object();
+
+    private static final Map<String, String> MIME_TYPES = new HashMap<String, String>() {{
+        put("css", "text/css");
+        put("htm", "text/html");
+        put("html", "text/html");
+        put("xml", "text/xml");
+        put("java", "text/x-java-source, text/java");
+        put("txt", "text/plain");
+        put("asc", "text/plain");
+        put("gif", "image/gif");
+        put("jpg", "image/jpeg");
+        put("jpeg", "image/jpeg");
+        put("png", "image/png");
+        put("mp3", "audio/mpeg");
+        put("m3u", "audio/mpeg-url");
+        put("mp4", "video/mp4");
+        put("ogv", "video/ogg");
+        put("flv", "video/x-flv");
+        put("mov", "video/quicktime");
+        put("swf", "application/x-shockwave-flash");
+        put("js", "application/javascript");
+        put("pdf", "application/pdf");
+        put("doc", "application/msword");
+        put("ogg", "application/x-ogg");
+        put("zip", "application/octet-stream");
+        put("exe", "application/octet-stream");
+        put("class", "application/octet-stream");
+    }};
+
+
     /**
      * 覆写构造方法
      *
-     * @param port
+     * @param port 端口
      */
-    public LocalHttpService(int port) {
+    public LocalHttpService(int port, String host, File wwwroot) {
         super(port);
+        this.rootDir = wwwroot;
+
     }
 
     @Override
     public Response serve(IHTTPSession session) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("<!DOCTYPE html><html><body>");
-        builder.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
-        builder.append("\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n" +
-                "  \t<meta content=\"width=device-width,initial-scale=1.0\" name=\"viewport\">");
-        builder.append("服务已经启动啦,可以正常使用啦!");
-        builder.append("</body></html>\n");
-        return newFixedLengthResponse(builder.toString());
+        return serveFile(session.getUri(), session.getHeaders());
+    }
+
+    File getRootDir() {
+        return rootDir;
+    }
+
+    /**
+     * url 和文件路径映射
+     *
+     * @param uri    url
+     * @param header 请求头
+     * @return
+     */
+    Response serveFile(String uri, Map<String, String> header) {
+        Response res = null;
+        // Remove URL arguments
+        uri = uri.trim().replace(File.separatorChar, '/');
+        if (uri.indexOf('?') >= 0)
+            uri = uri.substring(0, uri.indexOf('?'));
+
+        // 禁止访问非法目录
+        if (uri.startsWith("src/main") || uri.endsWith("src/main") || uri.contains("../"))
+            return newFixedLengthResponse(Response.Status.FORBIDDEN, NanoHTTPD.MIME_PLAINTEXT, "FORBIDDEN: Won't serve ../ for security reasons.");
+
+        if (!uri.endsWith("/")) {
+            uri += "/";
+            res = newFixedLengthResponse(Response.Status.REDIRECT, NanoHTTPD.MIME_HTML, "<html><body>Redirected: <a href=\"" + uri + "\">" + uri + "</a></body></html>");
+            res.addHeader("Location", uri);
+        }
+        if (uri.equals("/")) {
+            try {
+                InputStream inputStream = App.mContext.getAssets().open("index.html");
+                return newFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_HTML, inputStream, 1);
+            } catch (IOException e) {
+                return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, "error: " + e);
+            }
+        }
+
+        try {
+            InputStream inputStream = App.mContext.getAssets().open(uri);
+            if (uri.contains("StopServer")) {
+                stop();
+                return newFixedLengthResponse(Response.Status.NOT_FOUND, NanoHTTPD.MIME_PLAINTEXT, "Error 999, Server stopping.");
+            }
+            String mime = null;
+            int dotIndex = uri.lastIndexOf(".");
+            if (dotIndex >= 0) {
+                mime = MIME_TYPES.get(uri.substring(dotIndex + 1).toLowerCase());
+            } else {
+                mime = NanoHTTPD.MIME_PLAINTEXT;
+            }
+        } catch (IOException e) {
+            return newFixedLengthResponse(Response.Status.NOT_FOUND, NanoHTTPD.MIME_PLAINTEXT, "Error 404, file not found." + e);
+        }
+        return res;
+    }
+
+    /**
+     * 列目录功能
+     */
+    private String listDirectory(String uri, File f) {
+        System.out.println("SWS listDir uri=" + uri + ", f=" + f);
+        String heading = "Directory " + uri;
+        String msg = "<html><head><title>" + heading + "</title><style><!--\n" +
+                "span.dirname { font-weight: bold; }\n" +
+                "span.filesize { font-size: 75%; }\n" +
+                "// -->\n" +
+                "</style>" +
+                "</head><body><h1>" + heading + "</h1>";
+
+        String up = null;
+        if (uri.length() > 1) {
+            String u = uri.substring(0, uri.length() - 1);
+            int slash = u.lastIndexOf('/');
+            if (slash >= 0 && slash < u.length()) {
+                up = uri.substring(0, slash + 1);
+            }
+        }
+
+        List<String> files = Arrays.asList(f.list(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return new File(dir, name).isFile();
+            }
+        }));
+        Collections.sort(files);
+        List<String> directories = Arrays.asList(f.list(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return new File(dir, name).isDirectory();
+            }
+        }));
+        Collections.sort(directories);
+        if (up != null || directories.size() + files.size() > 0) {
+            msg += "<ul>";
+            if (up != null || directories.size() > 0) {
+                msg += "<section class=\"directories\">";
+                if (up != null) {
+                    msg += "<li><a rel=\"directory\" href=\"" + up + "\"><span class=\"dirname\">..</span></a></b></li>";
+                }
+                for (int i = 0; i < directories.size(); i++) {
+                    String dir = directories.get(i) + "/";
+                    msg += "<li><a rel=\"directory\" href=\"" + encodeUri(uri + dir) + "\"><span class=\"dirname\">" + dir + "</span></a></b></li>";
+                }
+                msg += "</section>";
+            }
+            if (files.size() > 0) {
+                msg += "<section class=\"files\">";
+                for (int i = 0; i < files.size(); i++) {
+                    String file = files.get(i);
+
+                    msg += "<li><a href=\"" + encodeUri(uri + file) + "\"><span class=\"filename\">" + file + "</span></a>";
+                    File curFile = new File(f, file);
+                    long len = curFile.length();
+                    msg += "&nbsp;<span class=\"filesize\">(";
+                    if (len < 1024)
+                        msg += len + " bytes";
+                    else if (len < 1024 * 1024)
+                        msg += len / 1024 + "." + (len % 1024 / 10 % 100) + " KB";
+                    else
+                        msg += len / (1024 * 1024) + "." + len % (1024 * 1024) / 10 % 100 + " MB";
+                    msg += ")</span></li>";
+                }
+                msg += "</section>";
+            }
+            msg += "</ul>";
+        }
+        msg += "</body></html>";
+        return msg;
+    }
+
+    private String encodeUri(String uri) {
+        String newUri = "";
+        StringTokenizer st = new StringTokenizer(uri, "/ ", true);
+        while (st.hasMoreTokens()) {
+            String tok = st.nextToken();
+            if (tok.equals("/"))
+                newUri += "/";
+            else if (tok.equals(" "))
+                newUri += "%20";
+            else {
+                try {
+                    newUri += URLEncoder.encode(tok, "UTF-8");
+                } catch (UnsupportedEncodingException ignored) {
+                }
+            }
+        }
+        return newUri;
     }
 }

+ 3 - 2
app/src/main/java/me/yoqi/android/nanohttpdemo/service/LocalService.java

@@ -23,7 +23,8 @@ public class LocalService extends Service {
     }
 
     /**
-     *  启动服务的时候启动 httpd
+     * 启动服务的时候启动 httpd
+     *
      * @param intent
      * @param flags
      * @param startId
@@ -31,7 +32,7 @@ public class LocalService extends Service {
      */
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
-        LocalHttpService localHttpService = new LocalHttpService(7600);
+        LocalHttpService localHttpService = new LocalHttpService(7600, "localhost", null);
         try {
             localHttpService.start();
         } catch (IOException e) {

+ 66 - 0
app/src/main/java/me/yoqi/android/nanohttpdemo/ui/EditActivity.java

@@ -0,0 +1,66 @@
+package me.yoqi.android.nanohttpdemo.ui;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import me.yoqi.android.nanohttpdemo.R;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 12/18/2020
+ */
+public class EditActivity extends AppCompatActivity {
+    WebView webView;
+    Context mContext;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_edit);
+        mContext = this;
+
+        initView();
+    }
+
+    void initView() {
+        webView = findViewById(R.id.wb_edit);
+        WebSettings webSettings = webView.getSettings();
+        webSettings.setJavaScriptEnabled(true);
+
+//设置自适应屏幕,两者合用
+        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
+        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
+
+//缩放操作
+        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
+        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
+        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
+
+//其他细节操作
+        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
+        webSettings.setAllowFileAccess(true); //设置可以访问文件
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
+        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
+        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
+
+        webView.loadUrl("http://localhost:7600");
+        webView.setWebViewClient(new WebViewClient() {
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
+                return super.shouldOverrideUrlLoading(view, request);
+            }
+        });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+}

BIN
app/src/main/res/drawable-hdpi/ic_launcher.png


BIN
app/src/main/res/drawable-mdpi/ic_launcher.png


+ 0 - 30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml

@@ -1,30 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
-        <aapt:attr name="android:fillColor">
-            <gradient
-                android:endX="85.84757"
-                android:endY="92.4963"
-                android:startX="42.9492"
-                android:startY="49.59793"
-                android:type="linear">
-                <item
-                    android:color="#44000000"
-                    android:offset="0.0" />
-                <item
-                    android:color="#00000000"
-                    android:offset="1.0" />
-            </gradient>
-        </aapt:attr>
-    </path>
-    <path
-        android:fillColor="#FFFFFF"
-        android:fillType="nonZero"
-        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
-        android:strokeWidth="1"
-        android:strokeColor="#00000000" />
-</vector>

BIN
app/src/main/res/drawable-xhdpi/ic_launcher.png


BIN
app/src/main/res/drawable-xxhdpi/ic_launcher.png


+ 0 - 170
app/src/main/res/drawable/ic_launcher_background.xml

@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path
-        android:fillColor="#3DDC84"
-        android:pathData="M0,0h108v108h-108z" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M9,0L9,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,0L19,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,0L29,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,0L39,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,0L49,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,0L59,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,0L69,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,0L79,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M89,0L89,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M99,0L99,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,9L108,9"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,19L108,19"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,29L108,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,39L108,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,49L108,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,59L108,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,69L108,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,79L108,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,89L108,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,99L108,99"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,29L89,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,39L89,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,49L89,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,59L89,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,69L89,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,79L89,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,19L29,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,19L39,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,19L49,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,19L59,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,19L69,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,19L79,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-</vector>

+ 16 - 0
app/src/main/res/layout/activity_edit.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <WebView
+        android:id="@+id/wb_edit"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:layout_editor_absoluteY="0dp" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
app/src/main/res/layout/activity_main.xml

@@ -23,7 +23,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="128dp"
-        android:text="启动"
+        android:text="@string/btn_start"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
@@ -35,6 +35,6 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0.0"
-        app:layout_constraintStart_toStartOf="parent"></WebView>
+        app:layout_constraintStart_toStartOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 5
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>

+ 0 - 5
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
-</adaptive-icon>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 5 - 0
app/src/main/res/values-zh/strings.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">NanoHTTPDemo</string>
+    <string name="btn_start">启动</string>
+</resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1,3 +1,4 @@
 <resources>
     <string name="app_name">NanoHTTPDemo</string>
+    <string name="btn_start">Start</string>
 </resources>

+ 6 - 0
app/src/main/res/values/themes.xml

@@ -13,4 +13,10 @@
         <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
         <!-- Customize your theme here. -->
     </style>
+
+    <style name="Theme.NanoHTTPDemo.NoTitleBar" parent="Theme.NanoHTTPDemo">
+        <!--无标题栏-->
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+    </style>
 </resources>

+ 2 - 0
build.gradle

@@ -1,4 +1,6 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply from: "config.gradle"
+
 buildscript {
     repositories {
         google()

+ 16 - 0
config.bak.gradle

@@ -0,0 +1,16 @@
+ext {
+    build = [
+            minSdkVersion    : 16,
+            targetSdkVersion : 29,
+            compileSdkVersion: 29,
+            versionCode      : 51,
+            versionName      : "1.0.1",
+            dbVersion        : 2
+    ]
+    sign = [
+            keyAlias     : "签名别名",
+            keyPassword  : "签名密码",
+            storeFile    : "签名文件路径",
+            storePassword: "签名文件密码",
+    ]
+}