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