Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,7 +11,6 @@ buildscript {
jcenter()
google()
mavenCentral()

maven { url "https://plugins.gradle.org/m2/" }
maven { url "https://maven.google.com" }
}
Expand Down
10 changes: 7 additions & 3 deletions local.properties
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,10 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Aug 02 10:23:49 CST 2018
ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/yanhecun/Library/Android/sdk
#Mon Apr 13 14:53:44 CST 2020
#ndk.dir=/Users/yanhecun/Library/Android/sdk/ndk-bundle
#ndk.dir=D\:\\android-sdk-windows\\ndk\\20.1.5948944
#sdk.dir=D\:\\android-sdk-windows

sdk.dir=/Users/river/Library/Android/sdk
ndk.dir=/Users/river/Library/Android/sdk/ndk/21.3.6528147
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_gfx.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libSDL2_ttf.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libmain.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpng16.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libpython2.7.so
Binary file not shown.
Binary file removedqpysdk/src/main/libs/armeabi-v7a/libqpysdk.so
Binary file not shown.
22 changes: 18 additions & 4 deletions qpython/build.gradle
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ android {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 304
versionName "3.0.0"
versionCode 310
versionName "3.1.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true

Expand DownExpand Up@@ -68,7 +68,12 @@ android {
}

debug {
signingConfig signingConfigs.release
// signingConfig signingConfigs.release
debuggable true
minifyEnabled false
jniDebuggable true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

}
Expand DownExpand Up@@ -162,6 +167,9 @@ dependencies {
api 'org.litepal.android:core:1.3.1'
api 'me.dm7.barcodescanner:zxing:1.9'
api 'com.android.support:multidex:1.0.1'
implementation ('com.gyf.cactus:cactus-support:1.1.3-beta09'){
exclude group: 'com.google.guava'
}

api rootProject.ext.libOkHttp3
api rootProject.ext.libOkHttp3Log
Expand All@@ -176,6 +184,12 @@ dependencies {
api rootProject.ext.libSupportCardView
api rootProject.ext.libSupportPreference

odApi rootProject.ext.firebaseCore
odApi rootProject.ext.firebaseMsg
odApi rootProject.ext.firebaseAuth
odApi rootProject.ext.firebaseDatabase
odApi rootProject.ext.googlePlayServiceAuth

osApi rootProject.ext.firebaseCore
osApi rootProject.ext.firebaseMsg
osApi rootProject.ext.firebaseAuth
Expand All@@ -192,7 +206,7 @@ dependencies {
api rootProject.ext.retrofitCoverterGson
api rootProject.ext.retrofitAdapterRxjava

api 'com.android.support.constraint:constraint-layout:1.0.2'
api 'com.android.support.constraint:constraint-layout:1.1.3'

// 微信
opApi('com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.4.0') {
Expand Down
20 changes: 18 additions & 2 deletions qpython/src/main/AndroidManifest.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_STORAGE" />
Expand All@@ -35,6 +33,22 @@
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="net.dinglisch.android.tasker.PERMISSION_RUN_TASKS" />

<!--快捷方式开始-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /><!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /><!-- 移除快捷方式 -->
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式2.1以下 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4及以下 -->
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<!-- 查询快捷方式4.4以上 -->
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<!--快捷方式结束-->

<uses-feature android:name="android.hardware.microphone" android:required="false"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
Expand DownExpand Up@@ -68,6 +82,8 @@
<service android:name=".main.service.QPyService"/>
<service android:name="org.qpython.qsl4a.QPyScriptService"/>
<service android:name=".main.service.FTPServerService"/>


<activity
android:name=".main.activity.SignInActivity"
android:launchMode="singleTask"/>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
package org.qpython.qpy.console.shortcuts;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import org.qpython.qsl4a.qsl4a.LogUtil;

public class ShortcutReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
LogUtil.e("111111111" + intent);
}
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
package org.qpython.qpy.main.activity;

import android.app.Activity;
import android.Manifest;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import android.widget.Toast;

import com.quseit.util.FileHelper;
import com.quseit.util.FolderUtils;
Expand All@@ -23,30 +36,38 @@
import org.greenrobot.eventbus.ThreadMode;
import org.qpython.qpy.R;
import org.qpython.qpy.console.ScriptExec;
import org.qpython.qpy.console.shortcuts.ShortcutReceiver;
import org.qpython.qpy.main.adapter.AppListAdapter;
import org.qpython.qpy.main.event.AppsLoader;
import org.qpython.qpy.main.model.AppModel;
import org.qpython.qpy.main.model.QPyScriptModel;
import org.qpython.qpy.utils.ShortcutUtil;
import org.qpython.qpysdk.QPyConstants;
import org.qpython.qpysdk.utils.Utils;
import org.qpython.qsl4a.qsl4a.LogUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.qpython.qpy.R2.string.show;

/**
* Local App list
* Created by Hmei on 2017-05-22.
*/

public class AppListActivity extends BaseActivity implements LoaderManager.LoaderCallbacks<ArrayList<AppModel>> {
public static final String TYPE_SCRIPT = "script";
private static final int REQUEST_INSTALL_SHORTCUT = 0;

private List<AppModel> dataList;
private AppListAdapter adapter;

ShortcutReceiver receiver;

public static void start(Context context, String type) {
Intent starter = new Intent(context, AppListActivity.class);
starter.putExtra("type", type);
Expand All@@ -56,12 +77,25 @@ public static void start(Context context, String type) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initShortcutReceiver();
runShortcut();
setContentView(R.layout.activity_local_app);
initView();
EventBus.getDefault().register(this);
}

private void initShortcutReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CREATE_SHORTCUT);
filter.addAction("com.android.launcher.action.INSTALL_SHORTCUT");
filter.addAction("android.content.pm.action.CONFIRM_PIN_SHORTCUT");
filter.addAction(Intent.ACTION_VIEW);

receiver = new ShortcutReceiver();
registerReceiver(receiver,filter);

}

@Override
protected void onResume() {
super.onResume();
Expand All@@ -74,6 +108,9 @@ protected void onResume() {
@Override
protected void onDestroy() {
super.onDestroy();
if (receiver != null){
unregisterReceiver(receiver);
}
EventBus.getDefault().unregister(this);
}

Expand All@@ -90,6 +127,7 @@ private void runShortcut() {
}
}

QPyScriptModel mBean;
private void initView() {
dataList = new ArrayList<>();
adapter = new AppListAdapter(dataList, getIntent().getStringExtra("type"), this);
Expand All@@ -104,6 +142,16 @@ public void runProject(QPyScriptModel item) {
ScriptExec.getInstance().playProject(AppListActivity.this, item.getPath(), false);
}

@Override
public void createShortcut(QPyScriptModel item) {
mBean = item;
// if (!checkPermission()){
// return;
// }
createShortcutOnThis();
// test();
}

@Override
public void exit() {
AppListActivity.this.finish();
Expand All@@ -116,9 +164,113 @@ public void exit() {
appsView.setAdapter(adapter);

((TextView) findViewById(R.id.tv_folder_name)).setText(R.string.qpy_app);
findViewById(R.id.iv_back).setOnClickListener(view -> AppListActivity.this.finish());

getScriptList();
}

// private boolean checkPermission() {
// if (Build.VERSION.SDK_INT >= 23) {
// int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.INSTALL_SHORTCUT);
// LogUtil.e("checkPermission" + checkPermission);
// LogUtil.e("checkPermission" + PackageManager.PERMISSION_GRANTED);
// if (checkPermission != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INSTALL_SHORTCUT}, REQUEST_INSTALL_SHORTCUT);
// return false;
// } else {
// return true;
// }
// } else {
// return true;
// }
// }

// @Override
// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// if (requestCode == REQUEST_INSTALL_SHORTCUT) {
// if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// Toast.makeText(this, R.string.toast_read_permission_deny, Toast.LENGTH_SHORT).show();
// } else {
// createShortcutOnThis();
// }
// }
// }

private void test(){
judgeShortcutNameV2("org.qpython.qpy");
}

private void createShortcutOnThis(){
if (mBean == null){
return;
}

Intent intent = new Intent();
intent.setClass(this, AppListActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("type", "script");
intent.putExtra("path", mBean.getPath());
intent.putExtra("isProj", mBean.isProj());

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager mShortcutManager = getSystemService(ShortcutManager.class);
if (mShortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, mBean.getLabel())
.setShortLabel(mBean.getLabel())
.setLongLabel(mBean.getLabel())
.setIcon(Icon.createWithResource(this, mBean.getIconRes()))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
mShortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
LogUtil.e("createShortcut: " + "111111111111");
mShortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
LogUtil.e("createShortcut: " + mBean.getLabel());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
judgeShortcutNameV2("org.qpython.qpy");
// judgeShortcutName(mBean.getLabel());
}
},200);
}
} else {
//Adding shortcut for MainActivity
//on Home screen
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, mBean.getLabel());
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(getApplicationContext(),
mBean.getIconRes()));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
Toast.makeText(this, getString(R.string.shortcut_create_suc, mBean.getLabel()), Toast.LENGTH_SHORT).show();
}
}

// private void judgeShortcutName(String name) {
// int shortcutNum = 0;
// for (String packageName : ShortcutUtil.getAllTheLauncher(getApplicationContext())) {
// LogUtil.e("packageName111111: " + packageName);
// if (name.equals(packageName)) {
// shortcutNum ++;
// }
// }
// LogUtil.e("packageName222222: " + shortcutNum);
// }

private void judgeShortcutNameV2(String name) {
if (!ShortcutUtil.getShortcutInfo(getApplicationContext()).isEmpty()){
return;
}
Toast.makeText(this, getString(R.string.shortcut_create_fail), Toast.LENGTH_SHORT).show();
}


private void getScriptList() {
try {
Expand Down
Loading