Commit 74e2efc4 by Baoxy

Merge remote-tracking branch 'remotes/origin/education_space' into education_space_26

# Conflicts: # Launcher3/AndroidManifest.xml # Launcher3/res/values/strings.xml # Launcher3/src/com/android/launcher3/Launcher.java # Launcher3/src/com/android/launcher3/function/pwd/PwdPinSetPwdActivity.java # Launcher3/src/com/android/launcher3/function/setting/SettingAdminActivity.kt # Launcher3/src/com/android/launcher3/settings/BlankActivity.java # lib_common/src/main/java/com/secspace/lib/common/function/SwitchOutMdm.kt
parents ebe8cd6c c62c41ac
......@@ -69,7 +69,7 @@
android:exported="true" />
<activity
android:name=".function.setting.ChangePwdActivity"
android:name=".function.pwd.ChangePwdActivity"
android:excludeFromRecents="true"
android:theme="@style/SettingTheme" />
......@@ -98,7 +98,7 @@
android:excludeFromRecents="true"
android:theme="@style/SettingTheme" />
<activity
android:name=".function.setting.SettingPwdActivity"
android:name=".function.pwd.SettingPwdActivity"
android:excludeFromRecents="true"
android:theme="@style/SettingTheme" />
<activity
......@@ -106,10 +106,20 @@
android:excludeFromRecents="true"
android:theme="@style/SettingTheme"></activity>
<activity
android:name=".function.setting.AppUseActivity"
android:excludeFromRecents="true"
android:theme="@style/SettingTheme"></activity>
<activity
android:name=".ManagerAuthActivity"
android:excludeFromRecents="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity
android:name=".function.pwd.EncryptedActivity"
android:excludeFromRecents="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity
android:name=".function.setting.AppChooseActivity"
android:excludeFromRecents="true"
android:resizeableActivity="false"
......
......@@ -147,6 +147,7 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.qmuiteam:qmui:1.3.0"
implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.61"
// implementation 'com.dou361.dialogui:jjdxm-dialogui:1.0.2'
}
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--按下点击-->
<item android:state_enabled="true" android:state_pressed="true">
<shape>
<stroke
android:width="1px"
android:color="#B22d80df" />
<solid android:color="#B22d80df" />
</shape>
</item>
<!--正常状态-->
<item android:state_enabled="false" android:state_pressed="false">
<shape>
<stroke
android:width="1px"
android:color="#B22d80df" />
<solid android:color="#662d80df" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true"
android:drawable="@drawable/small_eyes" /><!--选中时效果-->
android:drawable="@drawable/ic_visibility_off_gray_24dp" /><!--选中时效果-->
<item android:state_checked="false"
android:drawable="@drawable/show_pwd" /><!--未选中时效果-->
android:drawable="@drawable/ic_visibility_gray_24dp" /><!--未选中时效果-->
</selector>
\ No newline at end of file
<vector android:height="24dp" android:tint="#ABABAB"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
</vector>
<vector android:height="24dp" android:tint="#ABABAB"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z"/>
</vector>
<vector android:height="24dp" android:tint="#ABABAB"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,7c2.76,0 5,2.24 5,5 0,0.65 -0.13,1.26 -0.36,1.83l2.92,2.92c1.51,-1.26 2.7,-2.89 3.43,-4.75 -1.73,-4.39 -6,-7.5 -11,-7.5 -1.4,0 -2.74,0.25 -3.98,0.7l2.16,2.16C10.74,7.13 11.35,7 12,7zM2,4.27l2.28,2.28 0.46,0.46C3.08,8.3 1.78,10.02 1,12c1.73,4.39 6,7.5 11,7.5 1.55,0 3.03,-0.3 4.38,-0.84l0.42,0.42L19.73,22 21,20.73 3.27,3 2,4.27zM7.53,9.8l1.55,1.55c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.66 1.34,3 3,3 0.22,0 0.44,-0.03 0.65,-0.08l1.55,1.55c-0.67,0.33 -1.41,0.53 -2.2,0.53 -2.76,0 -5,-2.24 -5,-5 0,-0.79 0.2,-1.53 0.53,-2.2zM11.84,9.02l3.15,3.15 0.02,-0.16c0,-1.66 -1.34,-3 -3,-3l-0.17,0.01z"/>
</vector>
......@@ -92,6 +92,7 @@
android:layout_margin="10dp"
android:elevation="3dp"
android:layout_weight="1"
android:enabled="false"
android:background="#fafafa"
android:onClick="btnClick"
android:text="确定" />
......@@ -101,6 +102,7 @@
android:layout_width="match_parent"
android:layout_height="48dp"
style="@style/Widget.AppCompat.Button.Borderless"
android:enabled="false"
android:layout_weight="1"
android:background="#fafafa"
android:layout_margin="10dp"
......
......@@ -5,7 +5,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="com.android.launcher3.function.setting.ChangePwdActivity">
tools:context="com.android.launcher3.function.pwd.ChangePwdActivity">
<TextView
android:id="@+id/tv_setting_title"
......@@ -28,6 +28,8 @@
android:background="#FFFFFF"
android:hint="@string/edu_item_input_oldpwd"
android:paddingLeft="16dp"
android:maxLines="1"
android:maxLength="20"
android:paddingRight="16dp"
android:textColor="#363636"
android:inputType="textPassword"
......@@ -45,6 +47,8 @@
android:layout_height="48dp"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_newpwd"
android:maxLines="1"
android:maxLength="20"
android:paddingLeft="16dp"
android:inputType="textPassword"
android:paddingRight="16dp"
......@@ -64,6 +68,8 @@
android:background="#FFFFFF"
android:inputType="textPassword"
android:hint="@string/edu_item_input_newpwd_again"
android:maxLines="1"
android:maxLength="20"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#363636"
......@@ -93,7 +99,7 @@
android:layout_height="48dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/btn_select"
android:background="@drawable/btn_ripple_bg"
android:elevation="3dp"
android:onClick="btnClick"
android:gravity="center"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="com.android.launcher3.function.pwd.ChangePwdActivity">
<FrameLayout
android:id="@+id/ll_encrypted_parent"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
......@@ -41,24 +41,60 @@
<EditText
android:id="@+id/edit_pwd"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:hint="请输入密码"
android:inputType="textPassword"
android:maxLength="16"
android:maxLines="1"
android:padding="12dp"
android:textColorHint="#c2c2c2"
android:textColor="#c2c2c2"
android:textColorHint="#c2c2c2"
android:textSize="16dp" />
<CheckBox
android:id="@+id/cb_show_pwd"
android:layout_width="40dp"
android:layout_height="25dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:button="@drawable/cb_selector"
android:checked="true" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#c2c2c2"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="horizontal">
<EditText
android:id="@+id/edit_pwd_again"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@null"
android:hint="请再次输入密码"
android:inputType="textPassword"
android:maxLength="16"
android:maxLines="1"
android:padding="12dp"
android:textColor="#c2c2c2"
android:textColorHint="#c2c2c2"
android:textSize="16dp" />
<CheckBox
android:id="@+id/cb_show_pwd_again"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="20dp"
android:layout_marginRight="10dp"
android:button="@drawable/cb_selector"
android:checked="true" />
</LinearLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="com.android.launcher3.function.setting.AppUseActivity">
<TextView
android:id="@+id/tv_setting_title"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawableStart="@mipmap/ic_back"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:onClick="close"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/edu_item_about"
android:textColor="#363636"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@color/bg_white"
android:gravity="center_vertical"
android:onClick="more"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_app_use_time"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:gravity="center_vertical"
android:onClick="close"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/edu_item_app_use_last_day"
android:textColor="#363636"
android:textSize="16sp" />
<com.qmuiteam.qmui.widget.QMUIEmptyView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="48dp"
android:drawableEnd="@drawable/ic_chevron_right_gray_24dp"
android:gravity="center_vertical"
android:text="@string/edu_item_app_use_more"
android:textColor="#ABABAB"
android:textSize="15sp" />
</LinearLayout>
<com.secspace.lib.common.function.view.TimeProgress
android:id="@+id/time_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/bg_white"
android:padding="10dp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<TextView
android:id="@+id/tv_setting_title"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawableStart="@mipmap/ic_back"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:onClick="close"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/edu_item_about"
android:textColor="#363636"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="问题一:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/et_question1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_encryted_question1"
android:maxLength="50"
android:maxLines="1"
android:inputType="text"
android:paddingRight="16dp"
android:textColor="#363636"
android:textColorHint="#8D8D8D"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="答案一:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/et_answer1"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_encryted_answer1"
android:maxLength="50"
android:maxLines="1"
android:inputType="text"
android:paddingRight="16dp"
android:textColor="#363636"
android:textColorHint="#8D8D8D"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="5dp"
android:background="#DDDFE1" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="问题二:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/et_question2"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_encryted_question2"
android:maxLength="50"
android:maxLines="1"
android:inputType="text"
android:paddingRight="16dp"
android:textColor="#363636"
android:textColorHint="#8D8D8D"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="答案二:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/et_answer2"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_encryted_answer2"
android:maxLength="50"
android:maxLines="1"
android:inputType="text"
android:paddingRight="16dp"
android:textColor="#363636"
android:textColorHint="#8D8D8D"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<Button
android:id="@+id/btn_encrypted_set"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/btn_ripple_bg"
android:elevation="3dp"
android:gravity="center"
android:text="@string/common_sure"
android:textColor="#fafafa"
android:textSize="16sp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<TextView
android:id="@+id/tv_setting_title"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawableStart="@mipmap/ic_back"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:onClick="close"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/edu_item_about"
android:textColor="#363636"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="问题一:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_question1"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:paddingRight="16dp"
android:text="@string/edu_item_input_encryted_question1"
android:textColor="#363636"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="答案一:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/et_answer1"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_encryted_answer1"
android:maxLines="1"
android:maxLength="50"
android:inputType="text"
android:paddingRight="16dp"
android:textColor="#363636"
android:textColorHint="#8D8D8D"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="5dp"
android:background="#DDDFE1" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="问题二:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_question2"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:paddingRight="16dp"
android:text="@string/edu_item_input_encryted_question1"
android:textColor="#363636"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:text="答案二:"
android:textColor="#363636"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/et_answer2"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFFFF"
android:hint="@string/edu_item_input_encryted_answer2"
android:maxLines="1"
android:inputType="text"
android:maxLength="50"
android:paddingRight="16dp"
android:textColor="#363636"
android:textColorHint="#8D8D8D"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DDDFE1" />
<Button
android:id="@+id/btn_encrypted_set"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/btn_ripple_bg"
android:elevation="3dp"
android:gravity="center"
android:text="@string/common_sure"
android:textColor="#fafafa"
android:textSize="16sp" />
</LinearLayout>
......@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="649227358658669779">"学习"</string>
<string name="app_name" msgid="649227358658669779">"学习空间"</string>
<string name="folder_name" msgid="7371454440695724752"></string>
<string name="work_folder_name" msgid="3753320833950115786">"Work"</string>
<string name="activity_not_found" msgid="8071924732094499514">"未安装该应用。"</string>
......
......@@ -305,25 +305,22 @@
<string name="work_open">open</string>
<string name="work_back">back</string>
<string name="open_start_tip">开启后[学习帮]固定在前台不可退出,关闭可长按home退出到普通桌面,配置完成后请退出返回到移动终端管控软件主页</string>
<string name="open_new_app_tip">打开开关后,新安装的应用将自动添加到学习帮桌面</string>
<string name="open_new_app_tip">打开开关后,新安装的应用将自动添加到学习空间桌面</string>
<string name="open">打开</string>
<string name="close">关闭</string>
<string name="developing">开发中</string>
<string name="tip">提示</string>
<string name="launcher_setting_tip">安装完成,可长按桌面进行桌面配置</string>
<string name="ok">好的</string>
<string name="delete_account_tip">请先去“设置--账户” 中的所有账户和华为账户先删除,在启动学习帮</string>
<string name="go_delete">去删除</string>
<string name="set_auto_start_tip">是否将学习帮设为自启状态</string>
<string name="not_user_prmission">当前设备无权限使用,请联系管理员</string>
<string name="work_sure">sure</string>
<string name="edu_version">%1$s</string>
<string name="edu_check_update">正在检测更新,请稍后</string>
<string name="edu_uninstall">卸载中,请稍后</string>
<string name="edu_reinforce">因部分系统版本自身原因,从学习内设置回到空间主页时,可能会出现提示设置默认桌面的问题,可在此处确认进行加固处理</string>
<string name="edu_uninstall_tip">继续操作将卸载学习,请确认是否继续</string>
<string name="edu_reinforce">因部分系统版本自身原因,从学习空间内设置回到空间主页时,可能会出现提示设置默认桌面的问题,可在此处确认进行加固处理</string>
<string name="edu_uninstall_tip">继续操作将卸载学习空间,请确认是否继续</string>
<string name="edu_title_setting">设置</string>
<string name="edu_item_version">版本号</string>
......@@ -364,5 +361,26 @@
<string name="edu_item_input_pwd_different">两次输入密码不一致,请重新输入</string>
<string name="edu_item_input_pwd_change_success">密码修改成功</string>
<string name="edu_item_input_encryted_set">设置密保</string>
<string name="edu_item_input_encryted_verfiy">验证密保</string>
<string name="edu_item_input_encryted_question1">请输入第一个问题</string>
<string name="edu_item_input_encryted_question2">请输入第二个问题</string>
<string name="edu_item_input_encryted_answer1">请输入第一个答案</string>
<string name="edu_item_input_encryted_answer2">请输入第二个答案</string>
<string name="edu_item_input_question_null">问题为空</string>
<string name="edu_item_input_answer_null">答案为空</string>
<string name="edu_item_input_encryted_set_success">密保设置成功</string>
<string name="edu_item_input_encryted_ver_success">密保验证成功</string>
<string name="edu_item_input_encryted_error">未获取到密保答案</string>
<string name="edu_item_input_answer1_error">问题一答案错误</string>
<string name="edu_item_input_answer2_error">问题二答案错误</string>
<string name="edu_item_input_encryted_title">请输入密保答案用于修改密码</string>
<string name="edu_item_app_use_title">应用使用情况</string>
<string name="edu_item_app_use_last_day">最近一天使用时长: %1$s分钟</string>
<string name="edu_item_app_use_more">更多</string>
</resources>
......@@ -5,6 +5,7 @@ import android.content.Context;
import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.lib.common.function.ActivationHelper;
import com.secspace.lib.common.function.database.DatabaseManager;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.utils.DpmHelper;
......@@ -20,5 +21,6 @@ public class App extends Application {
dpmHelper.initMiddleWare();
}
DialogUIUtils.init(mApp);
DatabaseManager.Companion.getInstance(mApp).init();
}
}
......@@ -61,7 +61,7 @@ import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.support.annotation.Nullable;
import android.text.InputType;
import android.text.Editable;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
......@@ -160,6 +160,8 @@ import com.secspace.lib.common.event.RefreshWorkSpaceEvent;
import com.secspace.lib.common.function.ActivationHelper;
import com.secspace.lib.common.function.DialogManager;
import com.secspace.lib.common.function.WorkManager;
import com.secspace.lib.common.function.model.Encrypted;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.utils.ActivityHelper;
import com.secspace.lib.common.utils.DeviceUtil;
......@@ -168,8 +170,10 @@ import com.secspace.lib.common.utils.FileUtil;
import com.secspace.lib.common.utils.ImeiCheckUtils;
import com.secspace.lib.common.utils.InputUtil;
import com.secspace.lib.common.utils.IntentUtil;
import com.secspace.lib.common.utils.JsonUtil;
import com.secspace.lib.common.utils.Prefs;
import com.secspace.lib.common.utils.ToastUtil;
import com.secspace.lib.common.utils.UtilsKt;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import org.greenrobot.eventbus.EventBus;
......@@ -406,6 +410,8 @@ public class Launcher extends BaseActivity
private RotationPrefChangeHandler mRotationPrefChangeHandler;
private String mWallpaperPath;
private String question;
private String answer1;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -1200,25 +1206,17 @@ public class Launcher extends BaseActivity
if (mLauncherCallbacks != null) {
mLauncherCallbacks.onResume();
}
ActivationHelper.INSTANCE.active(this, new ActivationHelper.ActivationListener() {
@Override
public void activationFailed() {
}
@Override
public void activated() {
activationNext();
}
}, false);
WorkManager.INSTANCE.enter(Launcher.this);
}
private void activationNext() {
public static void forceReload() {
LauncherAppState app = LauncherAppState.getInstanceNoCreate();
if (app != null) {
app.getModel().forceReload();
LauncherModel model = app.getModel();
if (model != null) {
model.forceReload();
}
}
WorkManager.INSTANCE.enter(this);
}
......@@ -3110,12 +3108,17 @@ public class Launcher extends BaseActivity
}
private void showPwdDialog() {
DialogManager.INSTANCE.showPwdDialog(this, "请输入密码" ,new DialogManager.PwdListener(){
DialogManager.INSTANCE.showPwdDialog(this, "请输入密码", new DialogManager.PwdCanVerListener() {
@Override
public void onNeutral() {
showEncryptedVerDialog();
}
@Override
public void onPositive(View view) {
InputUtil.closeSoftInput(getApplicationContext(), view);
if (TextUtils.equals(((EditText)view).getText().toString(), Prefs.getLoginPwd(mAppContext))) {
if (TextUtils.equals(((EditText) view).getText().toString(), Prefs.getLoginPwd(mAppContext))) {
IntentUtil.startExitService(mAppContext);
} else {
DialogUIUtils.showToastCenter("密码错误");
......@@ -3129,6 +3132,51 @@ public class Launcher extends BaseActivity
});
}
private void showEncryptedVerDialog() {
String encryptedStr = Prefs.getEncrypted(mAppContext);
if (TextUtils.isEmpty(encryptedStr)) {
DialogUIUtils.showToastCenter("请先设置密保");
return;
}
Encrypted encrypted = JsonUtil.fromJson(encryptedStr, Encrypted.class);
if (TextUtils.equals(encrypted.getQuestion1(), question)) {
question = encrypted.getQuestion2();
answer1 = encrypted.getAnswer2();
} else {
question = encrypted.getQuestion1();
answer1 = encrypted.getAnswer1();
}
DialogManager.INSTANCE.showEncryptedVerDialog(this, getString(R.string.edu_item_input_encryted_title), question, new DialogManager.PwdListener() {
@Override
public void onPositive(View view) {
InputUtil.closeSoftInput(getApplicationContext(), view);
EditText editText = (EditText) view;
Editable editable = editText.getText();
if (editable == null || TextUtils.isEmpty(editable.toString())) {
DialogUIUtils.showToastCenter("密保答案为空");
return;
}
String answer = editable.toString();
answer = UtilsKt.encrypt(answer);
if (TextUtils.equals(answer1, answer)) {
Intent intent = new Intent(mAppContext, PwdPinSetPwdActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return;
}
DialogUIUtils.showToastCenter("密保答案错误");
}
@Override
public void onNegative() {
showEncryptedVerDialog();
}
});
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mLastDispatchTouchEventX = ev.getX();
......
......@@ -80,7 +80,6 @@ import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.Provider;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.util.ViewOnDrawExecutor;
import com.secspace.lib.common.env.Packages;
import java.io.FileDescriptor;
import java.io.PrintWriter;
......
......@@ -5,21 +5,29 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import com.android.launcher3.function.pwd.PwdPinSetPwdActivity;
import com.android.launcher3.function.setting.SettingAdminActivity;
import com.android.launcher3.settings.ErrorTimeHelper;
import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.lib.common.function.DialogManager;
import com.secspace.lib.common.function.model.Encrypted;
import com.secspace.lib.common.utils.InputUtil;
import com.secspace.lib.common.utils.JsonUtil;
import com.secspace.lib.common.utils.Prefs;
import com.secspace.lib.common.utils.ToastUtil;
import com.secspace.lib.common.utils.UtilsKt;
public class ManagerAuthActivity extends BaseActivity {
protected Context mAppContext;
private String question;
private String answer1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -29,14 +37,19 @@ public class ManagerAuthActivity extends BaseActivity {
}
private void showPwdDialog() {
DialogManager.INSTANCE.showPwdDialog(this, "请输入密码" ,new DialogManager.PwdListener(){
DialogManager.INSTANCE.showPwdDialog(this, "请输入密码", new DialogManager.PwdCanVerListener() {
@Override
public void onNeutral() {
showEncryptedVerDialog();
}
@Override
public void onPositive(View view) {
EditText editText = (EditText) view;
InputUtil.closeSoftInput(getApplicationContext(), editText);
boolean canInputPwd = ErrorTimeHelper.getInstance(mAppContext).canInputPwd();
if (canInputPwd){
if (canInputPwd) {
if (TextUtils.equals(editText.getText().toString(), Prefs.getLoginPwd(mAppContext))) {
finish();
ErrorTimeHelper.getInstance(mAppContext).resetLockTimeAndCount();
......@@ -48,14 +61,63 @@ public class ManagerAuthActivity extends BaseActivity {
ErrorTimeHelper.getInstance(mAppContext).addErrorCount();
finish();
}
}else {
ToastUtil.showShort(mAppContext,"请在"+ ErrorTimeHelper.getInstance(mAppContext).getCountDownTime()+"秒后重试");
} else {
ToastUtil.showShort(mAppContext, "请在" + ErrorTimeHelper.getInstance(mAppContext).getCountDownTime() + "秒后重试");
finish();
}
}
@Override
public void onNegative() {
finish();
}
});
}
private void showEncryptedVerDialog() {
String encryptedStr = Prefs.getEncrypted(mAppContext);
if (TextUtils.isEmpty(encryptedStr)) {
DialogUIUtils.showToastCenter("请先设置密保");
finish();
return;
}
Encrypted encrypted = JsonUtil.fromJson(encryptedStr, Encrypted.class);
if (TextUtils.equals(encrypted.getQuestion1(), question)) {
question = encrypted.getQuestion2();
answer1 = encrypted.getAnswer2();
} else {
question = encrypted.getQuestion1();
answer1 = encrypted.getAnswer1();
}
DialogManager.INSTANCE.showEncryptedVerDialog(this, getString(R.string.edu_item_input_encryted_title), question, new DialogManager.PwdListener() {
@Override
public void onPositive(View view) {
EditText editText = (EditText) view;
InputUtil.closeSoftInput(getApplicationContext(), editText);
Editable editable = editText.getText();
if (editable == null || TextUtils.isEmpty(editable.toString())) {
DialogUIUtils.showToastCenter("密保答案为空");
finish();
return;
}
String answer = editable.toString();
answer = UtilsKt.encrypt(answer);
if (TextUtils.equals(answer1, answer)) {
Intent intent = new Intent(mAppContext, PwdPinSetPwdActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
return;
}
DialogUIUtils.showToastCenter("密保答案错误");
finish();
}
@Override
public void onNegative() {
showEncryptedVerDialog();
}
});
}
......
......@@ -370,13 +370,17 @@ public class DragController implements DragDriver.EventListener, TouchController
@Override
public void onDriverDragEnd(float x, float y) {
DropTarget dropTarget;
Runnable flingAnimation = mFlingToDeleteHelper.getFlingAnimation(mDragObject);
if (flingAnimation != null) {
dropTarget = mFlingToDeleteHelper.getDropTarget();
} else {
dropTarget = findDropTarget((int) x, (int) y, mCoordinatesTemp);
}
Runnable flingAnimation = null;
// 取消快速滑动删除
// Runnable flingAnimation = mFlingToDeleteHelper.getFlingAnimation(mDragObject);
// if (flingAnimation != null) {
// Log.e("TAG1", "onDriverDragEnd: ifififif" );
// dropTarget = mFlingToDeleteHelper.getDropTarget();
// } else {
// Log.e("TAG1", "onDriverDragEnd: elseelse" );
// dropTarget = findDropTarget((int) x, (int) y, mCoordinatesTemp);
// }
dropTarget = findDropTarget((int) x, (int) y, mCoordinatesTemp);
drop(dropTarget, flingAnimation);
endDrag();
......
package com.android.launcher3.function.setting
package com.android.launcher3.function.pwd
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.SpannableString
import android.text.Spanned
......@@ -8,18 +9,26 @@ import android.text.SpannedString
import android.text.TextUtils
import android.text.style.AbsoluteSizeSpan
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.android.launcher3.function.pwd.PwdPinSetPwdActivity
import com.android.launcher3.settings.ErrorTimeHelper
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.lib.common.function.DialogManager
import com.secspace.lib.common.function.model.Encrypted
import com.secspace.lib.common.utils.InputUtil
import com.secspace.lib.common.utils.JsonUtil
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.ToastUtil
import com.secspace.lib.common.utils.encrypt
import kotlinx.android.synthetic.main.activity_change_pwd.*
import kotlinx.android.synthetic.main.activity_setting.tv_setting_title
class ChangePwdActivity : BaseActivity() {
private var mContext: Context? = null
private var question: String? = null
private var answer1: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
......@@ -36,7 +45,7 @@ class ChangePwdActivity : BaseActivity() {
setHintSize(et_new_pwd_again, getString(R.string.edu_item_input_newpwd_again))
tv_confir_pwd_protection.setOnClickListener {
ToastUtil.showShort(this@ChangePwdActivity, R.string.edu_toast_wait)
showEncryptedVerDialog()
}
}
......@@ -48,41 +57,83 @@ class ChangePwdActivity : BaseActivity() {
}
fun btnClick(v: View) {
val imm: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(window.decorView.windowToken, 0)
val originalPwd = et_old_pwd.text.toString()
val newPwd = et_new_pwd.text.toString()
val confirmNewPwd = et_new_pwd_again.text.toString()
if (!ErrorTimeHelper.getInstance(this).canShowDialog()) {
ToastUtil.showShort(this, String.format(getString(R.string.edu_item_input_lock), ErrorTimeHelper.getInstance(this).countDownTime))
DialogUIUtils.showToastCenter(String.format(getString(R.string.edu_item_input_lock), ErrorTimeHelper.getInstance(this).countDownTime))
return
}
if (newPwd.isEmpty()|| newPwd.length < PwdPinSetPwdActivity.PWD_TINY_LENGTH) {
ToastUtil.showShort(this, R.string.edu_item_input_newpwd_null)
DialogUIUtils.showToastCenter(R.string.edu_item_input_newpwd_null)
return
}
if (confirmNewPwd.isEmpty() || confirmNewPwd.length < PwdPinSetPwdActivity.PWD_TINY_LENGTH) {
ToastUtil.showShort(this, R.string.edu_item_input_newpwd_again_null)
DialogUIUtils.showToastCenter(R.string.edu_item_input_newpwd_again_null)
return
}
if (originalPwd.isEmpty()) {
ToastUtil.showShort(this, R.string.edu_item_input_oldpwd_null)
DialogUIUtils.showToastCenter(R.string.edu_item_input_oldpwd_null)
return
}
if (!TextUtils.equals(originalPwd, Prefs.getLoginPwd(this))) {
ToastUtil.showShort(this, R.string.edu_item_input_pwd_error)
DialogUIUtils.showToastCenter(R.string.edu_item_input_pwd_error)
ErrorTimeHelper.getInstance(this).addErrorCount()
return
}
if (!TextUtils.equals(newPwd, confirmNewPwd)) {
ToastUtil.showShort(this, R.string.edu_item_input_pwd_different)
DialogUIUtils.showToastCenter(R.string.edu_item_input_pwd_different)
return
}
ToastUtil.showShort(this, R.string.edu_item_input_pwd_change_success)
DialogUIUtils.showToastCenter(R.string.edu_item_input_pwd_change_success)
Prefs.setLoginPwd(this, newPwd)
//如果存在输错密码多次的情况下重置密码
ErrorTimeHelper.getInstance(this).resetLockTimeAndCount()
finish()
}
private fun showEncryptedVerDialog() {
val encryptedStr = Prefs.getEncrypted(mAppContext)
if (TextUtils.isEmpty(encryptedStr)) {
DialogUIUtils.showToastCenter("请先设置密保")
return
}
val (question1, answer11, question2, answer2) = JsonUtil.fromJson(encryptedStr, Encrypted::class.java)
if (TextUtils.equals(question1, question)) {
question = question2
answer1 = answer2
} else {
question = question1
answer1 = answer11
}
DialogManager.showEncryptedVerDialog(this, getString(R.string.edu_item_input_encryted_title), question, object : DialogManager.PwdListener {
override fun onPositive(view: View?) {
val editText = view as EditText?
InputUtil.closeSoftInput(applicationContext, editText)
val editable = editText!!.text
if (editable == null || TextUtils.isEmpty(editable.toString())) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_title)
return
}
var answer = editable.toString()
answer = encrypt(answer)
if (TextUtils.equals(answer1, answer)) {
val intent = Intent(mAppContext, PwdPinSetPwdActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
return
}
DialogUIUtils.showToastCenter("密保答案错误")
}
override fun onNegative() {
showEncryptedVerDialog()
}
})
}
fun close(view: View?) {
finish()
}
......
package com.android.launcher3.function.pwd
import android.content.Context
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentTransaction
import android.view.View
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.android.launcher3.function.pwd.fragment.EncryptedSetFragment
import com.android.launcher3.function.pwd.fragment.EncryptedVerifyFragment
import com.secspace.lib.common.utils.Prefs
class EncryptedActivity : BaseActivity() {
private var mContext: Context? = null
private val encryptedSet = EncryptedSetFragment()
private val encryptedVer = EncryptedVerifyFragment()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAndroidNativeLightStatusBar(true)
setContentView(R.layout.activity_encrypted)
mContext = this
val from = intent.getStringExtra("from")
if(from == null){
val encrypted = Prefs.getEncrypted(mContext)
if (encrypted == "") {
replaceFragment(encryptedSet)
} else {
replaceFragment(encryptedVer)
}
return
}
replaceFragment(encryptedSet)
}
private fun replaceFragment(fragment: Fragment) {
val fragmentManager: FragmentManager = supportFragmentManager
val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.ll_encrypted_parent, fragment, "")
fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()
}
fun close(view: View?) {
finish()
}
override fun onBackPressed() {
super.onBackPressed()
finish()
}
}
\ No newline at end of file
package com.android.launcher3.function.pwd;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
......@@ -22,9 +18,8 @@ import android.widget.TextView;
import com.android.launcher3.BaseActivity;
import com.android.launcher3.R;
import com.android.launcher3.settings.BlankActivity;
import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.lib.common.utils.Prefs;
import com.secspace.lib.common.utils.ToastUtil;
import java.util.regex.Pattern;
......@@ -49,10 +44,12 @@ public class PwdPinSetPwdActivity extends BaseActivity implements View.OnClickLi
* 密码短程度
*/
public static final int PWD_TINY_LENGTH = 6;
EditText mEditPwd;
CheckBox mCbShowPwd;
Button mBtSure;
TextView mTvtip;
private EditText mEditPwd;
private CheckBox mCbShowPwd;
private EditText mEditPwdAgain;
private CheckBox mCbShowPwdAgain;
private Button mBtSure;
private TextView mTvtip;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
......@@ -63,11 +60,14 @@ public class PwdPinSetPwdActivity extends BaseActivity implements View.OnClickLi
private void initView() {
mEditPwd = findViewById(R.id.edit_pwd);
mEditPwdAgain = findViewById(R.id.edit_pwd_again);
mCbShowPwd = findViewById(R.id.cb_show_pwd);
mCbShowPwdAgain = findViewById(R.id.cb_show_pwd_again);
mBtSure = findViewById(R.id.btn_sure);
mTvtip = findViewById(R.id.tv_tip);
mBtSure.setOnClickListener(this);
mCbShowPwd.setOnCheckedChangeListener(this);
mCbShowPwdAgain.setOnCheckedChangeListener(this);
}
private void startLauncher() {
......@@ -87,19 +87,23 @@ public class PwdPinSetPwdActivity extends BaseActivity implements View.OnClickLi
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_sure:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
String pwd = String.valueOf(mEditPwd.getText());
if (TextUtils.isEmpty(pwd)) {
ToastUtil.showShort(this, "密码不能为空");
String pwdAgain = String.valueOf(mEditPwdAgain.getText());
if (TextUtils.isEmpty(pwd) || (pwd.length() < PWD_TINY_LENGTH)) {
DialogUIUtils.showToastCenter("密码为空或长度小于6位");
return;
}
if (pwd.length() < PWD_TINY_LENGTH) {
ToastUtil.showShort(this, "密码至少为6位");
if (TextUtils.isEmpty(pwdAgain) || (pwdAgain.length() < PWD_TINY_LENGTH)) {
DialogUIUtils.showToastCenter("确认密码为空或长度小于6位");
return;
}
if (!TextUtils.equals(pwd, pwdAgain)) {
DialogUIUtils.showToastCenter("两次输入密码不同");
return;
}
// if (pwd.length() > PWD_MAX_LENGTH) {
// ToastUtil.showShort(this, "密码不能超过16位");
// return;
// }
Log.i(TAG, "matches: " + datePatt.matcher(pwd).matches());
// if (!datePatt.matcher(pwd).matches()) {
// ToastUtil.showShort(this, "新密码必须为数字、字母或常用符号的8-16位组合");
......@@ -115,11 +119,22 @@ public class PwdPinSetPwdActivity extends BaseActivity implements View.OnClickLi
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Log.i(TAG, "onCheckedChanged: TYPE_TEXT_VARIATION_PASSWORD");
mEditPwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else {
mEditPwd.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
switch (buttonView.getId()) {
case R.id.cb_show_pwd:
if (isChecked) {
mEditPwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else {
mEditPwd.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
}
break;
case R.id.cb_show_pwd_again:
if (isChecked) {
mEditPwdAgain.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else {
mEditPwdAgain.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
}
break;
}
}
}
package com.android.launcher3.function.setting
package com.android.launcher3.function.pwd
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.widget.EditText
import android.widget.GridLayout
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.android.launcher3.mdm.DisableCompat
import com.android.launcher3.settings.Contants
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.utils.PkgManager
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.ToastUtil
import com.secspace.lib.common.utils.dp2px
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.lib.common.function.DialogManager.PwdListener
import com.secspace.lib.common.function.DialogManager.showEncryptedVerDialog
import com.secspace.lib.common.function.model.Encrypted
import com.secspace.lib.common.utils.*
import kotlinx.android.synthetic.main.activity_setting.*
class SettingPwdActivity : BaseActivity(){
......@@ -46,12 +48,10 @@ class SettingPwdActivity : BaseActivity(){
dp2px(48f))
QMUIGroupListView.newSection(this)
.addItemView(pwd) {
val intent1 = Intent(this, ChangePwdActivity::class.java)
intent1.putExtra(Contants.IS_SHOW_ORIGINAL_PWD, true)
startActivity(intent1)
startActivity(Intent(this, ChangePwdActivity::class.java))
}
.addItemView(pwdCar) {
ToastUtil.showShort(mContext, R.string.edu_toast_wait)
startActivity(Intent(this, EncryptedActivity::class.java))
}
.addTo(grouplistview)
}
......
package com.android.launcher3.function.pwd.fragment
import android.content.Context
import android.os.Bundle
import android.support.v4.app.Fragment
import android.text.SpannableString
import android.text.Spanned
import android.text.SpannedString
import android.text.style.AbsoluteSizeSpan
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import com.android.launcher3.R
import com.secspace.lib.common.function.model.Encrypted
import com.android.launcher3.settings.ErrorTimeHelper
import com.google.gson.Gson
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.encrypt
class EncryptedSetFragment : Fragment() {
private lateinit var questionEt1: EditText
private lateinit var questionEt2: EditText
private lateinit var answerEt1: EditText
private lateinit var answerEt2: EditText
private lateinit var sureBtn: Button
private lateinit var titleTv: TextView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view: View = inflater.inflate(R.layout.fragment_encrypted_set, container, false)
initView(view)
return view
}
private fun initView(view: View) {
titleTv = view.findViewById(R.id.tv_setting_title)
sureBtn = view.findViewById(R.id.btn_encrypted_set)
questionEt1 = view.findViewById(R.id.et_question1)
questionEt2 = view.findViewById(R.id.et_question2)
answerEt1 = view.findViewById(R.id.et_answer1)
answerEt2 = view.findViewById(R.id.et_answer2)
titleTv.setText(R.string.edu_item_input_encryted_set)
setHintSize(questionEt1, getString(R.string.edu_item_input_encryted_question1))
setHintSize(answerEt1, getString(R.string.edu_item_input_encryted_answer1))
setHintSize(questionEt2, getString(R.string.edu_item_input_encryted_question2))
setHintSize(answerEt2, getString(R.string.edu_item_input_encryted_answer2))
sureBtn.setOnClickListener {
btnClick()
}
titleTv.setOnClickListener {
activity?.finish()
}
}
private fun setHintSize(editText: EditText, text: String) {
val ss = SpannableString(text)
val ass = AbsoluteSizeSpan(15, true)
ss.setSpan(ass, 0, ss.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
editText.hint = SpannedString(ss)
}
private fun btnClick() {
val imm: InputMethodManager = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(activity?.window?.decorView?.windowToken, 0)
val question1 = questionEt1.text.toString()
var answer1 = answerEt1.text.toString()
val question2 = questionEt2.text.toString()
var answer2 = answerEt2.text.toString()
if (question1.isEmpty() || question2.isEmpty()) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_question_null)
return
}
if (answer1.isEmpty() || answer2.isEmpty()) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_answer_null)
return
}
DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_set_success)
answer1 = encrypt(answer1)
answer2 = encrypt(answer2)
val encrypted = Encrypted(question1, answer1, question2, answer2)
Prefs.setEncrypted(activity, Gson().toJson(encrypted))
//如果存在输错密码多次的情况下重置密码
ErrorTimeHelper.getInstance(activity).resetLockTimeAndCount()
activity?.finish()
}
}
\ No newline at end of file
package com.android.launcher3.function.pwd.fragment
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.text.SpannableString
import android.text.Spanned
import android.text.SpannedString
import android.text.style.AbsoluteSizeSpan
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import com.android.launcher3.R
import com.secspace.lib.common.function.model.Encrypted
import com.android.launcher3.function.pwd.EncryptedActivity
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.lib.common.utils.JsonUtil
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.encrypt
class EncryptedVerifyFragment : Fragment() {
private lateinit var questionTv1: TextView
private lateinit var questionTv2: TextView
private lateinit var answerEt1: EditText
private lateinit var answerEt2: EditText
private lateinit var sureBtn: Button
private lateinit var titleTv: TextView
private lateinit var encrypted: Encrypted
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view: View = inflater.inflate(R.layout.fragment_encrypted_ver, container, false)
val encryptedStr = Prefs.getEncrypted(activity)
if (encryptedStr.isEmpty()) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_error)
}
encrypted = JsonUtil.fromJson(encryptedStr, Encrypted::class.java)
initView(view)
return view
}
private fun initView(view: View) {
titleTv = view.findViewById(R.id.tv_setting_title)
sureBtn = view.findViewById(R.id.btn_encrypted_set)
questionTv1 = view.findViewById(R.id.tv_question1)
questionTv2 = view.findViewById(R.id.tv_question2)
answerEt1 = view.findViewById(R.id.et_answer1)
answerEt2 = view.findViewById(R.id.et_answer2)
titleTv.setText(R.string.edu_item_input_encryted_verfiy)
setHintSize(answerEt1, getString(R.string.edu_item_input_encryted_answer1))
setHintSize(answerEt2, getString(R.string.edu_item_input_encryted_answer2))
questionTv1.text = encrypted.question1
questionTv2.text = encrypted.question2
sureBtn.setOnClickListener {
btnClick()
}
titleTv.setOnClickListener {
activity?.finish()
}
}
private fun setHintSize(editText: EditText, text: String) {
val ss = SpannableString(text)
val ass = AbsoluteSizeSpan(15, true)
ss.setSpan(ass, 0, ss.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
editText.hint = SpannedString(ss)
}
private fun btnClick() {
val imm: InputMethodManager = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(activity?.window?.decorView?.windowToken, 0)
var answer1 = answerEt1.text.toString()
var answer2 = answerEt2.text.toString()
if (answer1.isEmpty() || answer2.isEmpty()) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_answer_null)
return
}
answer1 = encrypt(answer1)
answer2 = encrypt(answer2)
if (answer1 != encrypted.answer1) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_answer1_error)
return
}
if (answer2 != encrypted.answer2) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_answer2_error)
return
}
DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_ver_success)
val intent = Intent(activity, EncryptedActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra("from", EncryptedVerifyFragment::class.java.simpleName)
startActivity(intent)
activity?.finish()
}
}
\ No newline at end of file
......@@ -5,15 +5,12 @@ import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.ResolveInfo
import android.os.Bundle
import android.os.Handler
import android.support.v7.widget.DefaultItemAnimator
import android.support.v7.widget.DividerItemDecoration
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.LinearLayoutManager.HORIZONTAL
import android.support.v7.widget.LinearLayoutManager.VERTICAL
import android.util.Log
import android.view.View
import com.android.launcher3.BaseActivity
import com.android.launcher3.Launcher
import com.android.launcher3.R
import com.android.launcher3.settings.AppChooseListAdapter
import com.android.launcher3.settings.AppChooseListAdapter.SYSTEM_APP_FLAG
......@@ -36,6 +33,7 @@ class AppChooseActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_app_manager)
LoadingDialog.getInstance(this).show("加载中")
mContext = this
setAndroidNativeLightStatusBar(true)
initView()
......@@ -44,7 +42,6 @@ class AppChooseActivity : BaseActivity() {
fun initView() {
tv_setting_title.setText(R.string.edu_item_icon)
LoadingDialog.getInstance(this).show("加载中")
mAppInfoAdapterSystemApp = AppChooseListAdapter(SYSTEM_APP_FLAG)
mAppInfoAdapterSystemApp?.setItemViewId(R.layout.item_app_choose_list)
val linearLayoutManager = LinearLayoutManager(this, VERTICAL, false)
......@@ -80,6 +77,7 @@ class AppChooseActivity : BaseActivity() {
private suspend fun loadFinished(appModels: List<AppModel>) {
mSystemApps.clear()
mUserApps.clear()
appModels.forEach {
if (it.appInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0) {
mSystemApps.add(it)
......@@ -90,6 +88,8 @@ class AppChooseActivity : BaseActivity() {
}
}
withContext(Dispatchers.Main) {
btn_sure.isEnabled = true
btn_cancel.isEnabled = true
LoadingDialog.getInstance(mContext).dismiss()
mAppInfoAdapterUserApp?.readResult(mAppContext)
mAppInfoAdapterSystemApp?.readResult(mAppContext)
......@@ -106,11 +106,16 @@ class AppChooseActivity : BaseActivity() {
fun btnClick(view: View?) {
when (view?.id) {
R.id.btn_sure -> {
mAppInfoAdapterSystemApp?.saveResult(mAppContext)
mAppInfoAdapterUserApp?.saveResult(mAppContext)
SwitchInMdm.addDisallowedRunningApp(this)
IntentUtil.startEduLauncher(this)
finish()
GlobalScope.launch (Dispatchers.Main){
LoadingDialog.getInstance(mAppContext).show("请稍后")
mAppInfoAdapterSystemApp?.saveResult(mAppContext)
mAppInfoAdapterUserApp?.saveResult(mAppContext)
SwitchInMdm.addDisallowedRunningApp(mContext)
Launcher.forceReload()
IntentUtil.startEduLauncher(mContext)
LoadingDialog.getInstance(mAppContext).dismiss()
finish()
}
}
R.id.btn_cancel -> {
job?.cancel()
......
package com.android.launcher3.function.setting
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.GridLayout
import android.widget.LinearLayout
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.utils.*
import kotlinx.android.synthetic.main.activity_setting.*
import kotlinx.android.synthetic.main.activity_setting.tv_setting_title
import kotlinx.android.synthetic.main.activity_use_app.*
class AppUseActivity : BaseActivity() {
private var mContext: Context? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAndroidNativeLightStatusBar(true)
setContentView(R.layout.activity_use_app)
mContext = this
initView()
}
private fun initView() {
tv_setting_title.setText(R.string.edu_item_app_use_title)
tv_app_use_time.text = String.format(getString(R.string.edu_item_app_use_last_day), "50")
time_progress.initAnimation()
}
fun close(view: View?) {
finish()
}
fun more(view: View) {
}
}
\ No newline at end of file
......@@ -56,7 +56,7 @@ class SettingActivity : BaseActivity() {
dp2px(48f))
QMUIGroupListView.newSection(mContext)
.addItemView(wlan) { IntentUtil.startWifiSetting(mContext) }
.addItemView(appUse) { ToastUtil.showShort(mContext, R.string.edu_toast_wait) }
.addItemView(appUse) { startActivity(Intent(mContext, AppUseActivity::class.java)) }
.addItemView(buy) { startActivity(Intent(mContext, SettingBuyActivity::class.java)) }
.addItemView(about) { startActivity(Intent(mContext, SettingAboutActivity::class.java)) }
.addTo(grouplistview)
......
......@@ -8,11 +8,11 @@ import android.view.View
import android.widget.GridLayout
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.android.launcher3.function.pwd.SettingPwdActivity
import com.android.launcher3.mdm.DisableCompat
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.dialog.SwitcherDialog
import com.secspace.lib.common.event.ChangeWallPaperEvent
import com.secspace.lib.common.function.DialogManager
import com.secspace.lib.common.utils.PkgManager
......
......@@ -96,7 +96,6 @@ public class LauncherIcons {
*/
public static Bitmap createBadgedIconBitmap(
Drawable icon, UserHandle user, Context context, int iconAppTargetSdk) {
IconNormalizer normalizer;
float scale = 1f;
if (!FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION) {
......@@ -155,23 +154,23 @@ public class LauncherIcons {
float scale = 1f;
if (!FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION) {
normalizer = IconNormalizer.getInstance(context);
if (Utilities.isAtLeastO() && iconAppTargetSdk >= Build.VERSION_CODES.O) {
boolean[] outShape = new boolean[1];
AdaptiveIconDrawable dr = (AdaptiveIconDrawable)
context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate();
dr.setBounds(0, 0, 1, 1);
scale = normalizer.getScale(icon, iconBounds, dr.getIconMask(), outShape);
if (Utilities.isAtLeastO() && FeatureFlags.LEGACY_ICON_TREATMENT &&
!outShape[0]) {
Drawable wrappedIcon = wrapToAdaptiveIconDrawable(context, icon, scale);
if (wrappedIcon != icon) {
icon = wrappedIcon;
scale = normalizer.getScale(icon, iconBounds, null, null);
}
}
} else {
// if (Utilities.isAtLeastO() && iconAppTargetSdk >= Build.VERSION_CODES.O) {
// boolean[] outShape = new boolean[1];
// AdaptiveIconDrawable dr = (AdaptiveIconDrawable)
// context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate();
// dr.setBounds(0, 0, 1, 1);
// scale = normalizer.getScale(icon, iconBounds, dr.getIconMask(), outShape);
// if (Utilities.isAtLeastO() && FeatureFlags.LEGACY_ICON_TREATMENT &&
// !outShape[0]) {
// Drawable wrappedIcon = wrapToAdaptiveIconDrawable(context, icon, scale);
// if (wrappedIcon != icon) {
// icon = wrappedIcon;
// scale = normalizer.getScale(icon, iconBounds, null, null);
// }
// }
// } else {
scale = normalizer.getScale(icon, iconBounds, null, null);
}
// }
}
scale = Math.min(scale, ShadowGenerator.getScaleForBounds(iconBounds));
......
......@@ -265,10 +265,10 @@ public class LoaderCursor extends CursorWrapper {
info.intent = newIntent;
mIconCache.getTitleAndIcon(info, lai, useLowResIcon);
if (mIconCache.isDefaultIcon(info.iconBitmap, user)) {
Bitmap icon = loadIcon(info);
info.iconBitmap = icon != null ? icon : info.iconBitmap;
}
// if (mIconCache.isDefaultIcon(info.iconBitmap, user)) {
// Bitmap icon = loadIcon(info);
// info.iconBitmap = icon != null ? icon : info.iconBitmap;
// }
if (lai != null && PackageManagerHelper.isAppSuspended(lai.getApplicationInfo())) {
info.isDisabled = ShortcutInfo.FLAG_DISABLED_SUSPENDED;
......
package com.android.launcher3.settings;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.secspace.lib.common.event.RefreshWorkSpaceEvent;
import com.secspace.lib.common.function.SwitchInMdm;
import com.secspace.lib.common.utils.Prefs;
import org.greenrobot.eventbus.EventBus;
import java.util.List;
public class AppInstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
String packageName = intent.getData().getSchemeSpecificPart();
if (!TextUtils.isEmpty(packageName)) {
if (!TextUtils.isEmpty(packageName) && !TextUtils.equals(packageName, context.getPackageName())) {
if (Prefs.isAllowNewApp(context)) {
List<String> pkgs = Prefs.getUserShowAppPkgs(context);
pkgs.add(packageName);
Prefs.setUserShowAppPkgs(context, pkgs);
SwitchInMdm.INSTANCE.addDisallowedRunningApp(context);
EventBus.getDefault().post(new RefreshWorkSpaceEvent());
}
EventBus.getDefault().post(new RefreshWorkSpaceEvent());
}
}
}
}
}
package com.android.launcher3.settings
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.text.TextUtils
import com.android.launcher3.Launcher
import com.secspace.lib.common.event.RefreshWorkSpaceEvent
import com.secspace.lib.common.function.SwitchInMdm.addDisallowedRunningApp
import com.secspace.lib.common.utils.Prefs
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
class AppInstallReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_PACKAGE_ADDED) {
val packageName = intent.data?.schemeSpecificPart
if (!TextUtils.isEmpty(packageName)) {
if (!TextUtils.isEmpty(packageName) && !TextUtils.equals(packageName, context.packageName)) {
if (Prefs.isAllowNewApp(context)) {
val pkgs = Prefs.getUserShowAppPkgs(context)
pkgs.add(packageName)
Prefs.setUserShowAppPkgs(context, pkgs)
GlobalScope.launch(Dispatchers.IO) {
addDisallowedRunningApp(context)
}
Launcher.forceReload()
EventBus.getDefault().post(RefreshWorkSpaceEvent())
}
EventBus.getDefault().post(RefreshWorkSpaceEvent())
}
}
}
}
}
\ No newline at end of file
......@@ -5,6 +5,8 @@ import android.content.pm.ApplicationInfo;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import com.secspace.lib.common.utils.UtilsKt;
public class AppModel {
......@@ -54,16 +56,10 @@ public class AppModel {
}
private void loadIcon() {
mIcon = mContext.getPackageManager().getApplicationIcon(mInfo);
if (mIcon == null) {
mIcon = mInfo.loadIcon(mContext.getPackageManager());
}
mIcon = UtilsKt.getApplicationIcon(mContext, mInfo.packageName);
}
private void loadLabel() {
mAppLabel = mInfo.loadLabel(mContext.getPackageManager()).toString();
if (TextUtils.isEmpty(mAppLabel)) {
mAppLabel = mInfo.name;
}
mAppLabel = UtilsKt.getApplicationName(mContext, mInfo.packageName);
}
}
......@@ -6,6 +6,7 @@ import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.WindowManager;
import com.android.launcher3.function.pwd.EncryptedActivity;
import com.android.launcher3.function.pwd.PwdPinSetPwdActivity;
import com.secspace.lib.common.base.BaseActivity;
import com.secspace.lib.common.function.DialogManager;
......@@ -40,9 +41,17 @@ public class BlankActivity extends BaseActivity {
if(!checkPermissions()){
return;
}
String encrypted = Prefs.getEncrypted(this);
if(TextUtils.isEmpty(encrypted)){
Intent intent = new Intent(this, EncryptedActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return;
}
String pwd = Prefs.getLoginPwd(this);
if (TextUtils.isEmpty(pwd)) {
Intent intent = new Intent(this, PwdPinSetPwdActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return;
}
......
......@@ -16,7 +16,7 @@
<Button
android:onClick="uninstall_mobile_steward"
android:text="卸载学习"
android:text="卸载学习空间"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_width="match_parent"
......
......@@ -6,9 +6,9 @@
</head>
<body>
<font size="2">
<p>欢迎使用学习</p>
<p>本《免责声明与软件许可协议》(以下简称《协议》或协议)是您(以下也称为“用户”)与本公司之间关学习于用户下载、安装、使用的权利与义务的约定。</p>
<p>当您安装学习时,将会被提示是否同意接受本《协议》,请务必认真阅读和理解本《协议》中规定的所有权利和限制。除非您接受本《协议》所有条款,否则您无权激活及使用本产品。您一旦激活及使用本产品,将视为对本《协议》的接受,即表示您同意接受本《协议》各项条款的约束。</p>
<p>欢迎使用学习空间</p>
<p>本《免责声明与软件许可协议》(以下简称《协议》或协议)是您(以下也称为“用户”)与本公司之间关学习空间于用户下载、安装、使用的权利与义务的约定。</p>
<p>当您安装学习空间时,将会被提示是否同意接受本《协议》,请务必认真阅读和理解本《协议》中规定的所有权利和限制。除非您接受本《协议》所有条款,否则您无权激活及使用本产品。您一旦激活及使用本产品,将视为对本《协议》的接受,即表示您同意接受本《协议》各项条款的约束。</p>
<h3>一、软件许可协议</h3>
<h4>a) 产品安装及使用</h4>
<p>本产品仅可安装于安卓系统的终端上,暂不支持其他平台的安装及使用;</p>
......
......@@ -26,8 +26,8 @@ MAVEN_URL=http://192.168.0.170:13000/nexus/content/repositories/releases/
MAVEN_URL_SNAPSHOT=http://192.168.0.170:13000/nexus/content/repositories/releases/
#32位有符号数2147483647(10)
versionIntCode=2020032301
versionIntCode=2020032601
versionNameMajor=1
versionNameMinor=0
versionNamePatch=3
\ No newline at end of file
versionNameMinor=2
versionNamePatch=0
\ No newline at end of file
......@@ -117,14 +117,15 @@ dependencies {
implementation 'com.secspace:provider_mdm_engine:1.1.0.60'
implementation files('libs/jxl.jar')
implementation files('libs/activation.aar')
implementation files('libs/update.aar')
implementation files('libs/downloader.aar')
// Room
implementation 'com.tk.lib:room:1.0.2'
// Downloader
implementation 'com.tk.lib:downloader:1.0.9'
implementation 'com.tk.lib:dialog:1.0.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61"
implementation "com.qmuiteam:qmui:1.3.0"
implementation 'com.tk.lib:update-excludePush:1.1.0'
implementation "org.reactivestreams:reactive-streams:1.0.2"
}
\ No newline at end of file
......@@ -31,6 +31,15 @@
<activity android:name=".AddDeviceAdminActivity"
android:excludeFromRecents="true"/>
<service android:name=".function.ExitService"/>
<service
android:name=".function.service.EduAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/work_accessibility" />
</service>
</application>
</manifest>
......@@ -36,6 +36,7 @@ import com.secspace.lib.common.R;
public class AlertDialogHolder extends SuperHolder {
protected TextView tvTitle;
public TextView tvMsg;
public TextView tvThird;
public EditText et1;
public EditText et2;
protected View line;
......@@ -58,23 +59,24 @@ public class AlertDialogHolder extends SuperHolder {
@Override
protected void findViews() {
tvTitle = (TextView) rootView.findViewById(R.id.dialogui_tv_title);
tvMsg = (TextView) rootView.findViewById(R.id.dialogui_tv_msg);
et1 = (EditText) rootView.findViewById(R.id.et_1);
et2 = (EditText) rootView.findViewById(R.id.et_2);
line = (View) rootView.findViewById(R.id.line);
btn1 = (Button) rootView.findViewById(R.id.btn_1);
lineBtn2 = (View) rootView.findViewById(R.id.line_btn2);
btn2 = (Button) rootView.findViewById(R.id.btn_2);
lineBtn3 = (View) rootView.findViewById(R.id.line_btn3);
btn3 = (Button) rootView.findViewById(R.id.btn_3);
llContainerHorizontal = (LinearLayout) rootView.findViewById(R.id.ll_container_horizontal);
btn1Vertical = (Button) rootView.findViewById(R.id.btn_1_vertical);
lineBtn2Vertical = (View) rootView.findViewById(R.id.line_btn2_vertical);
btn2Vertical = (Button) rootView.findViewById(R.id.btn_2_vertical);
lineBtn3Vertical = (View) rootView.findViewById(R.id.line_btn3_vertical);
btn3Vertical = (Button) rootView.findViewById(R.id.btn_3_vertical);
llContainerVertical = (LinearLayout) rootView.findViewById(R.id.ll_container_vertical);
tvTitle = rootView.findViewById(R.id.dialogui_tv_title);
tvMsg = rootView.findViewById(R.id.dialogui_tv_msg);
et1 = rootView.findViewById(R.id.et_1);
et2 = rootView.findViewById(R.id.et_2);
line = rootView.findViewById(R.id.line);
btn1 = rootView.findViewById(R.id.btn_1);
lineBtn2 = rootView.findViewById(R.id.line_btn2);
btn2 = rootView.findViewById(R.id.btn_2);
lineBtn3 = rootView.findViewById(R.id.line_btn3);
btn3 = rootView.findViewById(R.id.btn_3);
llContainerHorizontal = rootView.findViewById(R.id.ll_container_horizontal);
btn1Vertical = rootView.findViewById(R.id.btn_1_vertical);
lineBtn2Vertical = rootView.findViewById(R.id.line_btn2_vertical);
btn2Vertical = rootView.findViewById(R.id.btn_2_vertical);
lineBtn3Vertical = rootView.findViewById(R.id.line_btn3_vertical);
btn3Vertical = rootView.findViewById(R.id.btn_3_vertical);
llContainerVertical = rootView.findViewById(R.id.ll_container_vertical);
tvThird = rootView.findViewById(R.id.tv_third);
}
......@@ -93,6 +95,9 @@ public class AlertDialogHolder extends SuperHolder {
tvTitle.setTextColor(ToolUtils.getColor(tvTitle.getContext(), bean.titleTxtColor));
tvTitle.setTextSize(bean.titleTxtSize);
tvThird.setTextColor(ToolUtils.getColor(tvThird.getContext(), bean.inputTxtColor));
tvThird.setTextSize(bean.thirdTxtSize);
btn3Vertical.setTextSize(bean.btnTxtSize);
btn2Vertical.setTextSize(bean.btnTxtSize);
btn1Vertical.setTextSize(bean.btnTxtSize);
......@@ -134,6 +139,13 @@ public class AlertDialogHolder extends SuperHolder {
tvMsg.setTextSize(bean.msgTxtSize);
}
if (TextUtils.isEmpty(bean.thirdTxt)) {
tvThird.setVisibility(View.GONE);
} else {
tvThird.setVisibility(View.VISIBLE);
tvThird.setText(bean.thirdTxt);
}
if (bean.isPassword) {
et1.setVisibility(View.VISIBLE);
et2.setVisibility(View.GONE);
......@@ -221,7 +233,13 @@ public class AlertDialogHolder extends SuperHolder {
}
}
tvThird.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogUIUtils.dismiss(bean.dialog, bean.alertDialog);
bean.listener.onNeutral();
}
});
//事件
if (bean.isVertical) {
btn1Vertical.setOnClickListener(new View.OnClickListener() {
......
......@@ -62,6 +62,8 @@ public interface Assignable {
BuildBean assignAlertPassword(Context activity, CharSequence title, CharSequence msg, CharSequence hint1, CharSequence hint2,
CharSequence firstTxt, CharSequence secondTxt, boolean isVertical, boolean cancleable, boolean outsideTouchable, final DialogUIListener listener);
BuildBean assignAlertPasswordCanVer(Context activity, CharSequence title, CharSequence msg, CharSequence thirdTxt, CharSequence hint1, CharSequence hint2,
CharSequence firstTxt, CharSequence secondTxt, boolean isVertical, boolean cancleable, boolean outsideTouchable, final DialogUIListener listener);
/**
* 自定义弹出框
*/
......
......@@ -57,6 +57,7 @@ public class BuildBean extends Buildable implements Styleable {
public CharSequence text1 = DialogConfig.dialogui_btnTxt1;
public CharSequence text2 = DialogConfig.dialogui_btnTxt2;
public CharSequence text3;
public CharSequence thirdTxt;
public CharSequence bottomTxt = DialogConfig.dialogui_bottomTxt;
public CharSequence hint1;
......@@ -113,10 +114,11 @@ public class BuildBean extends Buildable implements Styleable {
//字体大小
public int btnTxtSize = 17;// in sp
public int titleTxtSize = 14;
public int titleTxtSize = 17;
public int msgTxtSize = 14;
public int itemTxtSize = 14;
public int inputTxtSize = 14;
public int thirdTxtSize = 14;
@SuppressLint("ResourceType")
......
......@@ -25,7 +25,7 @@ public class DialogAssigner implements Assignable {
@Override
public BuildBean assignLoading(Context context, CharSequence msg,boolean isVertical, boolean cancleable, boolean outsideTouchable, boolean isWhiteBg) {
public BuildBean assignLoading(Context context, CharSequence msg, boolean isVertical, boolean cancleable, boolean outsideTouchable, boolean isWhiteBg) {
BuildBean bean = new BuildBean();
bean.mContext = context;
bean.msg = msg;
......@@ -39,7 +39,7 @@ public class DialogAssigner implements Assignable {
}
@Override
public BuildBean assignMdLoading(Context context, CharSequence msg,boolean isVertical, boolean cancleable, boolean outsideTouchable, boolean isWhiteBg) {
public BuildBean assignMdLoading(Context context, CharSequence msg, boolean isVertical, boolean cancleable, boolean outsideTouchable, boolean isWhiteBg) {
BuildBean bean = new BuildBean();
bean.mContext = context;
bean.msg = msg;
......@@ -108,7 +108,27 @@ public class DialogAssigner implements Assignable {
@Override
public BuildBean assignAlertPassword(Context activity, CharSequence title, CharSequence msg, CharSequence hint1, CharSequence hint2,
CharSequence firstTxt, CharSequence secondTxt, boolean isVertical, boolean cancleable, boolean outsideTouchable, DialogUIListener listener) {
CharSequence firstTxt, CharSequence secondTxt, boolean isVertical, boolean cancleable, boolean outsideTouchable, DialogUIListener listener) {
BuildBean bean = new BuildBean();
bean.mContext = activity;
bean.msg = msg;
bean.title = title;
bean.hint1 = hint1;
bean.hint2 = hint2;
bean.text1 = firstTxt;
bean.text2 = secondTxt;
bean.isVertical = isVertical;
bean.gravity = Gravity.CENTER;
bean.cancelable = cancleable;
bean.outsideTouchable = outsideTouchable;
bean.listener = listener;
bean.type = DialogConfig.TYPE_ALERT;
bean.isPassword = true;
return bean;
}
@Override
public BuildBean assignAlertPasswordCanVer(Context activity, CharSequence title, CharSequence msg, CharSequence thirdTxt, CharSequence hint1, CharSequence hint2, CharSequence firstTxt, CharSequence secondTxt, boolean isVertical, boolean cancleable, boolean outsideTouchable, DialogUIListener listener) {
BuildBean bean = new BuildBean();
bean.mContext = activity;
bean.msg = msg;
......@@ -124,6 +144,7 @@ public class DialogAssigner implements Assignable {
bean.listener = listener;
bean.type = DialogConfig.TYPE_ALERT;
bean.isPassword = true;
bean.thirdTxt = thirdTxt;
return bean;
}
......
......@@ -27,7 +27,7 @@ import com.secspace.lib.common.R;
public class DialogConfig {
@ColorRes
public static int iosBtnColor = R.color.ios_btntext_blue;
public static int iosBtnColor = R.color.text_title_11;
@ColorRes
public static int lvItemTxtColor = R.color.text_item_33;
@ColorRes
......
......@@ -221,10 +221,14 @@ public class DialogUIUtils {
}
public static BuildBean showAlertPassword(Activity activity, CharSequence title, CharSequence msg, CharSequence hint1, CharSequence hint2,
CharSequence firstTxt, CharSequence secondTxt, boolean isVertical, boolean cancleable, boolean outsideTouchable, DialogUIListener listener) {
return DialogAssigner.getInstance().assignAlertPassword(activity, title, msg, hint1, hint2, firstTxt, secondTxt, isVertical, cancleable, outsideTouchable, listener);
CharSequence sure, CharSequence cancel, boolean isVertical, boolean cancleable, boolean outsideTouchable, DialogUIListener listener) {
return DialogAssigner.getInstance().assignAlertPassword(activity, title, msg, hint1, hint2, sure, cancel, isVertical, cancleable, outsideTouchable, listener);
}
public static BuildBean showAlertPasswordCanVer(Activity activity, CharSequence title, CharSequence msg, CharSequence thirdTx, CharSequence hint1, CharSequence hint2,
CharSequence sure, CharSequence cancel, boolean isVertical, boolean cancleable, boolean outsideTouchable, DialogUIListener listener) {
return DialogAssigner.getInstance().assignAlertPasswordCanVer(activity, title, msg, thirdTx, hint1, hint2, sure, cancel, isVertical, cancleable, outsideTouchable, listener);
}
/**
* 短时间中下位置显示。线程安全,可以在非UI线程调用。
*/
......
......@@ -129,33 +129,35 @@ object ActivationHelper {
}
}
private suspend fun probation(context: Context): Boolean {
val map: MutableMap<String?, String?> = HashMap()
val currentTime = getCurrentTimeByNet()
if (currentTime == -1L) {
return false
}
val endTime = currentTime + PROBATION_TIME
map[SP_IS_ACTIVE] = DesUtil.encrypt(PROBATION)
map[SP_TRIAL_ACTIVE_END_TIME] = DesUtil.encrypt(endTime.toString())
map[SP_ACTIVE_CODE] = DesUtil.encrypt("无")
map[SP_TRIAL_ACTIVE_START_TIME] = DesUtil.encrypt(currentTime.toString())
try {
val fileDir = File(FILE_PATH + context.packageName)
if (!fileDir.exists()) {
fileDir.mkdirs()
private suspend fun probation(context: Context): Boolean{
return withContext(Dispatchers.IO){
val map: MutableMap<String?, String?> = HashMap()
val currentTime = getCurrentTimeByNet()
if (currentTime == -1L) {
return@withContext false
}
val file = File(fileDir, PROBATION_FILE_NAME)
if (!file.exists()) {
file.createNewFile()
val endTime = currentTime + PROBATION_TIME
map[SP_IS_ACTIVE] = DesUtil.encrypt(PROBATION)
map[SP_TRIAL_ACTIVE_END_TIME] = DesUtil.encrypt(endTime.toString())
map[SP_ACTIVE_CODE] = DesUtil.encrypt("无")
map[SP_TRIAL_ACTIVE_START_TIME] = DesUtil.encrypt(currentTime.toString())
try {
val fileDir = File(FILE_PATH + context.packageName)
if (!fileDir.exists()) {
fileDir.mkdirs()
}
val file = File(fileDir, PROBATION_FILE_NAME)
if (!file.exists()) {
file.createNewFile()
}
XmlUtils.writeMapXml(map, FileOutputStream(file))
} catch (e: XmlPullParserException) {
return@withContext false
} catch (e: IOException) {
return@withContext false
}
XmlUtils.writeMapXml(map, FileOutputStream(file))
} catch (e: XmlPullParserException) {
return false
} catch (e: IOException) {
return false
return@withContext true
}
return true
}
private fun getValueByXmlKey(context: Context, key: String, fileName: String): String {
......
......@@ -21,7 +21,7 @@ import org.greenrobot.eventbus.EventBus
* Created by cyw_m on 2018/4/6.
*/
@SuppressLint("StaticFieldLeak")
object DialogManager{
object DialogManager {
private var mSimpleDialog: SimpleDialog? = null
/**
* 安装中间件弹窗
......@@ -69,7 +69,7 @@ object DialogManager{
}
fun showActivateLoseDialog(activity: Activity?, title: String?, content: String?, listener: MessageListener) {
DialogUIUtils.showAlert(activity, title, content, "", "", "确定", "输入激活码", false, false, false, object : DialogUIListener() {
DialogUIUtils.showAlert(activity, title, content, "", "", "确定", "", false, false, false, object : DialogUIListener() {
override fun onPositive() {
listener.onPositive()
}
......@@ -80,8 +80,26 @@ object DialogManager{
}).show()
}
fun showPwdDialog(activity: Activity?, title: String?, listener: PwdListener) {
val buildBean = DialogUIUtils.showAlertPassword(activity, title, "", "", "", "确定", "取消", false, false, false, object : DialogUIListener() {
fun showPwdDialog(activity: Activity?, title: String?, listener: PwdCanVerListener) {
val buildBean = DialogUIUtils.showAlertPasswordCanVer(activity, title, "", "忘记密码", "", "", "确定", "取消", false, false, false, object : DialogUIListener() {
override fun onPositive(view: View) {
listener.onPositive(view)
}
override fun onPositive() {}
override fun onNegative() {
listener.onNegative()
}
override fun onNeutral() {
listener.onNeutral()
}
})
buildBean.show()
}
fun showEncryptedVerDialog(activity: Activity?, title: String?, question: String?, listener: PwdListener) {
val buildBean = DialogUIUtils.showAlert(activity, title, question, "答案", "", "确定", "切换问题", false, false, false, object : DialogUIListener() {
override fun onPositive(view: View) {
listener.onPositive(view)
}
......@@ -103,4 +121,10 @@ object DialogManager{
fun onPositive(view: View?)
fun onNegative()
}
interface PwdCanVerListener {
fun onPositive(view: View?)
fun onNegative()
fun onNeutral()
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.dialog.SwitcherDialog
import com.secspace.lib.common.utils.IntentUtil
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.closeAccessibility
import kotlinx.coroutines.*
class ExitService : Service() {
......@@ -30,6 +31,7 @@ class ExitService : Service() {
LoadingDialog.getInstance(mAppContext).show("切换中")
GlobalScope.launch(Dispatchers.IO) {
closeAccessibility(mAppContext as ExitService)
Prefs.setMdmInitializedWhenEnter(mAppContext, false)
WorkManager.exit(mAppContext)
delay(1500)
......
......@@ -8,15 +8,12 @@ import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.os.Build.VERSION_CODES
import android.util.Log
import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.env.Packages.PkgSecSpace
import com.secspace.lib.common.utils.*
import com.secspace.lib.common.utils.Package.ComponentNames.COMPONENT_UPDATE_SYSTEM
import com.secspace.lib.common.utils.Package.ComponentNames.EnterprisePrivacySettingsActivity
import com.secspace.mdmengine.api.manager.MdmFactoryManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.*
......@@ -25,6 +22,10 @@ object SwitchInMdm: ISwitch() {
private val TAG = "SwitchInMdm"
override suspend fun init(context: Context) {
this.context = context
if(MdmFactoryManager.getInstance().deviceApplicationManager == null){
return
}
Prefs.setInSpace(context, true)
MdmUtils.setDefaultLauncher(context)
val mdmFactoryManager = DpmHelper.getInstance(context).getmMdmFactoryManager()
......@@ -74,8 +75,8 @@ object SwitchInMdm: ISwitch() {
}
}
fun addDisallowedRunningApp(context: Context) {
GlobalScope.launch(Dispatchers.IO) {
suspend fun addDisallowedRunningApp(context: Context) {
withContext(Dispatchers.IO) {
val mdmFactoryManager = DpmHelper.getInstance(context).getmMdmFactoryManager()
val pkgsList = Prefs.getUserShowAppPkgs(context)
val resolveInfos: List<ResolveInfo> = context.packageManager.queryIntentActivities(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER), 0)
......@@ -89,6 +90,8 @@ object SwitchInMdm: ISwitch() {
items.add(it.activityInfo.packageName)
}
Log.e(TAG, "ALL:${items}")
val oldApps = mdmFactoryManager.deviceApplicationManager.disallowedRunningApp
mdmFactoryManager.deviceApplicationManager.removeDisallowedRunningApp(oldApps)
items.filter {
!pkgsList.contains(it)
}.let {
......
......@@ -123,6 +123,7 @@ object SwitchOutMdm: ISwitch() {
override suspend fun init(context: Context) {
this.context = context
Prefs.setInSpace(context, false)
recover(context)
MdmUtils.clearDefaultLauncher(context)
removeDisallowedRunningApp()
......
......@@ -7,15 +7,21 @@ import android.os.Build
import android.os.Handler
import android.os.Looper
import android.os.SystemClock
import com.secspace.lib.common.R
import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.env.Packages.PkgSecSpace
import com.secspace.lib.common.env.SEnvironment
import com.secspace.lib.common.function.ActivationHelper.ActivationListener
import com.secspace.lib.common.function.ActivationHelper.active
import com.secspace.lib.common.function.DialogManager.MessageListener
import com.secspace.lib.common.function.DialogManager.showActivateLoseDialog
import com.secspace.lib.common.utils.*
import com.secspace.log.Log
import com.secspace.mdmengine.api.manager.MdmFactoryManager
import com.skr.activation.network.linstener.CheckActiveStatusListener
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
......@@ -67,14 +73,34 @@ object WorkManager {
}
LoadingDialog.getInstance(launcher).show("切换中")
GlobalScope.launch(Dispatchers.IO) {
openAccessibility(launcher)
SwitchInMdm.onInit(launcher)
checkLocalUpdateFile() //检查本地更新文件
activate(launcher)
// checkLocalUpdateFile() //检查本地更新文件
delay(5000)
ActivationHelper.checkActivate(launcher, EduCheckActiveStatusListener(launcher))
}
isChecksCompleted = true
Prefs.setMdmInitializedWhenEnter(mContext, true)
}
fun activate(activity: Activity) {
active(activity, object : ActivationListener {
override fun activationFailed() {
showActivateLoseDialog(activity, activity.getString(R.string.common_remind)
, activity.getString(R.string.dialog_tip_activate_lose), object : MessageListener {
override fun onPositive() {
IntentUtil.startExitService(activity)
}
override fun onNegative() {}
})
}
override fun activated() {}
}, false)
}
fun exit(context: Context?) {
GlobalScope.launch(Dispatchers.IO) {
context?.let { SwitchOutMdm.onExit(it) }
......@@ -152,7 +178,7 @@ object WorkManager {
install(path)
}
fun removeForbidden(context: Context){
fun removeForbidden(context: Context) {
Prefs.setMdmInitializedWhenEnter(context, false)
GlobalScope.launch(Dispatchers.IO) {
SwitchOutMdm.onExit(context)
......
package com.secspace.lib.common.function.database
import android.arch.persistence.db.SupportSQLiteDatabase
import android.arch.persistence.room.Room
import android.arch.persistence.room.migration.Migration
import android.content.Context
import com.secspace.lib.common.function.database.dao.UseAppDao
import com.secspace.lib.common.function.database.dao.UseTimeDao
import com.secspace.lib.common.function.database.db.EduDatabase
class DatabaseManager private constructor(val context: Context) {
private var mEduDatabase: EduDatabase? = null
private var mUseAppDao: UseAppDao? = null
private var mUseTimeDao: UseTimeDao? = null
fun init() {
// mEduDatabase = RoomCipher.databaseBuilder(context, EduDatabase::class.java, "edu_space.db", "skr123")
// .fallbackToDestructiveMigration()
// .allowMainThreadQueries()
// .build()
mEduDatabase = Room.databaseBuilder(context, EduDatabase::class.java, "edu_space.db")
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build()
mUseAppDao = mEduDatabase?.useAppDao()
mUseTimeDao = mEduDatabase?.useTimeDao()
}
fun getEduDatabase(): EduDatabase? {
return mEduDatabase
}
fun getUseAppDao(): UseAppDao? {
return mUseAppDao
}
fun getUseTimeDao(): UseTimeDao? {
return mUseTimeDao
}
/**
* 数据库版本 1->2 user表格新增了age列
*/
private val MIGRATION_1_2: Migration = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
// database.execSQL("ALTER TABLE target_app ADD COLUMN age integer")
}
}
/**
* 数据库版本 2->3 新增book表格
*/
private val MIGRATION_2_3: Migration = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
// database.execSQL(
// "CREATE TABLE IF NOT EXISTS `book` (`uid` INTEGER PRIMARY KEY autoincrement, `name` TEXT , `userId` INTEGER, 'time' INTEGER)")
}
}
companion object {
@Volatile
private var instance: DatabaseManager? = null
fun getInstance(context: Context): DatabaseManager {
if (instance == null) {
synchronized(DatabaseManager::class) {
if (instance == null) {
instance = DatabaseManager(context.applicationContext)
}
}
}
return instance!!
}
}
}
\ No newline at end of file
package com.secspace.lib.common.function.database.dao;
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;
import com.secspace.lib.common.function.model.UseApp;
import java.util.List;
@Dao
public interface UseAppDao {
@Query("select * from use_app")
List<UseApp> queryAll();
@Query("select * from use_app where upload_time = 0")
List<UseApp> queryNoupload();
@Query("select * from use_app where app_package = :packageName")
UseApp queryByPkg(String packageName);
@Insert
long insertTargetApp(UseApp targetApp);
@Insert
List<Long> insertTargetApps(List<UseApp> targetApps);
@Update
void updateTargetApp(UseApp targetApp);
@Update
void updateTargetApps(List<UseApp> targetApps);
}
package com.secspace.lib.common.function.database.dao;
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;
import com.secspace.lib.common.function.model.UseTime;
import java.util.List;
@Dao
public interface UseTimeDao {
@Query("select * from use_time")
List<UseTime> queryAll();
@Query("select * from use_time where (start_time >= :startTime AND start_time <= :endTime AND end_time >= :endTime)" +
" OR (end_time >= :startTime AND end_time <= :endTime AND start_time >= :startTime)" +
" OR (start_time <= :startTime AND end_time >= :endTime)" +
" OR (start_time >= :startTime AND end_time <= :endTime)")
List<UseTime> queryByTime(long startTime, long endTime);
@Query("select * from use_time where (app_package = :pkg) and ((start_time >= :startTime AND start_time <= :endTime AND end_time >= :endTime)" +
" OR (end_time >= :startTime AND end_time <= :endTime AND start_time >= :startTime)" +
" OR (start_time <= :startTime AND end_time >= :endTime)" +
" OR (start_time >= :startTime AND end_time <= :endTime))")
List<UseTime> queryByTimePkg(long startTime, long endTime, String pkg);
@Query("select * from use_time where upload_time = 0")
List<UseTime> queryNoupload();
@Insert
long insertUseTime(UseTime useTime);
@Insert
List<Long> insertUseTimes(List<UseTime> useTimes);
@Update
void updateUseTime(UseTime useTime);
@Update
void updateUseTimes(List<UseTime> useTimes);
}
package com.secspace.lib.common.function.database.db;
import android.arch.persistence.room.Database;
import android.arch.persistence.room.RoomDatabase;
import com.secspace.lib.common.function.database.dao.UseAppDao;
import com.secspace.lib.common.function.database.dao.UseTimeDao;
import com.secspace.lib.common.function.model.UseApp;
import com.secspace.lib.common.function.model.UseTime;
@Database(entities = {UseApp.class, UseTime.class}, exportSchema = false, version = 1)
public abstract class EduDatabase extends RoomDatabase {
public abstract UseAppDao useAppDao();
public abstract UseTimeDao useTimeDao();
}
package com.secspace.lib.common.function.model
data class Encrypted(var question1: String, var answer1: String, var question2: String, var answer2: String)
\ No newline at end of file
package com.secspace.lib.common.function.model;
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.Index;
import android.support.annotation.NonNull;
import java.io.Serializable;
@Entity(tableName = "use_app", primaryKeys = {"app_package"}, indices = {@Index("app_package")})
public class UseApp implements Serializable {
@ColumnInfo(name = "app_package")
private @NonNull String appPackage;
@ColumnInfo(name = "app_name")
private String appName;
@ColumnInfo(name = "icon")
private String icon;
@ColumnInfo(name = "upload_time")
private Long uploadTime;
public String getAppPackage() {
return appPackage;
}
public void setAppPackage(String appPackage) {
this.appPackage = appPackage;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public Long getUploadTime() {
return uploadTime;
}
public void setUploadTime(Long uploadTime) {
this.uploadTime = uploadTime;
}
}
package com.secspace.lib.common.function.model;
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
@Entity(tableName = "use_time")
public class UseTime implements Serializable {
@PrimaryKey(autoGenerate = true)
private Integer id;
@ColumnInfo(name = "start_time")
private Long useStartTime;
@ColumnInfo(name = "end_time")
private Long useEndTime;
@ColumnInfo(name = "upload_time")
private Long uploadTime;
@ColumnInfo(name = "app_package")
private @NotNull
String appPackage;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Long getUseStartTime() {
return useStartTime;
}
public void setUseStartTime(Long useStartTime) {
this.useStartTime = useStartTime;
}
public Long getUseEndTime() {
return useEndTime;
}
public void setUseEndTime(Long useEndTime) {
this.useEndTime = useEndTime;
}
public Long getUploadTime() {
return uploadTime;
}
public void setUploadTime(Long uploadTime) {
this.uploadTime = uploadTime;
}
@NotNull
public String getAppPackage() {
return appPackage;
}
public void setAppPackage(@NotNull String appPackage) {
this.appPackage = appPackage;
}
}
package com.secspace.lib.common.function.service
import android.accessibilityservice.AccessibilityService
import android.annotation.SuppressLint
import android.content.Context
import android.view.accessibility.AccessibilityEvent
import com.secspace.lib.common.utils.Prefs
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
/**
* Created by bxy on 2020-04-01
*/
class EduAccessibilityService : AccessibilityService() {
private var pkgCache = arrayListOf("EduAccessibilityService")
private var isWait = false
private lateinit var context:Context
@SuppressLint("StringFormatInvalid")
override fun onAccessibilityEvent(event: AccessibilityEvent) {
context = this.applicationContext
val pkg = event.packageName as String
// 过滤不需要关注的包名
pkgCache[0] = pkg
if (isWait) {
return
}
GlobalScope.launch(Dispatchers.IO) {
while (Prefs.isInSpace(context)) {
isWait = true
UseAppManager.getInstance(context).disposePackageName(pkgCache[0])
delay(60 * 1000)
isWait = false
}
}
}
override fun onInterrupt() {}
override fun onServiceConnected() {
super.onServiceConnected()
}
override fun onDestroy() {
super.onDestroy()
}
companion object {
private const val TAG = "EduAccessibilityService"
}
}
\ No newline at end of file
package com.secspace.lib.common.function.service
import android.content.Context
import android.util.Log
import com.secspace.lib.common.function.database.DatabaseManager
import com.secspace.lib.common.function.model.UseApp
import com.secspace.lib.common.function.model.UseTime
import com.secspace.lib.common.utils.getApplicationIcon
import com.secspace.lib.common.utils.getApplicationName
class UseAppManager private constructor(val context: Context) {
private val TAG = "UseAppManager"
private val pkgQueue: ArrayList<UseTime> = arrayListOf()
private var ignorePkg = arrayListOf("android", "com.eduspace.mobilemanager", "com.vmall.client", "com.android.systemui")
suspend fun disposePackageName(packageName: String) {
val useTime = UseTime()
useTime.appPackage = packageName
useTime.useStartTime = System.currentTimeMillis()
useTime.uploadTime = 0
// 是否是应该被忽略的应用
if(ignorePkg.contains(packageName)){
if (pkgQueue.isEmpty()) {
return
}
if(pkgQueue.size == 1){
val existPkg = pkgQueue[0]
// 本次应用与上次应用一样,清空缓存
if (existPkg.appPackage == useTime.appPackage){
pkgQueue.clear()
return
}
// 本次应用与上次不一样,计算时间,如果大于65s,则将赋予上次应用结束时间,存入数据库,并将上次应用移除
Log.i(TAG, "上次时间 ${existPkg.useStartTime}, 本次时间 ${useTime.useStartTime} 差: ${useTime.useStartTime - existPkg.useStartTime}")
if (useTime.useStartTime - existPkg.useStartTime >= 65 * 1000){
// 给应用赋予结束时间
existPkg.useEndTime = System.currentTimeMillis()
Log.i(TAG, "insertUseTime:${DatabaseManager.getInstance(context).getUseTimeDao()}")
// 存入数据库
val result = DatabaseManager.getInstance(context).getUseTimeDao()?.insertUseTime(existPkg)
Log.i(TAG, "insertUseTime result:$result")
pkgQueue.clear()
}
}
return
}
// 第一次打开某应用,将其放到第一位
if (pkgQueue.isEmpty()) {
Log.i(TAG, "pkgQueue is Empty")
pkgQueue.add(0, useTime)
return
}
if(pkgQueue.size == 1){
// 取出上一轮存储的应用
val existPkg = pkgQueue[0]
// 本次应用与上次应用一样,什么也不做
Log.i(TAG, "上次应用 ${existPkg.appPackage}, 本次应用 ${useTime.appPackage}")
if (existPkg.appPackage == useTime.appPackage){
return
}
// 本次应用与上次不一样,计算时间,如果大于65s,则将赋予上次应用结束时间,存入数据库,并将上次应用移除
Log.i(TAG, "上次时间 ${existPkg.useStartTime}, 本次时间 ${useTime.useStartTime} 差: ${useTime.useStartTime - existPkg.useStartTime}")
if (useTime.useStartTime - existPkg.useStartTime >= 65 * 1000){
// 给应用赋予结束时间
existPkg.useEndTime = System.currentTimeMillis()
// 存入数据库
DatabaseManager.getInstance(context).getUseTimeDao()?.insertUseTime(existPkg)
}
// 无论是否存数据库,都要替换掉
pkgQueue[0] = useTime
return
}
}
private fun disposeApp(packageName: String){
val appName = getApplicationName(context, packageName)
val icon = getApplicationIcon(context, packageName)
val useApp = UseApp()
}
companion object {
@Volatile
private var instance: UseAppManager? = null
fun getInstance(context: Context): UseAppManager {
if (instance == null) {
synchronized(UseAppManager::class) {
if (instance == null) {
instance = UseAppManager(context.applicationContext)
}
}
}
return instance!!
}
}
}
\ No newline at end of file
package com.secspace.lib.common.function.view;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 应用使用时间进度条
*/
public class TimeProgress extends View {
private Paint bgPaint;
private Paint textPaint;
private int mWidth;
private int mHeight;
private List<Integer> times = new ArrayList<>();
private List<Integer> paintColors = new ArrayList<>();
private float allTime = 0F;
private float animationValue;
private float cylindricalStartLeft;
private float indicatorMargin;
/**
* 进度动画
*/
private ValueAnimator progressAnimator;
/**
* 动画执行时间
*/
private int duration = 1000;
/**
* 动画延时启动时间
*/
private int startDelay = 500;
/**
* 进度条画笔的宽度
*/
private int progressPaintWidth;
private int progressHeight;
private int textHeight;
/**
* 柱状图距提示文字的高度
*/
private int tipsMargin;
private int textSize;
/**
* 进度条背景颜色
*/
private int bgColor = 0xFFf66b12;
/**
* 进度条颜色
*/
private int progressColor = 0xFFf66b12;
private RectF bgRectF = new RectF();
/**
* 圆角矩形的圆角半径
*/
private int roundRectRadius;
private int paddingLeft;
private int paddingTop;
private int paddingRight;
private int paddingBottom;
public TimeProgress(Context context) {
this(context, null);
}
public TimeProgress(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public TimeProgress(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
initPaint();
initTextPaint();
times.add(10);
times.add(20);
times.add(80);
times.add(50);
Comparator<Integer> reverseComparator = Collections.reverseOrder();
Collections.sort(times, reverseComparator);
paintColors.add(0xFF13A6FA);
paintColors.add(0xFF9BFA13);
paintColors.add(0xFFFAB613);
paintColors.add(0xFFE5E5E5);
allTime = 160;
}
/**
* 初始化画笔宽度及view大小
*/
private void init() {
progressPaintWidth = dp2px(5);
progressHeight = dp2px(15);
roundRectRadius = dp2px(3);
indicatorMargin = dp2px(1);
tipsMargin = progressHeight;
textSize = dp2px(12);
}
private void initPaint() {
bgPaint = getPaint(progressPaintWidth, bgColor, Paint.Style.FILL);
}
/**
* 初始化文字画笔
*/
private void initTextPaint() {
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(progressColor);
textPaint.setTextSize(textSize);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setAntiAlias(true);
}
private int getTextHeight(String text, Paint paint) {
Rect rect = new Rect();
paint.getTextBounds(text, 0, text.length(), rect);
return rect.height();
}
private int getTextWidth(String text, Paint paint) {
Rect rect = new Rect();
paint.getTextBounds(text, 0, text.length(), rect);
return rect.width();
}
/**
* 统一处理paint
*
* @param strokeWidth 画笔宽度
* @param color 颜色
* @param style 风格
* @return paint
*/
private Paint getPaint(int strokeWidth, int color, Paint.Style style) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(strokeWidth);
paint.setColor(color);
paint.setAntiAlias(true);
paint.setStyle(style);
return paint;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
parameterAssignment();
setMeasuredDimension(measureWidth(widthMode, width), measureHeight(heightMode, height));
}
/**
* 测量宽度
*
* @param mode
* @param width
* @return
*/
private int measureWidth(int mode, int width) {
switch (mode) {
case MeasureSpec.UNSPECIFIED:
case MeasureSpec.AT_MOST:
break;
case MeasureSpec.EXACTLY:
mWidth = width;
break;
}
return mWidth;
}
public void setWidth(int width) {
mWidth = width;
}
/**
* 测量高度
*
* @param mode
* @param height
* @return
*/
private int measureHeight(int mode, int height) {
switch (mode) {
case MeasureSpec.UNSPECIFIED:
case MeasureSpec.AT_MOST:
textHeight = getTextHeight("measureHeight", textPaint);
mHeight = progressPaintWidth + progressHeight + tipsMargin + textHeight * 2 + paddingTop + paddingBottom;
break;
case MeasureSpec.EXACTLY:
mHeight = height;
break;
}
return mHeight;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 初始化width,padding等参数
parameterAssignment();
// 绘制横向柱状图
drawHorizontalCylindrical(canvas);
drawIndicator(canvas);
}
private void drawIndicator(Canvas canvas) {
// 平分后每份的长度
float share = mWidth / times.size();
float x, y;
for (int i = 0; i < times.size(); i++) {
int time = times.get(i);
String text = time + "分钟";
textPaint.setColor(0xff000000);
bgPaint.setColor(paintColors.get(i));
float textHeight = getTextHeight(text, textPaint);
float textWidth = getTextWidth(text, textPaint);
x = share * i + share / 2;
if (i == 0) {
x = x + paddingLeft;
}
y = textHeight + tipsMargin + progressHeight + paddingLeft;
canvas.drawRect(x - textWidth, y - textHeight + indicatorMargin, x - textWidth + textHeight, y + indicatorMargin, bgPaint);
canvas.drawText(text, x, y, textPaint);
canvas.drawText(text, x, y + textHeight + tipsMargin / 3, textPaint);
}
}
private void drawHorizontalCylindrical(Canvas canvas) {
for (int i = 0; i < times.size(); i++) {
int time = times.get(i);
float rate = time / allTime;
if (i == 0) {
bgRectF.left = cylindricalStartLeft + paddingLeft;
} else {
bgRectF.left = cylindricalStartLeft + 10;
}
bgPaint.setColor(paintColors.get(i));
bgRectF.top = paddingTop;
bgRectF.right = mWidth * rate * animationValue / 100 + cylindricalStartLeft;
bgRectF.bottom = bgRectF.top + progressHeight;
if (i == times.size() - 1) {
bgRectF.right = mWidth * rate * animationValue / 100 - paddingRight + cylindricalStartLeft;
}
cylindricalStartLeft = bgRectF.right;
canvas.drawRoundRect(bgRectF, roundRectRadius, roundRectRadius, bgPaint);
}
cylindricalStartLeft = 0;
}
public void initAnimation() {
progressAnimator = ValueAnimator.ofFloat(0, 100);
progressAnimator.setDuration(duration);
progressAnimator.setStartDelay(startDelay);
progressAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
animationValue = (float) valueAnimator.getAnimatedValue();
invalidate();
}
});
if (!progressAnimator.isStarted()) {
progressAnimator.start();
}
}
private void parameterAssignment() {
mWidth = getMeasuredWidth();
paddingLeft = getPaddingLeft();
paddingTop = getPaddingTop();
paddingRight = getPaddingRight();
paddingBottom = getPaddingBottom();
}
/**
* 格式化数字(保留一位小数)
*
* @param money
* @return
*/
public static String formatNum(int money) {
DecimalFormat format = new DecimalFormat("0");
return format.format(money);
}
/**
* dp 2 px
*
* @param dpVal
*/
protected int dp2px(int dpVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dpVal, getResources().getDisplayMetrics());
}
/**
* sp 2 px
*
* @param spVal
* @return
*/
protected int sp2px(int spVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
spVal, getResources().getDisplayMetrics());
}
}
......@@ -147,7 +147,7 @@ public class CheckUpdateCore {
.server(BuildConfig.UPDATE_SERVER)
.name(BuildConfig.UPDATE_FLAG)
.companyId(BuildConfig.COMPANY_ID)
.showDownloadDialog(true)
.showDownloadDialog(false)
.showDownloadNotification(false)
.appInstallPolicy(AppInstallPolicy.SILENT_INSTALL)
.build();
......
......@@ -6,6 +6,8 @@ import android.util.ArrayMap;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
......@@ -45,4 +47,22 @@ public class JsonUtil {
return gson.fromJson(json, new TypeToken<ArrayMap>() {
}.getType());
}
// public static <T>T json2Class(String json) {
// if (TextUtils.isEmpty(json)) {
// return null;
// }
// Gson gson = new Gson();
// Type type = ((ParameterizedType) T.class.getGenericSuperclass()).getActualTypeArguments()[0];
// return gson.fromJson(json, new TypeToken<T>() {
// }.getType());
// }
public static <T> T fromJson(String result, Class<T> classOfT) {
if (result == null) {
return null;
}
Gson gson = new Gson();
return gson.fromJson(result, classOfT);
}
}
package com.secspace.lib.common.utils
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import android.provider.Settings
import com.secspace.lib.common.function.service.EduAccessibilityService
import com.skr.activation.utils.DesUtil
fun decrypt(strMi: String): String {
return DesUtil.decrypt(strMi)
}
fun encrypt(strMi: String): String {
return DesUtil.encrypt(strMi)
}
fun openAccessibility(ctx: Context) {
try {
Settings.Secure.putString(ctx.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, ctx.packageName + "/" + EduAccessibilityService::class.java.name)
Settings.Secure.putString(ctx.contentResolver,
Settings.Secure.ACCESSIBILITY_ENABLED, "1")
} catch (e: Exception) {
e.printStackTrace()
}
}
fun closeAccessibility(ctx: Context) {
try {
Settings.Secure.putString(ctx.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "")
} catch (e: Exception) {
e.printStackTrace()
}
}
fun getApplicationName(context: Context?, packageName: String): String {
val pm = context?.packageManager
return try {
pm?.getApplicationLabel(pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)).toString()
} catch (e: java.lang.Exception) {
pm?.getApplicationInfo(packageName, PackageManager.GET_META_DATA)?.loadLabel(pm).toString()
}
}
fun getApplicationIcon(context: Context?, packageName: String): Drawable? {
val pm = context?.packageManager
return try {
pm?.getApplicationIcon(pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA))
} catch (e: java.lang.Exception) {
pm?.getApplicationInfo(packageName, PackageManager.GET_META_DATA)?.loadIcon(pm)
}
}
......@@ -18,8 +18,7 @@
android:paddingTop="12dp"
android:text=""
android:textColor="@color/text_title_11"
android:textSize="@dimen/dialogui_title_txt_size"
android:textStyle="bold"/>
android:textSize="@dimen/dialogui_title_txt_size"/>
<LinearLayout
......@@ -75,7 +74,21 @@
android:textCursorDrawable="@drawable/dialogui_shape_et_cursor"
android:textSize="@dimen/dialogui_input_txt_size"/>
<TextView
android:id="@+id/tv_third"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginTop="-15dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="30dp"
android:visibility="gone"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="忘记密码"
android:layout_gravity="center_vertical|right"
android:gravity="center"
android:textColor="@color/ios_btntext_blue"
android:textSize="@dimen/dialogui_input_txt_size"/>
</LinearLayout>
<View
......
......@@ -8,9 +8,8 @@
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/title_permissions"
android:textColor="@color/btn_exit"
android:textSize="16sp" />
......
......@@ -39,5 +39,6 @@
<string name="close_btn">关闭</string>
<string name="btn_input_code">输入激活码</string>
<string name="dialog_tip_activate_lose">您的激活已失效,如有疑问请致电4008265936</string>
<string name="dialog_tip_activate_lose">网络异常,请确认网络后重新进入</string>
<string name="accessibility_tips">为了确保此应用正常运行,需要开启辅助功能</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags=""
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_tips"
android:notificationTimeout="100" />
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment