Browse Source

Merge branch 'release/v1.0.1'

lqg 1 month ago
parent
commit
d09cafa77c
36 changed files with 605 additions and 262 deletions
  1. 27 16
      .github/workflows/android.yml
  2. 1 0
      .gitignore
  3. 5 2
      app/src/main/AndroidManifest.xml
  4. 21 0
      app/src/main/java/me/yoqi/android/safekeyboard/App.java
  5. 0 23
      app/src/main/java/me/yoqi/android/safekeyboard/MainActivity.java
  6. 43 0
      app/src/main/java/me/yoqi/android/safekeyboard/base/BaseActivity.java
  7. 20 0
      app/src/main/java/me/yoqi/android/safekeyboard/base/BaseFragment.java
  8. 9 0
      app/src/main/java/me/yoqi/android/safekeyboard/model/Config.java
  9. 137 0
      app/src/main/java/me/yoqi/android/safekeyboard/utils/AppManager.java
  10. 80 0
      app/src/main/java/me/yoqi/android/safekeyboard/utils/IMEUtils.java
  11. 77 0
      app/src/main/java/me/yoqi/android/safekeyboard/view/Guide1Activity.java
  12. 41 0
      app/src/main/java/me/yoqi/android/safekeyboard/view/SplashActivity.java
  13. BIN
      app/src/main/res/drawable-hdpi/ic_launcher.png
  14. BIN
      app/src/main/res/drawable-mdpi/ic_launcher.png
  15. 0 30
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  16. BIN
      app/src/main/res/drawable-xhdpi/ic_launcher.png
  17. BIN
      app/src/main/res/drawable-xxhdpi/ic_launcher.png
  18. 0 170
      app/src/main/res/drawable/ic_launcher_background.xml
  19. 92 0
      app/src/main/res/layout/activity_guide1.xml
  20. 0 11
      app/src/main/res/layout/activity_main.xml
  21. 30 0
      app/src/main/res/layout/activity_splash.xml
  22. 0 5
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  23. 0 5
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  24. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  25. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  26. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  27. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  28. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  29. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  30. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  31. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  32. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  33. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  34. 2 0
      build.gradle
  35. 18 0
      config.bak.gradle
  36. 2 0
      docs/index.md

+ 27 - 16
.github/workflows/android.yml

@@ -12,19 +12,30 @@ jobs:
     runs-on: ubuntu-latest
 
     steps:
-    - uses: actions/checkout@v2
-
-    - name: set up JDK 11
-      uses: actions/setup-java@v1
-      with:
-        java-version: 11
-        
-    - name: Build Debug APK
-      run: ./gradlew assembleDebug
-
-    # - name: Releasing using Hub
-    #   uses: ShaunLWM/action-release-debugapk@master
-    #   env:
-    #     GITHUB_TOKEN: ${{secrets.TOKEN}}
-    #     APP_FOLDER: app
-    #     RELEASE_TITLE: Album
+      - uses: actions/checkout@v2
+
+      - name: set up JDK 17
+        uses: actions/setup-java@v1
+        with:
+          java-version: 17
+
+      - name: Gradle cache
+        id: cache
+        uses: actions/cache@v4
+        with:
+          path: |
+            ~/.gradle/
+            ~/.gradle/wrapper
+          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
+          restore-keys: |
+            ${{ runner.os }}-gradle-
+
+      - name: Build Debug APK
+        run: ./gradlew assembleDebug
+
+      # - name: Releasing using Hub
+      #   uses: ShaunLWM/action-release-debugapk@master
+      #   env:
+      #     GITHUB_TOKEN: ${{secrets.TOKEN}}
+      #     APP_FOLDER: app
+      #     RELEASE_TITLE: Album

+ 1 - 0
.gitignore

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

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

@@ -8,10 +8,10 @@
     <uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
 
     <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:supportsRtl="true"
         android:theme="@style/Theme.SafeKeyboard">
         <activity android:name=".MainActivity"
@@ -22,6 +22,9 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity android:name=".MainActivity" />
+        <activity android:name=".view.Guide1Activity" />
+
         <service
             android:exported="true"
             android:name=".service.KeyboardIME"

+ 21 - 0
app/src/main/java/me/yoqi/android/safekeyboard/App.java

@@ -0,0 +1,21 @@
+package me.yoqi.android.safekeyboard;
+
+import android.app.Application;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class App extends Application {
+    private static App instance;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        instance = this;
+    }
+
+    public static App getInstance() {
+        return instance;
+    }
+}

+ 0 - 23
app/src/main/java/me/yoqi/android/safekeyboard/MainActivity.java

