diff --git a/qpysdk/src/main/java/org/qpython/qpysdk/QPyConstants.java b/qpysdk/src/main/java/org/qpython/qpysdk/QPyConstants.java
index fa8e8d374fec25e84a21fa17e8bf38d53c8da8ca..a78709067bc8b54b723a0a172c3a933fd82e4a61 100644
--- a/qpysdk/src/main/java/org/qpython/qpysdk/QPyConstants.java
+++ b/qpysdk/src/main/java/org/qpython/qpysdk/QPyConstants.java
@@ -40,7 +40,7 @@ public interface QPyConstants extends BASE_CONF {
// String ABSOLUTE_LOG = ABSOLUTE_PATH + "/log/last.log";
String PYTHON_2 = "2.x";
- String PyVer = "3.10";
+ String PyVer = "3.11";
String QPYC3 = "https://dl.qpy.io/py3.json";
String QPYC2COMPATIBLE = "https://dl.qpy.io/py2compatible.json";
diff --git a/qpython/build.gradle b/qpython/build.gradle
index 69ad017b1db90cf9ed4e22ca89b3b5ac1242d345..c78d86e18e74362e30d8f073ac549abf8a97d3b4 100644
--- a/qpython/build.gradle
+++ b/qpython/build.gradle
@@ -15,8 +15,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 322
- versionName "3.2.2"
+ versionCode 323
+ versionName "3.2.3"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
diff --git a/qpython/src/main/AndroidManifest.xml b/qpython/src/main/AndroidManifest.xml
index 94f59fec09cf6460fe8af76326959b845434be87..2d97480baf66112b8a1850826ad1479a7175c72a 100644
--- a/qpython/src/main/AndroidManifest.xml
+++ b/qpython/src/main/AndroidManifest.xml
@@ -423,7 +423,7 @@
android:configChanges="keyboardHidden|orientation|screenSize"/>
-
+
diff --git a/qpython/src/main/assets/resource3.mp3 b/qpython/src/main/assets/resource3.mp3
index 3d89b16567591539c087261217eae7a5dd07953c..25061f0039c3a7aebf33fb05406d3228885af3f3 100644
Binary files a/qpython/src/main/assets/resource3.mp3 and b/qpython/src/main/assets/resource3.mp3 differ
diff --git a/qpython/src/main/java/org/qpython/qpy/main/activity/AboutActivity.java b/qpython/src/main/java/org/qpython/qpy/main/activity/AboutActivity.java
index 5bff25057232911af98461ef04f3a45ed3078bfb..83f9cc57a7d18651e702abeba9c36e778635e1c3 100644
--- a/qpython/src/main/java/org/qpython/qpy/main/activity/AboutActivity.java
+++ b/qpython/src/main/java/org/qpython/qpy/main/activity/AboutActivity.java
@@ -21,6 +21,7 @@ import org.qpython.qpy.main.app.App;
import org.qpython.qpy.main.server.MySubscriber;
import org.qpython.qpy.main.server.model.UpdateModel;
import org.qpython.qpy.texteditor.androidlib.common.MiscUtils;
+import org.qpython.qpysdk.QPyConstants;
/**
@@ -45,6 +46,9 @@ public class AboutActivity extends BaseActivity {
PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
binding.version.setText(getString(R.string.v_version, version));
+ binding.description.setText(
+ getString(R.string.qpy_description)
+ .replace("PyVer", QPyConstants.PyVer));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
diff --git a/qpython/src/main/java/org/qpython/qpy/main/activity/FloatViewActivity.java b/qpython/src/main/java/org/qpython/qpy/main/activity/FloatViewActivity.java
index f3f5a63da26ef06728988d2f0d9e924a283378f2..ffee11a5a0117dd6f16f9fd819d300434d141b64 100644
--- a/qpython/src/main/java/org/qpython/qpy/main/activity/FloatViewActivity.java
+++ b/qpython/src/main/java/org/qpython/qpy/main/activity/FloatViewActivity.java
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
-import android.icu.text.SimpleDateFormat;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -23,7 +22,6 @@ import org.qpython.qsl4a.qsl4a.facade.FloatViewFacade;
import org.qpython.qsl4a.qsl4a.util.HtmlUtil;
import java.util.ArrayList;
-import java.util.Date;
public class FloatViewActivity extends Activity
{
@@ -32,13 +30,16 @@ public class FloatViewActivity extends Activity
//参数数组
static final ArrayList params = FloatViewFacade.params;
//时间数组
- static final ArrayList times = FloatViewFacade.times;
+ static final ArrayList times = FloatViewFacade.times;
//操作类型数组
static final ArrayList operations = FloatViewFacade.operations;
static WindowManager windowManager;
static DisplayMetrics displayMetrics;
//public static Handler handler;
+ private static final int DEFAULT_FLAG =
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE ;
+
@SuppressLint({"SimpleDateFormat", "HandlerLeak"})
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -64,9 +65,9 @@ public class FloatViewActivity extends Activity
}
@SuppressLint("ClickableViewAccessibility")
- public void floatView(Intent intent){
+ public void floatView(final Intent intent){
//Intent intent = getIntent();
- if (intent==null) intent = new Intent();
+ //if (intent==null) intent = new Intent();
WindowManager.LayoutParams layoutParams = null;
int index;
//悬浮按钮
@@ -86,19 +87,23 @@ public class FloatViewActivity extends Activity
//悬浮窗文字颜色 格式:aarrggbb或rrggbb
int textColor=colorToInt(intent.getStringExtra("textColor"),"ff000000");
//字体大小
- int textSize=intent.getIntExtra("textSize",10);
- //脚本路径
- final String script=intent.getStringExtra("script");
- //脚本参数
- final String arg=intent.getStringExtra("arg");
+ final int textSize=intent.getIntExtra("textSize",10);
+ //单击移除
final boolean clickRemove = intent.getBooleanExtra("clickRemove",true);
- //moveTaskToBack(true);
+ //脚本路径
+ final String script = intent.getStringExtra("script");
//索引参数
index = intent.getIntExtra("index",-1);
+
+ boolean reinit = false;
if (index>=0) {
try {
floatButton = buttons.get(index);
- layoutParams = params.get(index);
+ if(floatButton==null){
+ floatButton = new Button(this);
+ layoutParams = new WindowManager.LayoutParams();
+ reinit = true;
+ } else layoutParams = params.get(index);
} catch (Exception e){
index=-1;
}
@@ -108,8 +113,8 @@ public class FloatViewActivity extends Activity
layoutParams = new WindowManager.LayoutParams();
index = buttons.size();
}
- WindowManager.LayoutParams finalLayoutParams = layoutParams;
- floatButton.setOnTouchListener(new View.OnTouchListener() {
+ //WindowManager.LayoutParams finalLayoutParams = layoutParams;
+ floatButton.setOnTouchListener(new View.OnTouchListener() {
private int x;
private int y;
@@ -117,11 +122,7 @@ public class FloatViewActivity extends Activity
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public boolean onTouch(View view, MotionEvent event) {
- int index;
- for(index =0; index < buttons.size(); index++){
- if(view==buttons.get(index))
- break;
- }
+ final int index = (int) view.getTag();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = (int) event.getRawX();
@@ -133,23 +134,28 @@ public class FloatViewActivity extends Activity
boolean moved = nowX != x || nowY != y;
x = nowX;
y = nowY;
- finalLayoutParams.x = nowX - displayMetrics.widthPixels/2;
- finalLayoutParams.y = nowY - displayMetrics.heightPixels/2;
// 更新悬浮窗控件布局
if (moved) {
- windowManager.updateViewLayout(view, finalLayoutParams);
+ final WindowManager.LayoutParams layoutParams = params.get(index);
+ layoutParams.x = nowX - displayMetrics.widthPixels/2;
+ layoutParams.y = nowY - displayMetrics.heightPixels/2;
+ windowManager.updateViewLayout(view, layoutParams);
operations.set(index, "move");
} else {
operations.set(index, "click");
}
- times.set(index, getTime());
+ times.set(index, System.currentTimeMillis());
break;
case MotionEvent.ACTION_UP:
if (operations.get(index).equals("click")) {
- if(script!=null)
+ if(script!=null){
+ //脚本参数
+ //final String arg = intent.getStringExtra("arg");
ScriptExec.getInstance().playScript(FloatViewActivity.this,
- script, arg,false);
- if (clickRemove) FloatViewFacade.removeButton(index);
+ script, intent.getStringExtra("arg"),false);
+ }
+ if (clickRemove)
+ FloatViewFacade.removeButton(index);
FloatViewActivity.this.finish();
}
default:
@@ -167,8 +173,7 @@ public class FloatViewActivity extends Activity
floatButton.setTextSize(textSize);
layoutParams.type=WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;//下拉通知栏不可见
// 设置Window flag,锁定悬浮窗 ,若不设置,悬浮窗会占用整个屏幕的点击事件,FLAG_NOT_FOCUSABLE不设置会导致菜单键和返回键失效
- layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+ layoutParams.flags = intent.getIntExtra("flag",DEFAULT_FLAG);
layoutParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
//悬浮窗宽度
int width = intent.getIntExtra("width",300);
@@ -190,15 +195,23 @@ public class FloatViewActivity extends Activity
try {
if(index>=buttons.size()){
windowManager.addView(floatButton, layoutParams);
+ floatButton.setTag(buttons.size());
buttons.add(floatButton);
params.add(layoutParams);
- times.add(getTime());
+ times.add(System.currentTimeMillis());
operations.add("initial");
} else {
+ if(reinit) {
+ windowManager.addView(floatButton, layoutParams);
+ buttons.set(index,floatButton);
+ operations.set(index,"reinitial");
+ floatButton.setTag(index);
+ } else {
+ windowManager.updateViewLayout(floatButton, layoutParams);
+ operations.set(index,"modify");
+ }
params.set(index,layoutParams);
- times.set(index,getTime());
- windowManager.updateViewLayout(floatButton, layoutParams);
- operations.set(index,"modify");
+ times.set(index,System.currentTimeMillis());
}
} catch (Exception e) {
Toast.makeText(this,getString(R.string.float_view_permission)+"\n"+ e,Toast.LENGTH_LONG).show();
@@ -226,11 +239,5 @@ public class FloatViewActivity extends Activity
return (int) l;
}
}
-
- @SuppressLint({"SimpleDateFormat"})
- private String getTime(){
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- return new SimpleDateFormat("yyyyMMdd-HHmmss-SSS").format(new Date(System.currentTimeMillis()));
- } else return "Image_";
- }
+
}
diff --git a/qpython/src/main/java/org/qpython/qpy/main/activity/HomeMainActivity.java b/qpython/src/main/java/org/qpython/qpy/main/activity/HomeMainActivity.java
index 28b10ee951e7a664f321711cc5f3a7197f288553..ae43fa2cc6b6840a9d7fb210d7c78b57dbd5a01f 100644
--- a/qpython/src/main/java/org/qpython/qpy/main/activity/HomeMainActivity.java
+++ b/qpython/src/main/java/org/qpython/qpy/main/activity/HomeMainActivity.java
@@ -1,6 +1,7 @@
package org.qpython.qpy.main.activity;
import android.Manifest;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -10,6 +11,8 @@ import android.content.res.Resources;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
@@ -44,6 +47,8 @@ import org.qpython.qpy.utils.UpdateHelper;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.QPySDK;
import org.qpython.qpysdk.utils.FileHelper;
+import org.qpython.qsl4a.qsl4a.facade.AndroidFacade;
+import org.qpython.qsl4a.qsl4a.facade.QPyInterfaceFacade;
import java.io.File;
import java.util.Map;
@@ -157,6 +162,7 @@ public class HomeMainActivity extends BaseActivity {
private void startMain() {
initListener();
+ setHandler();
// startPyService();
Bus.getDefault().register(this);
init();
@@ -427,32 +433,32 @@ public class HomeMainActivity extends BaseActivity {
private void initQpySDK3() {
Log.d(TAG, "initQpySDK3");
NAction.setQPyInterpreter(HomeMainActivity.this, "3.x");
- initQPy(true);
+ initQPy();
initIcon();
}
private void initQpySDK() {
Log.d(TAG, "initQpySDK");
- initQPy(false);
+ initQPy();
NAction.setQPyInterpreter(HomeMainActivity.this, "2.x");
initIcon();
}
- private void initQPy(boolean py3) {
+ private void initQPy() {
new Thread(() -> {
QPySDK qpysdk = new QPySDK(HomeMainActivity.this, HomeMainActivity.this);
//这里会在切换qpy3的时候再次释放相关资源
//qpysdk.extractRes(py3?"private33":"private3", HomeMainActivity.this.getFilesDir(),true);
File externalStorage = new File(FileUtils.getPath(App.getContext()), "qpython");
- if (py3) {
- qpysdk.extractRes("resource3", HomeMainActivity.this.getFilesDir(),true);
- ScriptExec.getInstance().playScript(this,
+ //if (py3) {
+ qpysdk.extractRes("resource3", HomeMainActivity.this.getFilesDir(),true);
+ ScriptExec.getInstance().playScript(this,
"setup", null,false);
- } else {
+ /*} else {
qpysdk.extractRes("private1", HomeMainActivity.this.getFilesDir());
qpysdk.extractRes("private2", HomeMainActivity.this.getFilesDir());
qpysdk.extractRes("private3", HomeMainActivity.this.getFilesDir());
qpysdk.extractRes("public", new File(externalStorage + "/lib"));
- }
+ }*/
FileHelper.createDirIfNExists(externalStorage + "/cache");
FileHelper.createDirIfNExists(externalStorage + "/log");
//FileHelper.createDirIfNExists(externalStorage + "/notebooks");
@@ -468,25 +474,25 @@ public class HomeMainActivity extends BaseActivity {
* 初始化内置python项目
*/
public void extractRes() {
- File externalStorage = new File(FileUtils.getAbsolutePath(getApplicationContext()));
- if (checkExpired("public", new File(externalStorage + "/lib").getAbsolutePath(), "programs"+NAction.getPyVer(this))) {
- Resources resources = getResources();
+ //File externalStorage = new File(FileUtils.getAbsolutePath(getApplicationContext()));
+ //if (checkExpired("public", new File(externalStorage + "/lib").getAbsolutePath(), "programs"+NAction.getPyVer(this))) {
+ /*Resources resources = getResources();
try {
String qpyPath = FileUtils.getQyPath(App.getContext());
- /*Utils.createDirectoryOnExternalStorage(this,"qpython/project3/");
+ Utils.createDirectoryOnExternalStorage(this,"qpython/project3/");
Utils.unzip(resources.openRawResource(R.raw.projects3), qpyPath + "/qpython/project3/", false);
Utils.createDirectoryOnExternalStorage(this,"qpython/scripts3/");
- Utils.unzip(resources.openRawResource(R.raw.scripts3), qpyPath + "/qpython/scripts3/", false);*/
+ Utils.unzip(resources.openRawResource(R.raw.scripts3), qpyPath + "/qpython/scripts3/", false);
Utils.createDirectoryOnExternalStorage(this,"qpython/projects/");
Utils.unzip(resources.openRawResource(R.raw.projects2), qpyPath + "/qpython/projects/", false);
Utils.createDirectoryOnExternalStorage(this,"qpython/scripts/");
Utils.unzip(resources.openRawResource(R.raw.scripts2), qpyPath + "/qpython/scripts/", false);
- //QPySDK qPySDK = new QPySDK(this, this);
- //qPySDK.extractRes("ipynb", new File(externalStorage + "/notebooks"));
+ QPySDK qPySDK = new QPySDK(this, this);
+ qPySDK.extractRes("ipynb", new File(externalStorage + "/notebooks"));
} catch (Exception e) {
Log.e("HomeMainActivity", "Failed to copyResourcesToLocal", e);
- }
+ }*/
//220420,以下为旧的获取路径方式,需要同步修改gradle版本,暂时先保留
// String name, sFileName;
// InputStream content;
@@ -527,7 +533,7 @@ public class HomeMainActivity extends BaseActivity {
//
// }
// }
- }
+// }
}
private void init() {
@@ -572,4 +578,20 @@ public class HomeMainActivity extends BaseActivity {
}
+ @SuppressLint("HandlerLeak")
+ private void setHandler(){
+ QPyInterfaceFacade.handler = new Handler(){
+ @Override
+ public void handleMessage(Message msg){
+ super.handleMessage(msg);
+ String[] string = (String[]) msg.obj;
+ ScriptExec.getInstance().playScript(
+ HomeMainActivity.this,
+ string[0],string[1],
+ false);
+ }
+ };
+ AndroidFacade.handler = QPyInterfaceFacade.handler;
+ }
+
}
diff --git a/qpython/src/main/res/layout/activity_about.xml b/qpython/src/main/res/layout/activity_about.xml
index e76c104eddb67a24534331af36dc20279010dfa1..6cb553a54644a802052ebee0babb21d95dac5543 100644
--- a/qpython/src/main/res/layout/activity_about.xml
+++ b/qpython/src/main/res/layout/activity_about.xml
@@ -32,12 +32,12 @@
android:textColor="#FFF"/>
diff --git a/qpython/src/main/res/layout/activity_sign_in.xml b/qpython/src/main/res/layout/activity_sign_in.xml
index 952bf46b745eeeece972c3e5d38e76afd8a52294..7b7aebb6fe9fa96f6cd488f3b48883308cb49db1 100644
--- a/qpython/src/main/res/layout/activity_sign_in.xml
+++ b/qpython/src/main/res/layout/activity_sign_in.xml
@@ -60,7 +60,7 @@
android:drawableStart="@drawable/ic_login"
android:paddingLeft="@dimen/default_margin"
android:paddingRight="@dimen/default_margin"
- android:text="@string/sign_in_with_google"
+ android:text=""
android:textAllCaps="false"
android:textColor="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
diff --git a/qpython/src/main/res/values-zh-rCN/strings.xml b/qpython/src/main/res/values-zh-rCN/strings.xml
index db953bc140540edfd641e835bfe98ed0ac00a7dd..e573e54eb44778420e51364ca3efea79927f77f6 100644
--- a/qpython/src/main/res/values-zh-rCN/strings.xml
+++ b/qpython/src/main/res/values-zh-rCN/strings.xml
@@ -137,7 +137,7 @@
添加
SL4A服务运行中
服务开关
- QPython是安卓设备Python小程序引擎,支持Python 3.10。
+ QPython是安卓设备Python小程序引擎,支持Python PyVer。
警告
将重置所有设置并删除已下载的库,确定重置吗?
库文件
@@ -501,4 +501,5 @@
需要悬浮窗权限。
悬浮窗
轻触屏幕中心打开/关闭闪光灯。
+ 解压资源中
diff --git a/qpython/src/main/res/values/strings.xml b/qpython/src/main/res/values/strings.xml
index 62ed1dcf200caaa72cab876dc7e1bc04ed33c061..e55a181c8c64c4f0a6e91558ba2b58f67bbb9a86 100644
--- a/qpython/src/main/res/values/strings.xml
+++ b/qpython/src/main/res/values/strings.xml
@@ -253,7 +253,7 @@
SL4A server is running
SL4A server is not running
Server taggle
- QPython is the Python applet engine for Android devices. It supports Python3.10 .
+ QPython is the Python applet engine for Android devices. It supports Python PyVer .
Warning
Reset storage will lost all setting and downloaded libs, are you sure you want to reset?
Library
@@ -771,4 +771,5 @@
Need Float View Permission .
Float View
Tap the center of the screen to turn on/off the flash light .
+ Extracting Resources
diff --git a/qpython/src/od/res/values-zh-rCN/strings.xml b/qpython/src/od/res/values-zh-rCN/strings.xml
index a900de8f87bdc2e20587a3095200ac7c01d692c9..2a071d1910e568044367ed9c1f022de7a9efccf6 100644
--- a/qpython/src/od/res/values-zh-rCN/strings.xml
+++ b/qpython/src/od/res/values-zh-rCN/strings.xml
@@ -1,5 +1,4 @@
- 使用谷歌登录
QPython OS
diff --git a/qpython/src/od/res/values/strings.xml b/qpython/src/od/res/values/strings.xml
index 49b3ca29f230b8d3cf2cfa1fc6def0f00d42dbec..add441936b638ac17a1f41571299fd7fa2dabb54 100644
--- a/qpython/src/od/res/values/strings.xml
+++ b/qpython/src/od/res/values/strings.xml
@@ -1,4 +1,3 @@
- Sign in with Google
QPython OS