@@ -16,7 +16,6 @@ import me.yoqi.android.safekeyboard.keyboard.KeyBoardDialogUtils;
 public class MainActivity extends AppCompatActivity {
     private KeyBoardDialogUtils keyBoardDialogUtils;
     private EditText et;
-    private Button btnChangeIME;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -26,14 +25,6 @@ public class MainActivity extends AppCompatActivity {
     }
 
     public void initView() {
-        btnChangeIME = findViewById(R.id.btnChangeIME);
-        btnChangeIME.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-               changeIME();
-            }
-        });
-
         et = (EditText) findViewById(R.id.et);
         keyBoardDialogUtils = new KeyBoardDialogUtils(this);
         et.setOnClickListener(new View.OnClickListener() {
@@ -43,18 +34,4 @@ public class MainActivity extends AppCompatActivity {
             }
         });
     }
-
-    public void changeIME() {
-        //1、判断是否系统启用了安全输入法没有启动者跳到设置界面
-        if (true) {
-            Intent enableIntent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS);
-            enableIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            startActivity(enableIntent);
-        } else if (false) {
-            // 2、如果设置了安全输入法,但是没有启动,则跳转到切换输入法界面:
-            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-            imm.showInputMethodPicker();
-        }
-    }
-
 }

+ 43 - 0
app/src/main/java/me/yoqi/android/safekeyboard/base/BaseActivity.java

@@ -0,0 +1,43 @@
+package me.yoqi.android.safekeyboard.base;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.PermissionChecker;
+
+import me.yoqi.android.safekeyboard.utils.AppManager;
+
+/**
+ * 基类
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public abstract class BaseActivity extends AppCompatActivity {
+    protected Context mContext;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(getLayoutResID());
+
+        mContext = this;
+        AppManager.getInstance().addActivity(this);
+        init();
+    }
+
+    public boolean hasPermission(String permission) {
+        boolean has = true;
+        try {
+            has = PermissionChecker.checkSelfPermission(this, permission) == PermissionChecker.PERMISSION_GRANTED;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return has;
+    }
+    protected abstract int getLayoutResID();
+    protected abstract void init();
+
+}

+ 20 - 0
app/src/main/java/me/yoqi/android/safekeyboard/base/BaseFragment.java

@@ -0,0 +1,20 @@
+package me.yoqi.android.safekeyboard.base;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+/**
+ * 基类
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class BaseFragment extends Fragment {
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+}

+ 9 - 0
app/src/main/java/me/yoqi/android/safekeyboard/model/Config.java

@@ -0,0 +1,9 @@
+package me.yoqi.android.safekeyboard.model;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class Config {
+    public static String packageName="me.yoqi.android.safekeyboard";
+}

+ 137 - 0
app/src/main/java/me/yoqi/android/safekeyboard/utils/AppManager.java

@@ -0,0 +1,137 @@
+package me.yoqi.android.safekeyboard.utils;
+
+import android.app.Activity;
+
+import java.util.Stack;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class AppManager {
+    private static Stack<Activity> activityStack;
+
+    private static class SingleHolder {
+        private static AppManager instance = new AppManager();
+    }
+
+    public static AppManager getInstance() {
+        return SingleHolder.instance;
+    }
+
+    /**
+     * 添加Activity到堆栈
+     */
+    public void addActivity(Activity activity) {
+        if (activityStack == null) {
+            activityStack = new Stack<Activity>();
+        }
+        activityStack.add(activity);
+    }
+
+    /**
+     * 是否有activity
+     */
+    public boolean isActivity() {
+        if (activityStack != null) {
+            return !activityStack.isEmpty();
+        }
+        return false;
+    }
+
+    /**
+     * 获取当前Activity(堆栈中最后一个压入的)
+     */
+    public Activity currentActivity() {
+        Activity activity = activityStack.lastElement();
+        return activity;
+    }
+
+    /**
+     * 结束当前Activity(堆栈中最后一个压入的)
+     */
+    public void finishActivity() {
+        Activity activity = activityStack.lastElement();
+        if (!activity.isFinishing()) {
+            activity.finish();
+        }
+    }
+
+    public void finishActivity(Activity activity) {
+        activityStack.remove(activity);
+    }
+
+
+    /**
+     * 结束指定类名的Activity
+     */
+    public void finishActivity(Class<?> cls) {
+        for (Activity activity : activityStack) {
+            if (activity.getClass().equals(cls)) {
+                if (!activity.isFinishing()) {
+                    activity.finish();
+                }
+                break;
+            }
+        }
+    }
+
+    /**
+     * 返回指定 Activity,当然这个Activity需要存在
+     *
+     * @param cls
+     */
+    public void backActivity(Class<?> cls) {
+        while (!activityStack.empty()) {
+            Activity activity = activityStack.pop(); // 指定activity置顶
+            if (activity.getClass().equals(cls)) {
+                activityStack.push(activity);
+                break;
+            } else {
+                activity.finish();
+            }
+        }
+    }
+
+    /**
+     * 结束所有Activity
+     */
+    public void finishAllActivity() {
+        if (activityStack != null && activityStack.size() > 0) {
+            for (int i = 0, size = activityStack.size(); i < size; i++) {
+                Activity activity = activityStack.get(i);
+                if (null != activityStack.get(i)) {
+                    if (!activity.isFinishing()) {
+                        activity.finish();
+                    }
+                }
+            }
+            activityStack.clear();
+        }
+    }
+
+    /**
+     * 获取指定的Activity
+     */
+    public Activity getActivity(Class<?> cls) {
+        if (activityStack != null) {
+            for (Activity activity : activityStack) {
+                if (activity.getClass().equals(cls)) {
+                    return activity;
+                }
+            }
+        }
+        return null;
+    }
+
+    public void appExit(int code) {
+        try {
+            finishAllActivity();
+            android.os.Process.killProcess(android.os.Process.myPid());
+            System.exit(code);
+        } catch (Exception e) {
+            activityStack.clear();
+            e.printStackTrace();
+        }
+    }
+}

+ 80 - 0
app/src/main/java/me/yoqi/android/safekeyboard/utils/IMEUtils.java

@@ -0,0 +1,80 @@
+package me.yoqi.android.safekeyboard.utils;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class IMEUtils {
+    public String getIME(Context context) {
+        String mDefaultInputMethodPkg = null;
+        String mDefaultInputMethodCls = Settings.Secure.getString(
+                context.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD);
+        //输入法类名信息
+        if (!TextUtils.isEmpty(mDefaultInputMethodCls)) {
+            //输入法包名
+            mDefaultInputMethodPkg = mDefaultInputMethodCls.split("/")[0];
+        }
+        return mDefaultInputMethodCls;
+    }
+
+    public ArrayList<String> getIMEList(Context context) {
+        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+        List<InputMethodInfo> methodList = imm.getInputMethodList();
+        ArrayList<String> res = new ArrayList<String>();
+        for (InputMethodInfo mi : methodList) {
+            res.add(mi.getPackageName());
+        }
+        return res;
+    }
+
+
+    /**
+     * 判断输入法是否设置,有问题
+     *
+     * @param imePkg 输入法包名
+     * @return 输入法是否设置
+     */
+    public boolean isConfigIME(Context context, String imePkg) {
+        return getIMEList(context).contains(imePkg);
+    }
+
+    /**
+     * 判断输入法是否启用
+     *
+     * @param context
+     * @param imePkg
+     * @return
+     */
+    public boolean isEnableIME(Context context, String imePkg) {
+        return getDefaultInputMethodPkgName(context).equals(imePkg);
+    }
+
+    /**
+     * 获取默认输入法
+     *
+     * @param context 上下文对象
+     * @return 输入法字符串
+     */
+    public String getDefaultInputMethodPkgName(Context context) {
+        String mDefaultInputMethodPkg = null;
+        String mDefaultInputMethodCls = Settings.Secure.getString(
+                context.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD);
+        //输入法类名信息
+        if (!TextUtils.isEmpty(mDefaultInputMethodCls)) {
+            //输入法包名
+            mDefaultInputMethodPkg = mDefaultInputMethodCls.split("/")[0];
+        }
+        return mDefaultInputMethodPkg;
+    }
+}

+ 77 - 0
app/src/main/java/me/yoqi/android/safekeyboard/view/Guide1Activity.java

@@ -0,0 +1,77 @@
+package me.yoqi.android.safekeyboard.view;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+
+import androidx.appcompat.app.AlertDialog;
+
+import me.yoqi.android.safekeyboard.MainActivity;
+import me.yoqi.android.safekeyboard.R;
+import me.yoqi.android.safekeyboard.base.BaseActivity;
+import me.yoqi.android.safekeyboard.model.Config;
+import me.yoqi.android.safekeyboard.utils.IMEUtils;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class Guide1Activity extends BaseActivity {
+    Button btnFinish, btnStep1Enable, btnStep2Enable;
+    boolean isConfigIME, isEnableIME; // 当前输入法是否启用
+
+    @Override
+    protected int getLayoutResID() {
+        return R.layout.activity_guide1;
+    }
+
+    @Override
+    protected void init() {
+        btnFinish = findViewById(R.id.btnFinish);
+        btnStep1Enable = findViewById(R.id.btnStep1Enable);
+        btnStep2Enable = findViewById(R.id.btnStep2Enable);
+
+        btnFinish.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (isConfigIME && isEnableIME) {
+                    startActivity(new Intent(Guide1Activity.this, MainActivity.class));
+                } else {
+                    new AlertDialog.Builder(mContext)
+                            .setMessage("请勾选安全输入法!")
+                            .setCancelable(false)
+                            .setPositiveButton("确定", null)
+                            .show();
+                }
+            }
+        });
+        btnStep1Enable.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent enableIntent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS);
+                enableIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                startActivity(enableIntent);
+            }
+        });
+        btnStep2Enable.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+                imm.showInputMethodPicker();
+            }
+        });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        IMEUtils imeUtils = new IMEUtils();
+        isConfigIME = imeUtils.isConfigIME(mContext, Config.packageName);
+        isEnableIME = imeUtils.isEnableIME(mContext, Config.packageName);
+        btnStep1Enable.setEnabled(isConfigIME);
+        btnStep2Enable.setEnabled(isEnableIME);
+    }
+}

+ 41 - 0
app/src/main/java/me/yoqi/android/safekeyboard/view/SplashActivity.java

@@ -0,0 +1,41 @@
+package me.yoqi.android.safekeyboard.view;
+
+import android.content.Intent;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import me.yoqi.android.safekeyboard.MainActivity;
+import me.yoqi.android.safekeyboard.R;
+import me.yoqi.android.safekeyboard.base.BaseActivity;
+import me.yoqi.android.safekeyboard.model.Config;
+import me.yoqi.android.safekeyboard.utils.IMEUtils;
+
+/**
+ * @author liuyuqi.gov@msn.cn
+ * @date 3/17/2021
+ */
+public class SplashActivity extends BaseActivity {
+    TextView tvInfo;
+
+    @Override
+    protected int getLayoutResID() {
+        return R.layout.activity_splash;
+    }
+
+    @Override
+    protected void init() {
+        tvInfo = findViewById(R.id.tvInfo);
+        ArrayList<String> res = new IMEUtils().getIMEList(mContext);
+        IMEUtils imeUtils = new IMEUtils();
+        boolean isconfigIME = imeUtils.isConfigIME(mContext, Config.packageName);
+        String defaultInputMethodPkgName = imeUtils.getIME(mContext);
+
+        if (isconfigIME && defaultInputMethodPkgName.equals(Config.packageName)) {
+            //已经设置了输入法
+            startActivity(new Intent(SplashActivity.this, MainActivity.class));
+        } else {
+            startActivity(new Intent(SplashActivity.this, Guide1Activity.class));
+        }
+    }
+}

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>

+ 92 - 0
app/src/main/res/layout/activity_guide1.xml

@@ -0,0 +1,92 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#EBEDEC">
+
+    <LinearLayout
+        android:id="@+id/linearLayout"
+        android:layout_width="match_parent"
+        android:layout_height="120dp"
+        android:layout_marginLeft="30dp"
+        android:layout_marginTop="60dp"
+        android:layout_marginRight="30dp"
+        android:background="#F8F8F8"
+        android:orientation="vertical"
+        android:padding="10dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Step 1:"
+            android:textSize="20dp" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:text="Select SafeKeyboard IME" />
+
+        <Button
+            android:id="@+id/btnStep1Enable"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="right"
+            android:background="#D6D2D2"
+            android:text="未勾选" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/linearLayout3"
+        android:layout_width="match_parent"
+        android:layout_height="120dp"
+        android:layout_marginLeft="30dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginRight="30dp"
+        android:background="#F8F8F8"
+        android:orientation="vertical"
+        android:padding="10dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.733"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/linearLayout">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Step 2:"
+            android:textSize="20dp" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:text="Active SafeKeyboard IME" />
+
+        <Button
+            android:id="@+id/btnStep2Enable"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="right"
+            android:background="#D6D2D2"
+            android:text="未勾选" />
+    </LinearLayout>
+
+    <Button
+        android:id="@+id/btnFinish"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:width="120dp"
+        android:text="@string/finish"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/linearLayout3" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 11
app/src/main/res/layout/activity_main.xml

@@ -6,17 +6,6 @@
     android:layout_height="match_parent"
     tools:context=".MainActivity">
 
-    <Button
-        android:id="@+id/btnChangeIME"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="51dp"
-        android:layout_marginLeft="51dp"
-        android:layout_marginTop="134dp"
-        android:text="切换输入法"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"></Button>
-
     <EditText
         android:id="@+id/et"
         android:layout_width="200dp"

+ 30 - 0
app/src/main/res/layout/activity_splash.xml

@@ -0,0 +1,30 @@
+<?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">
+
+    <TextView
+        android:id="@+id/textView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="196dp"
+        android:text="SefeKeyboard"
+        android:textSize="50dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tvInfo"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:text="keep your input safe."
+        android:textSize="20dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/textView" />
+</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


+ 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()

+ 18 - 0
config.bak.gradle

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

+ 2 - 0
docs/index.md

@@ -0,0 +1,2 @@
+# index
+