You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1647 lines
55 KiB
1647 lines
55 KiB
// author@LoyDgIk
|
|
// 该插件仅供娱乐,是作者学习研究代码的副产物,插件可能纯在一些漏洞与不合理的设计,请谨慎用于实际项目。
|
|
// 已知问题,用弹窗播放视频链接,不会有播放记录。进入子页面有历史记录,但没有足迹。
|
|
//引入Java类
|
|
const XPopup = com.lxj.xpopup.XPopup;
|
|
const XPopupCallback = com.lxj.xpopup.interfaces.XPopupCallback;
|
|
const DetailUIHelper = com.example.hikerview.ui.detail.DetailUIHelper;
|
|
const DisplayUtil = com.example.hikerview.utils.DisplayUtil;
|
|
const ActivityManager = com.example.hikerview.ui.ActivityManager;
|
|
const R = com.example.hikerview.R;
|
|
const Integer = java.lang.Integer;
|
|
const ArrayList = java.util.ArrayList;
|
|
const Runnable = java.lang.Runnable;
|
|
const Bookmark = com.example.hikerview.model.Bookmark;
|
|
|
|
let BookmarkFolderPopup = com.example.hikerview.ui.home.view.BookmarkFolderPopup;
|
|
|
|
const InputPopup = com.example.hikerview.ui.view.popup.InputPopup
|
|
const ConfirmPopup = com.example.hikerview.ui.view.popup.ConfirmPopup;
|
|
|
|
const SettingMenuPopup = com.example.hikerview.ui.setting.SettingMenuPopup;
|
|
const OfficeItem = com.example.hikerview.ui.setting.office.OfficeItem;
|
|
const CustomBottomRecyclerViewPopup = com.example.hikerview.ui.view.CustomBottomRecyclerViewPopup;
|
|
const CustomCenterRecyclerViewPopup = com.example.hikerview.ui.view.CustomCenterRecyclerViewPopup;
|
|
const CustomRecyclerViewPopup = com.example.hikerview.ui.view.CustomRecyclerViewPopup;
|
|
const FileDetailPopup = com.example.hikerview.ui.setting.file.FileDetailPopup;
|
|
const CustomCopyPopup = com.example.hikerview.ui.view.CustomCopyPopup;
|
|
const CustomColorPopup = com.example.hikerview.ui.view.CustomColorPopup;
|
|
const Class = java.lang.Class;
|
|
const AutoImportHelper = com.example.hikerview.utils.AutoImportHelper;
|
|
const PageParser = com.example.hikerview.service.parser.PageParser;
|
|
|
|
const UrlDetector = com.example.hikerview.ui.browser.model.UrlDetector;
|
|
const PlayerChooser = com.example.hikerview.ui.video.PlayerChooser;
|
|
const VideoChapter = com.example.hikerview.ui.video.VideoChapter;
|
|
const FJSON = com.alibaba.fastjson.JSON;
|
|
|
|
const ToastMgr = com.example.hikerview.utils.ToastMgr;
|
|
const ChefSnackbar = com.example.hikerview.ui.view.toast.ChefSnackbar;
|
|
const ThreadTool = com.example.hikerview.utils.ThreadTool;
|
|
const AlertDialog = Packages.androidx.appcompat.app.AlertDialog;
|
|
const DialogUtil = com.example.hikerview.utils.view.DialogUtil;
|
|
const HeavyTaskUtil = com.example.hikerview.utils.HeavyTaskUtil;
|
|
|
|
const BiometricManager = Packages.androidx.biometric.BiometricManager;
|
|
const BiometricPrompt = Packages.androidx.biometric.BiometricPrompt;
|
|
const ContextCompat = Packages.androidx.core.content.ContextCompat;
|
|
const Build = android.os.Build;
|
|
let JSContext = org.mozilla.javascript.Context;
|
|
let JSContextVer = JSContext.getCurrentContext().getLanguageVersion();
|
|
|
|
if (typeof MY_RULE === "undefined") {
|
|
MY_RULE = null;
|
|
}
|
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
|
throw Error("hikerPop只能在android8.0及以上运行");
|
|
}
|
|
//适配嗅觉浏览器
|
|
let cannotTouchUI = false;
|
|
if (typeof MY_NAME !== "undefined" && MY_NAME === "嗅觉浏览器") {
|
|
cannotTouchUI = true;
|
|
BookmarkFolderPopup = com.example.hikerview.ui.bookmark.BookmarkFolderPopup;
|
|
}
|
|
|
|
function getContext() {
|
|
return typeof getCurrentActivity === "function" ? getCurrentActivity() : ActivityManager.getInstance().getCurrentActivity();
|
|
}
|
|
//获取上下文
|
|
const startActivity = getContext();
|
|
|
|
let useStartActivity = true;
|
|
|
|
function getArticleListFragment(activity) {
|
|
//let activity = getCurrentActivity();
|
|
try {
|
|
if (activity instanceof com.example.hikerview.ui.home.MainActivity) {
|
|
let MainActivity = activity.getClass();
|
|
let field = MainActivity.getDeclaredField("viewPagerAdapter");
|
|
field.setAccessible(true);
|
|
let viewPagerAdapter = field.get(activity);
|
|
let articleListFragment = viewPagerAdapter.getClass().getMethod("getCurrentFragment").invoke(viewPagerAdapter);
|
|
return articleListFragment || null;
|
|
} else if (activity instanceof com.example.hikerview.ui.home.FilmListActivity) {
|
|
let FilmListActivity = activity.getClass();
|
|
let field = FilmListActivity.getDeclaredField("articleListFragment");
|
|
field.setAccessible(true);
|
|
let articleListFragment = field.get(activity);
|
|
return articleListFragment;
|
|
} else {
|
|
return null;
|
|
}
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
const currentArticleListFragment = getArticleListFragment(startActivity);
|
|
|
|
function clickItem(af, position, url) {
|
|
let click = af.getClass().getDeclaredMethod("clickItem", android.view.View, java.lang.Integer.TYPE, java.lang.String, java.lang.Boolean.TYPE, java.lang.String);
|
|
click.setAccessible(true);
|
|
click.invoke(af, null, java.lang.Integer.valueOf(position), url, true, "");
|
|
}
|
|
|
|
|
|
function getActivityContext() {
|
|
return useStartActivity ? startActivity : getContext();
|
|
}
|
|
|
|
function setUseStartActivity(bool) {
|
|
useStartActivity = !!bool;
|
|
return this;
|
|
}
|
|
|
|
function newSimpleCallback({
|
|
beforeDismiss,
|
|
beforeShow,
|
|
onBackPressed,
|
|
onCreated,
|
|
onDismiss,
|
|
onDrag,
|
|
onKeyBoardStateChanged,
|
|
onShow
|
|
}) {
|
|
return new XPopupCallback({
|
|
beforeDismiss(basePopupView) {
|
|
tryCallBack(beforeDismiss, [basePopupView], true);
|
|
},
|
|
beforeShow(basePopupView) {
|
|
tryCallBack(beforeShow, [basePopupView], true);
|
|
},
|
|
onBackPressed(basePopupView) {
|
|
if (typeof onBackPressed === "function") {
|
|
return !!tryCallBack(onBackPressed, [basePopupView], true);
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
onCreated(basePopupView) {
|
|
tryCallBack(onCreated, [basePopupView], true);
|
|
},
|
|
onDismiss(basePopupView) {
|
|
tryCallBack(onDismiss, [basePopupView], true);
|
|
},
|
|
onDrag(basePopupView, value, percent, upOrLeft) {
|
|
tryCallBack(onDrag, [basePopupView, value, percent, upOrLeft], true);
|
|
},
|
|
onKeyBoardStateChanged(basePopupView, height) {
|
|
tryCallBack(onKeyBoardStateChanged, [basePopupView, height], true);
|
|
},
|
|
onShow(basePopupView) {
|
|
tryCallBack(onKeyBoardStateChanged, [basePopupView], true);
|
|
}
|
|
});
|
|
}
|
|
|
|
function getVideoChapter(playList) {
|
|
let videoChapterClass = new VideoChapter().getClass();
|
|
return FJSON.parseArray(JSON.stringify(playList), videoChapterClass);
|
|
}
|
|
|
|
function playVideos(playList, pos) {
|
|
if (!Array.isArray(playList)) {
|
|
if ($.type(playList) === "object") {
|
|
playList = [playList];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
let videoChapter = getVideoChapter(playList);
|
|
if (pos !== void 0 && pos >= 0 && pos < videoChapter.size()) {
|
|
videoChapter.get(pos).setUse(true);
|
|
}
|
|
PlayerChooser.startPlayer(getActivityContext(), videoChapter);
|
|
return true;
|
|
}
|
|
|
|
function toNextPage(url) {
|
|
try {
|
|
let rule = getParam("rule", "", url);
|
|
if (!rule && MY_RULE) {
|
|
url = buildUrl(url, {
|
|
rule: MY_RULE.title
|
|
});
|
|
}
|
|
if (Object.keys(AutoImportHelper).includes("lambda$couldCloudImport$2")) {
|
|
AutoImportHelper.lambda$couldCloudImport$2(url);
|
|
} else {
|
|
let autoImportHelperClass = new AutoImportHelper().getClass();
|
|
let couldCloudImportMethod = autoImportHelperClass.getDeclaredMethod("lambda$couldCloudImport$2", Class.forName("java.lang.String"));
|
|
couldCloudImportMethod.setAccessible(true);
|
|
couldCloudImportMethod.invoke(null, url);
|
|
}
|
|
} catch (e) {
|
|
toast(e.toString());
|
|
}
|
|
}
|
|
|
|
function toPalyPage(url, title) {
|
|
try {
|
|
PlayerChooser.startPlayer(getActivityContext(), title || url, url);
|
|
} catch (e) {
|
|
toast(e.toString());
|
|
}
|
|
}
|
|
|
|
function throwError(e) {
|
|
let message = "",
|
|
lineNumber = -1;
|
|
if (e instanceof Error) {
|
|
message = e.message;
|
|
lineNumber = e.lineNumber;
|
|
} else {
|
|
message = String(e);
|
|
}
|
|
log(message);
|
|
setError("\n行数:" + lineNumber + "\n详情:" + message);
|
|
}
|
|
|
|
function tryNewCallBack(callBack, args, noDeal) {
|
|
HeavyTaskUtil.executeNewTask(new Runnable({
|
|
run() {
|
|
try {
|
|
checkJsVer();
|
|
if (callBack == null) {
|
|
return;
|
|
}
|
|
args = args || [];
|
|
let res = callBack.apply(null, args);
|
|
if (noDeal) return;
|
|
dealUrlSimply(res, args[0]);
|
|
} catch (e) {
|
|
throwError(e);
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
|
|
function runOnNewThread(func) {
|
|
tryNewCallBack(func);
|
|
}
|
|
|
|
function tryCallBack(callBack, args, noDeal) {
|
|
try {
|
|
checkJsVer();
|
|
if (callBack == null) {
|
|
return;
|
|
}
|
|
args = args || [];
|
|
let res = callBack.apply(null, args);
|
|
//log(res)
|
|
if (noDeal) return res;
|
|
|
|
dealUrlSimply(res, args[0]);
|
|
} catch (e) {
|
|
throwError(e);
|
|
}
|
|
}
|
|
|
|
function dealUrlSimply(url, title) {
|
|
if (typeof url !== "string" || !url) return;
|
|
if (currentArticleListFragment && typeof MY_POSITION !== "undefined" && MY_POSITION > -1) {
|
|
clickItem(currentArticleListFragment, MY_POSITION, url);
|
|
} else {
|
|
if (PageParser.isPageUrl(url)) {
|
|
return toNextPage(url);
|
|
} else if (!DetailUIHelper.dealUrlSimply(getActivityContext(), null, MY_RULE, null, url || "", null, null) && UrlDetector.isVideoOrMusic(url)) {
|
|
return toPalyPage(url, typeof title === "string" ? title : url);
|
|
}
|
|
}
|
|
}
|
|
|
|
function checkJsVer() {
|
|
let cx = JSContext.getCurrentContext();
|
|
if (!cx.getLanguageVersion()) {
|
|
try {
|
|
|
|
} catch (e) {
|
|
log(e.toString())
|
|
}
|
|
cx.setLanguageVersion(JSContextVer);
|
|
}
|
|
}
|
|
|
|
function getDefaultValue(v, type, defaultValue) {
|
|
if ($.type(v) !== type) return defaultValue;
|
|
return v || defaultValue;
|
|
}
|
|
|
|
function getNumberValue(v, func, defaultValue) {
|
|
if (!($.type(v) === "number" || func(v))) return defaultValue;
|
|
return v;
|
|
}
|
|
|
|
function getStringArray(arr, defaultValue) {
|
|
if ($.type(arr) !== "array") return defaultValue;
|
|
return arr.map(v => String(v));
|
|
}
|
|
|
|
function checkStringArray(arr) {
|
|
arr.forEach((v, i) => arr[i] = String(v));
|
|
}
|
|
|
|
function getNumberArray(arr, defaultValue) {
|
|
if ($.type(arr) !== "array") return defaultValue;
|
|
return arr.map(v => Number(v) || 0);
|
|
}
|
|
|
|
function getBookList(arr) {
|
|
let list = new ArrayList();
|
|
for (let it of arr) {
|
|
let bookmark = new Bookmark();
|
|
bookmark.setTitle(it.title || "");
|
|
bookmark.setDir(false);
|
|
bookmark.setUrl(it.url || it.title || "");
|
|
bookmark.setIcon(it.icon || "");
|
|
list.add(bookmark);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
function builderXPopup(context) {
|
|
return new XPopup.Builder(context || getActivityContext())
|
|
.borderRadius(DisplayUtil.dpToPx(getActivityContext(), 16));
|
|
}
|
|
|
|
function dpToPx(dp) {
|
|
return DisplayUtil.dpToPx(getActivityContext(), dp);
|
|
}
|
|
|
|
function runOnUI(func) {
|
|
ThreadTool.INSTANCE.runOnUI(new Runnable({
|
|
run() {
|
|
checkJsVer();
|
|
try {
|
|
func();
|
|
} catch (e) {
|
|
throwError(e);
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
const showOnUI = cannotTouchUI ? pop => runOnUI(() => pop.show()) : pop => pop.show();
|
|
|
|
function updateRecordsBottom(records) {
|
|
const DefaultItemAnimator = Packages.androidx.recyclerview.widget.DefaultItemAnimator;
|
|
const MyStatusBarUtil = com.example.hikerview.utils.MyStatusBarUtil;
|
|
const UpdateRecordsAdapter = com.example.hikerview.ui.setting.updaterecords.UpdateRecordsAdapter;
|
|
const GridLayoutManager = Packages.androidx.recyclerview.widget.GridLayoutManager;
|
|
const RecordDetail = com.example.hikerview.ui.setting.updaterecords.RecordDetail;
|
|
|
|
let myRecordDetail = new JavaAdapter(com.lxj.xpopup.core.BottomPopupView, {
|
|
rules: [],
|
|
getImplLayoutId() {
|
|
return R.layout.activit_ad_list;
|
|
},
|
|
onCreate() {
|
|
this.super$onCreate();
|
|
let recyclerView = this.findViewById(R.id.ad_list_recycler_view);
|
|
this.recyclerView = recyclerView;
|
|
recyclerView.setItemAnimator(new DefaultItemAnimator());
|
|
this.findViewById(R.id.ad_list_title_text).setText("更新日志");
|
|
let button = this.findViewById(R.id.ad_list_add);
|
|
button.setText("知道啦");
|
|
button.setOnClickListener(() => {
|
|
this.dismiss();
|
|
});
|
|
let statusBarHeight = MyStatusBarUtil.getStatusBarHeight(getActivityContext()) + DisplayUtil.dpToPx(getActivityContext(), 86);
|
|
let findView2 = this.findViewById(R.id.ad_list_bg);
|
|
//this.findView(0x7f0a007c).setOnClickListener(new -$.Lambda.UpdateRecordsActivity.RJCabNcRtjM6-f9zjjTJnyOIczg(this));
|
|
let layoutParams = findView2.getLayoutParams();
|
|
layoutParams.topMargin = statusBarHeight;
|
|
findView2.setLayoutParams(layoutParams);
|
|
|
|
this.adapter = new UpdateRecordsAdapter(getActivityContext(), this.rules);
|
|
this.recyclerView.setLayoutManager(new GridLayoutManager(getActivityContext(), 1));
|
|
this.recyclerView.setAdapter(this.adapter);
|
|
try {
|
|
for (let it of records) {
|
|
let recordDetail = new RecordDetail();
|
|
recordDetail.setType(1);
|
|
recordDetail.setDetail(String(it.title || ""));
|
|
this.rules.push(recordDetail);
|
|
for (let item of (it.records || [])) {
|
|
let recordDetail2 = new RecordDetail();
|
|
recordDetail2.setType(2);
|
|
recordDetail2.setDetail(String(item || ""));
|
|
this.rules.push(recordDetail2);
|
|
}
|
|
}
|
|
} catch (e) {
|
|
log(e.toString());
|
|
setError(e);
|
|
}
|
|
|
|
}
|
|
}, getActivityContext());
|
|
|
|
let pop = new builderXPopup().asCustom(myRecordDetail);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function findRecyclerView(viewGroup) {
|
|
for (let i = 0; i < viewGroup.getChildCount(); i++) {
|
|
let child = viewGroup.getChildAt(i);
|
|
let name = child.getClass().getSimpleName();
|
|
|
|
if (name == "RecyclerView") {
|
|
return child;
|
|
}
|
|
if (child instanceof android.view.ViewGroup) {
|
|
let res;
|
|
if ((res = findRecyclerView(child))) {
|
|
return res;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function selectAttachList(id, {
|
|
click,
|
|
options,
|
|
}) {
|
|
if (typeof id !== "string" || !id) return null;
|
|
options = getStringArray(options, []);
|
|
let context = getActivityContext();
|
|
let recyclerView = findRecyclerView(context.findViewById(android.R.id.content));
|
|
//log(recyclerView===null);
|
|
if (recyclerView == null) return null;
|
|
let list = recyclerView.getAdapter().getList();
|
|
let i = 0;
|
|
let ii = -1
|
|
for (let it of list) {
|
|
if (id == it.getBaseExtra().getId()) {
|
|
ii = i;
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
if (ii < 0) return null;
|
|
let mg = recyclerView.getLayoutManager();
|
|
|
|
let pop = builderXPopup(getContext())
|
|
.atView(mg.getChildAt(ii))
|
|
.asAttachList(options, null, (position, text) => {
|
|
tryCallBack(getDefaultValue(click, "function", null), [text, position]);
|
|
});
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function loading(title) {
|
|
let pop = builderXPopup()
|
|
.asLoading(getDefaultValue(title, "string", null), 0);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function selectCenterMark({
|
|
click,
|
|
title,
|
|
options,
|
|
icons,
|
|
noAutoDismiss,
|
|
position
|
|
}) {
|
|
options = getStringArray(options, []);
|
|
icons = getNumberArray(icons, null);
|
|
let pop = builderXPopup()
|
|
.autoDismiss(!noAutoDismiss)
|
|
.asCenterList(getDefaultValue(title, "string", null), options, icons, getNumberValue(position, v => v % 1 === 0 && v < options.length && v >= -1, -1), (index, value) => {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value, index]);
|
|
});
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function selectBottomMark({
|
|
click,
|
|
title,
|
|
options,
|
|
icons,
|
|
noAutoDismiss,
|
|
position
|
|
}) {
|
|
options = getStringArray(options, []);
|
|
icons = getNumberArray(icons, null);
|
|
let pop = builderXPopup()
|
|
.moveUpToKeyboard(false)
|
|
.autoDismiss(!noAutoDismiss)
|
|
.asBottomList(getDefaultValue(title, "string", null), options, icons, getNumberValue(position, v => v % 1 === 0 && v < options.length && v >= -1, -1), (index, value) => {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value, index]);
|
|
});
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function selectCenter({
|
|
click,
|
|
longClick,
|
|
title,
|
|
options,
|
|
columns,
|
|
position
|
|
}) {
|
|
let clickListener = new CustomCenterRecyclerViewPopup.ClickListener({
|
|
onLongClick(value, index) {
|
|
tryCallBack(getDefaultValue(longClick, "function", null), [value, index]);
|
|
},
|
|
click(value, index) {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value, index]);
|
|
}
|
|
});
|
|
options = getStringArray(options, []);
|
|
let custom = new CustomCenterRecyclerViewPopup(getActivityContext())
|
|
.withTitle(getDefaultValue(title, "string", "请选择"))
|
|
.with(options, getDefaultValue(columns, "number", 3), clickListener);
|
|
if (position !== void 0) {
|
|
custom.withSelectedIndex(getNumberValue(position, v => v < options.length && v >= -1, -1));
|
|
}
|
|
let pop = builderXPopup()
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function selectBottom({
|
|
click,
|
|
longClick,
|
|
title,
|
|
options,
|
|
columns,
|
|
height,
|
|
noAutoDismiss,
|
|
}) {
|
|
let clickListener = new CustomRecyclerViewPopup.ClickListener({
|
|
onLongClick(value, index) {
|
|
tryCallBack(getDefaultValue(longClick, "function", null), [value, index]);
|
|
},
|
|
click(value, index) {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value, index]);
|
|
}
|
|
});
|
|
options = getStringArray(options, []);
|
|
let custom = new CustomRecyclerViewPopup(getActivityContext())
|
|
.withTitle(getDefaultValue(title, "string", "请选择"))
|
|
.height(getNumberValue(height, v => v <= 1 && v > 0, 0.75))
|
|
.dismissAfterClick(!noAutoDismiss).with(options, getDefaultValue(columns, "number", 3), clickListener);
|
|
let pop = builderXPopup()
|
|
.moveUpToKeyboard(false)
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function IconExtraMenu(click) {
|
|
this.create = function(parentView, args) {
|
|
const Gravity = android.view.Gravity;
|
|
const ImageView = android.widget.ImageView;
|
|
const LinearLayout = android.widget.LinearLayout;
|
|
|
|
let menuIcon = new ImageView(getActivityContext());
|
|
let menuIconLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 65);
|
|
menuIconLayoutParams.gravity = Gravity.CENTER_VERTICAL;
|
|
menuIconLayoutParams.setMargins(0, 0, 10, 0);
|
|
menuIcon.setLayoutParams(menuIconLayoutParams);
|
|
menuIcon.setId(R.id.menu_icon);
|
|
menuIcon.setPadding(4, 4, 4, 4);
|
|
//menuIcon.setVisibility(android.view.View.GONE);
|
|
menuIcon.setImageResource(R.drawable.home_left_menu);
|
|
if (typeof click === "function") {
|
|
menuIcon.setOnClickListener(new android.view.View.OnClickListener({
|
|
onClick() {
|
|
tryCallBack(click, args);
|
|
}
|
|
}));
|
|
}
|
|
|
|
return menuIcon;
|
|
}
|
|
}
|
|
|
|
function selectCenterIcon({
|
|
click,
|
|
title,
|
|
iconList,
|
|
columns,
|
|
position,
|
|
extraMenu
|
|
}) {
|
|
let clickListener = new BookmarkFolderPopup.ClickListener({
|
|
onLongClick(value, index) {},
|
|
click(value, index) {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value, index]);
|
|
}
|
|
});
|
|
iconList = getDefaultValue(iconList, "array", []);
|
|
iconList = getBookList(iconList);
|
|
|
|
let custom = new BookmarkFolderPopup(getActivityContext())
|
|
.withTitle(getDefaultValue(title, "string", "请选择"))
|
|
.with(iconList, getDefaultValue(columns, "number", 2), clickListener);
|
|
if (position !== void 0) {
|
|
custom.withSelectedIndex(getNumberValue(position, v => v < iconList.size() && v >= -1, -1));
|
|
}
|
|
XPopup.setAnimationDuration(200);
|
|
let pop = builderXPopup();
|
|
if (extraMenu instanceof IconExtraMenu) {
|
|
pop.setPopupCallback(newSimpleCallback({
|
|
onCreated(basePopupView) {
|
|
let linearLayout = basePopupView.getChildAt(0).getChildAt(0).getChildAt(0);
|
|
try {
|
|
if (linearLayout) {
|
|
const LinearLayout = android.widget.LinearLayout;
|
|
let item = extraMenu.create(linearLayout, []);
|
|
linearLayout.addView(item);
|
|
}
|
|
} catch (e) {
|
|
log(e.toString());
|
|
}
|
|
}
|
|
}))
|
|
}
|
|
pop = pop.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function inputTwoRow({
|
|
title,
|
|
titleHint,
|
|
urlHint,
|
|
titleDefault,
|
|
urlDefault,
|
|
confirm,
|
|
cancel,
|
|
hideCancel,
|
|
noAutoSoft
|
|
}) {
|
|
let okListener = new InputPopup.OkListener({
|
|
ok(text1, text2) {
|
|
tryCallBack(getDefaultValue(confirm, "function", null), [text1, text2]);
|
|
}
|
|
});
|
|
let cancelListener = new InputPopup.CancelListener({
|
|
cancel() {
|
|
tryCallBack(getDefaultValue(cancel, "function", null));
|
|
}
|
|
});
|
|
let custom = new InputPopup(getActivityContext())
|
|
.bind(
|
|
getDefaultValue(title, "string", "输入框"),
|
|
getDefaultValue(titleHint, "string", null),
|
|
getDefaultValue(titleDefault, "string", null),
|
|
getDefaultValue(urlHint, "string", null),
|
|
getDefaultValue(urlDefault, "string", null),
|
|
okListener
|
|
)
|
|
.setCancelListener(cancelListener);
|
|
let pop = builderXPopup()
|
|
.autoOpenSoftInput(!noAutoSoft)
|
|
.autoFocusEditText(!noAutoSoft);
|
|
if (hideCancel) {
|
|
pop.setPopupCallback(newSimpleCallback({
|
|
onCreated(basePopupView) {
|
|
let cancelTextView = basePopupView.findViewById(R.id.tv_cancel);
|
|
if (cancelTextView) {
|
|
cancelTextView.setVisibility(8);
|
|
}
|
|
let dividerView = basePopupView.findViewById(R.id.xpopup_divider_h);
|
|
if (dividerView) {
|
|
dividerView.setVisibility(8);
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
pop = pop
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function inputAutoRow({
|
|
title,
|
|
hint,
|
|
confirm,
|
|
cancel,
|
|
okTitle,
|
|
cancelTitle,
|
|
defaultValue,
|
|
hideCancel,
|
|
noAutoSoft
|
|
}) {
|
|
let okListener = new ConfirmPopup.OkListener({
|
|
ok(text) {
|
|
tryCallBack(getDefaultValue(confirm, "function", null), [text]);
|
|
},
|
|
cancel() {
|
|
tryCallBack(getDefaultValue(cancel, "function", null));
|
|
}
|
|
});
|
|
let custom = new ConfirmPopup(getActivityContext()).bind(getDefaultValue(title, "string", "输入框"), getDefaultValue(hint, "string", ""), okListener)
|
|
.setBtn(getDefaultValue(okTitle, "string", "确认"), getDefaultValue(cancelTitle, "string", "取消"));
|
|
let pop = builderXPopup()
|
|
.autoOpenSoftInput(!noAutoSoft)
|
|
.autoFocusEditText(!noAutoSoft);
|
|
|
|
pop.setPopupCallback(newSimpleCallback({
|
|
onCreated(basePopupView) {
|
|
defaultValue = getDefaultValue(defaultValue, "string", null);
|
|
if (defaultValue) {
|
|
let titleEdit = basePopupView.findViewById(R.id.edit_title);
|
|
if (titleEdit) {
|
|
titleEdit.setText(defaultValue);
|
|
}
|
|
}
|
|
if (hideCancel) {
|
|
let cancelTextView = basePopupView.findViewById(R.id.tv_cancel);
|
|
if (cancelTextView) {
|
|
cancelTextView.setVisibility(8);
|
|
}
|
|
let dividerView = basePopupView.findViewById(R.id.xpopup_divider_h);
|
|
if (dividerView) {
|
|
dividerView.setVisibility(8);
|
|
}
|
|
}
|
|
}
|
|
}));
|
|
|
|
pop = pop
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function inputConfirm({
|
|
title,
|
|
content,
|
|
defaultValue,
|
|
hint,
|
|
confirm,
|
|
cancel,
|
|
textarea,
|
|
maxTextarea,
|
|
hideCancel,
|
|
noAutoSoft
|
|
}) {
|
|
let pop = builderXPopup()
|
|
.autoOpenSoftInput(!noAutoSoft)
|
|
.autoFocusEditText(!noAutoSoft);
|
|
if (hideCancel) {
|
|
pop.setPopupCallback(newSimpleCallback({
|
|
onCreated(basePopupView) {
|
|
let cancelTextView = basePopupView.findViewById(R.id.tv_cancel);
|
|
if (cancelTextView) {
|
|
cancelTextView.setVisibility(8);
|
|
}
|
|
let dividerView = basePopupView.findViewById(R.id.xpopup_divider2);
|
|
if (dividerView) {
|
|
dividerView.setVisibility(8);
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
pop = pop.asInputConfirm(getDefaultValue(title, "string", null), getDefaultValue(content, "string", null), getDefaultValue(defaultValue, "string", null), getDefaultValue(hint, "string", null), (text) => {
|
|
tryCallBack(getDefaultValue(confirm, "function", null), [text]);
|
|
}, (text) => {
|
|
tryCallBack(getDefaultValue(cancel, "function", null), [text]);
|
|
}, maxTextarea ? R.layout.xpopup_confirm_input_max : (textarea ? R.layout.xpopup_confirm_input : 0));
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function confirm({
|
|
title,
|
|
content,
|
|
confirm,
|
|
cancel,
|
|
okTitle,
|
|
cancelTitle,
|
|
hideCancel
|
|
}) {
|
|
let pop = builderXPopup()
|
|
.asConfirm(getDefaultValue(title, "string", null), getDefaultValue(content, "string", ""), getDefaultValue(cancelTitle, "string", "取消"), getDefaultValue(okTitle, "string", "确认"), () => {
|
|
tryCallBack(getDefaultValue(confirm, "function", null));
|
|
}, () => {
|
|
tryCallBack(getDefaultValue(cancel, "function", null));
|
|
}, !!hideCancel);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function SettingItem(...arr) {
|
|
if (arr.length === 0) return new OfficeItem("");
|
|
else if (arr.length === 1) return new OfficeItem(String(arr[0]));
|
|
else if (arr.length === 2 && typeof arr[1] === "boolean") return new OfficeItem(String(arr[0]), arr[1] ? 1 : -1);
|
|
else if (arr.length === 2) return new OfficeItem(String(arr[0]), String(arr[1]));
|
|
else if (arr.length === 3) return new OfficeItem(String(arr[0]), arr[1] ? 1 : -1, String(arr[2]));
|
|
}
|
|
|
|
function selectBottomSettingMenu({
|
|
click,
|
|
options,
|
|
onDismiss
|
|
}) {
|
|
let onItemClickListener = new SettingMenuPopup.OnItemClickListener({
|
|
onClick(str, officeItem, consumer) {
|
|
tryCallBack(getDefaultValue(click, "function", null), [str, officeItem, () => consumer.accept(officeItem)]);
|
|
}
|
|
});
|
|
options = options.filter(v => v instanceof OfficeItem);
|
|
let arrayList = new ArrayList();
|
|
options.forEach(v => arrayList.add(v));
|
|
|
|
let custom = new SettingMenuPopup(getActivityContext(), "设置", arrayList, null, onItemClickListener);
|
|
let pop = builderXPopup()
|
|
.moveUpToKeyboard(false)
|
|
.setPopupCallback(newSimpleCallback({
|
|
onDismiss() {
|
|
tryCallBack(onDismiss);
|
|
}
|
|
}))
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
selectBottomSettingMenu.SettingItem = SettingItem;
|
|
|
|
|
|
function ResExtraInputBox({
|
|
hint,
|
|
click,
|
|
title,
|
|
onChange,
|
|
defaultValue,
|
|
titleVisible
|
|
}) {
|
|
let search;
|
|
let edit;
|
|
this.create = function(parentView, args) {
|
|
args = Array.isArray(args) ? args : [];
|
|
let inputItem = android.view.LayoutInflater.from(getActivityContext()).inflate(R.layout.item_input, parentView, false);
|
|
search = inputItem.findViewById(R.id.search);
|
|
edit = inputItem.findViewById(R.id.edit);
|
|
let clearBtn = inputItem.findViewById(R.id.clearBtn);
|
|
let divider = inputItem.findViewById(R.id.divider);
|
|
let pop_input_edit_bg = inputItem.findViewById(R.id.pop_input_edit_bg);
|
|
let search_suggest = inputItem.findViewById(R.id.search_suggest);
|
|
if (typeof title === "string" && title) {
|
|
search.setText(title);
|
|
} else {
|
|
search.setText("确定");
|
|
}
|
|
if (typeof titleVisible === "boolean" && !titleVisible) {
|
|
search.setText("");
|
|
search.setPadding(0, 0, 0, 0);
|
|
search.setVisibility(4);
|
|
divider.setVisibility(4);
|
|
}
|
|
if (typeof click === "function") {
|
|
search.setOnClickListener(new android.view.View.OnClickListener({
|
|
onClick() {
|
|
tryCallBack(click, [String(edit.getText())].concat(args));
|
|
}
|
|
}));
|
|
}
|
|
|
|
if (typeof hint === "string" && hint) {
|
|
edit.setHint(hint);
|
|
}
|
|
|
|
if (typeof onChange === "function") {
|
|
edit.addTextChangedListener(new android.text.TextWatcher({
|
|
onTextChanged() {},
|
|
beforeTextChanged() {},
|
|
afterTextChanged(s) {
|
|
let text;
|
|
if (s) {
|
|
text = String(s.toString());
|
|
tryCallBack(onChange, [text].concat(args), true);
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
if (typeof defaultValue === "string") {
|
|
edit.setText(defaultValue);
|
|
let len = defaultValue.length;
|
|
edit.setSelection(len, len);
|
|
}
|
|
return inputItem;
|
|
}
|
|
this.setTitle = (title) => {
|
|
if (search && typeof title === "string") {
|
|
search.setText(title);
|
|
}
|
|
}
|
|
this.setDefaultValue = (defaultValue) => {
|
|
if (edit && typeof defaultValue === "string") {
|
|
edit.setText(defaultValue);
|
|
let len = defaultValue.length;
|
|
edit.setSelection(len, len);
|
|
}
|
|
}
|
|
this.setHint = (hint) => {
|
|
if (edit && typeof hint === "string" && hint) {
|
|
edit.setHint(hint);
|
|
}
|
|
}
|
|
}
|
|
|
|
function selectBottomResIcon({
|
|
click,
|
|
menuClick,
|
|
title,
|
|
iconList,
|
|
columns,
|
|
height,
|
|
noAutoDismiss,
|
|
extraInputBox,
|
|
position,
|
|
toPosition,
|
|
beforeShow
|
|
}) {
|
|
let clickListener = new CustomCenterRecyclerViewPopup.ClickListener({
|
|
onLongClick(value, index) {},
|
|
click(value, index) {}
|
|
});
|
|
iconList = getDefaultValue(iconList, "array", []);
|
|
let booksList = getBookList(iconList);
|
|
let rv = null,
|
|
tv = null;
|
|
|
|
let scrollToPosition = (pos, isScroll) => {
|
|
if (typeof pos === "number" && rv && pos < booksList.length && pos >= -1) {
|
|
if (isScroll) {
|
|
rv.smoothScrollToPosition(pos);
|
|
} else {
|
|
rv.scrollToPosition(pos);
|
|
}
|
|
}
|
|
};
|
|
let setTitle = title => {
|
|
if (tv) tv.setText(String(title));
|
|
}
|
|
let custom = new CustomBottomRecyclerViewPopup(getActivityContext())
|
|
.withTitle(getDefaultValue(title, "string", "请选择"))
|
|
.withHeight(getNumberValue(height, v => v <= 1 && v > 0, 0.75))
|
|
.dismissWhenClick(!noAutoDismiss)
|
|
.with([], getDefaultValue(columns, "number", 2), clickListener)
|
|
.withOnCreateCallback((basePopupView) => {
|
|
try {
|
|
let recyclerView = basePopupView.findViewById(R.id.recyclerView);
|
|
tv = custom.findViewById(R.id.title);
|
|
let linearLayout;
|
|
if (recyclerView) {
|
|
rv = recyclerView;
|
|
recyclerView.setAdapter(iconAdapter);
|
|
Packages.androidx.core.view.ViewCompat.setBackground(recyclerView, Packages.androidx.core.content.ContextCompat.getDrawable(getActivityContext(), R.drawable.bg_round_all_rice));
|
|
}
|
|
if (recyclerView && (linearLayout = recyclerView.getParent()) && extraInputBox instanceof ResExtraInputBox) {
|
|
let inputItem = extraInputBox.create(linearLayout, [resOptionsManage]);
|
|
let params = inputItem.getLayoutParams();
|
|
params.setMargins(35, 0, 35, 0);
|
|
inputItem.setLayoutParams(params);
|
|
linearLayout.addView(inputItem, 1);
|
|
}
|
|
scrollToPosition(toPosition);
|
|
} catch (e) {
|
|
log(e.toString());
|
|
}
|
|
});
|
|
let iconAdapter = new com.example.hikerview.ui.home.view.BookmarkFolderAdapter(getActivityContext(), booksList, (v, i) => {
|
|
let item = booksList.get(i);
|
|
let items = {
|
|
icon: String(item.getIcon()),
|
|
title: String(item.getTitle())
|
|
};
|
|
let func = () => tryCallBack(getDefaultValue(click, "function", null), [items, Number(i), resOptionsManage]);
|
|
if (noAutoDismiss) {
|
|
func();
|
|
} else {
|
|
custom.dismissWith(func);
|
|
}
|
|
}, false);
|
|
iconAdapter.setSelectedIndex(getNumberValue(position, v => v < iconList.length && v >= -1, -1));
|
|
let resOptionsManage = {
|
|
setTitle: setTitle,
|
|
scrollToPosition: scrollToPosition,
|
|
getSize: () => Number(booksList.length),
|
|
change(list, position) {
|
|
booksList.length = 0;
|
|
Object.assign(booksList, getBookList(list));
|
|
if (position !== void 0) {
|
|
iconAdapter.setSelectedIndex(getNumberValue(position, v => v < iconList.length && v >= -1, -1));
|
|
}
|
|
iconAdapter.notifyDataSetChanged();
|
|
},
|
|
setSelectedIndex(position) {
|
|
iconAdapter.setSelectedIndex(getNumberValue(position, v => v < iconList.length && v >= -1, -1));
|
|
iconAdapter.notifyDataSetChanged();
|
|
},
|
|
removed(pos) {
|
|
if (pos >= booksList.size()) {
|
|
throw new Error("pos大于列表长度");
|
|
}
|
|
iconAdapter.notifyItemRemoved(pos);
|
|
},
|
|
changeColumns: custom.changeSpanCount.bind(custom)
|
|
}
|
|
if (typeof menuClick === "function") {
|
|
custom.withMenu(new android.view.View.OnClickListener({
|
|
onClick() {
|
|
tryCallBack(getDefaultValue(menuClick, "function", null), [resOptionsManage]);
|
|
}
|
|
}));
|
|
}
|
|
let pop = builderXPopup();
|
|
pop.setPopupCallback(newSimpleCallback({
|
|
beforeShow(basePopupView) {
|
|
scrollToPosition(toPosition);
|
|
tryCallBack(getDefaultValue(beforeShow, "function", null), [pop, resOptionsManage]);
|
|
}
|
|
}));
|
|
pop = pop.moveUpToKeyboard(false).asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function selectBottomRes({
|
|
click,
|
|
longClick,
|
|
menuClick,
|
|
title,
|
|
options,
|
|
columns,
|
|
height,
|
|
noAutoDismiss,
|
|
extraInputBox,
|
|
toPosition,
|
|
beforeShow
|
|
}) {
|
|
let clickListener = new CustomCenterRecyclerViewPopup.ClickListener({
|
|
onLongClick(value, index) {
|
|
tryCallBack(getDefaultValue(longClick, "function", null), [value, index, resOptionsManage]);
|
|
},
|
|
click(value, index) {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value, index, resOptionsManage]);
|
|
}
|
|
});
|
|
const list = getStringArray(options, []);
|
|
let rv = null,
|
|
tv = null;
|
|
let scrollToPosition = (pos, isScroll) => {
|
|
if (typeof pos === "number" && rv && pos < list.length && pos >= -1) {
|
|
if (isScroll) {
|
|
rv.smoothScrollToPosition(pos);
|
|
} else {
|
|
rv.scrollToPosition(pos);
|
|
}
|
|
}
|
|
};
|
|
let setTitle = title => {
|
|
if (tv) tv.setText(String(title));
|
|
}
|
|
let custom = new CustomBottomRecyclerViewPopup(getActivityContext())
|
|
.withTitle(getDefaultValue(title, "string", "请选择"))
|
|
.withHeight(getNumberValue(height, v => v <= 1 && v > 0, 0.75))
|
|
.dismissWhenClick(!noAutoDismiss)
|
|
.with(list, getDefaultValue(columns, "number", 2), clickListener)
|
|
.withOnCreateCallback((basePopupView) => {
|
|
let recyclerView = basePopupView.findViewById(R.id.recyclerView);
|
|
rv = recyclerView;
|
|
tv = custom.findViewById(R.id.title);
|
|
let linearLayout;
|
|
if (recyclerView && (linearLayout = recyclerView.getParent()) && extraInputBox instanceof ResExtraInputBox) {
|
|
|
|
let inputItem = extraInputBox.create(linearLayout, [resOptionsManage]);
|
|
let params = inputItem.getLayoutParams();
|
|
params.setMargins(35, 0, 35, 0);
|
|
inputItem.setLayoutParams(params);
|
|
linearLayout.addView(inputItem, 1);
|
|
}
|
|
});
|
|
let resOptionsManage = {
|
|
list: list,
|
|
setTitle: setTitle,
|
|
scrollToPosition: scrollToPosition,
|
|
change() {
|
|
checkStringArray(list);
|
|
custom.notifyDataChange();
|
|
},
|
|
removed(pos) {
|
|
checkStringArray(list);
|
|
if (pos >= list.length) {
|
|
throw new Error("pos大于列表长度");
|
|
}
|
|
custom.notifyDataRemoved(pos);
|
|
},
|
|
changeColumns: custom.changeSpanCount.bind(custom)
|
|
}
|
|
if (typeof menuClick === "function") {
|
|
custom.withMenu(new android.view.View.OnClickListener({
|
|
onClick() {
|
|
tryCallBack(getDefaultValue(menuClick, "function", null), [resOptionsManage]);
|
|
}
|
|
}));
|
|
}
|
|
let pop = builderXPopup();
|
|
pop.setPopupCallback(newSimpleCallback({
|
|
beforeShow(basePopupView) {
|
|
scrollToPosition(toPosition);
|
|
tryCallBack(getDefaultValue(beforeShow, "function", null), [pop, resOptionsManage]);
|
|
}
|
|
}));
|
|
pop = pop.moveUpToKeyboard(false).asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function infoBottom({
|
|
title,
|
|
options,
|
|
click,
|
|
longClick
|
|
}) {
|
|
let clickListener = new com.example.hikerview.ui.setting.file.FileDetailAdapter.OnClickListener({
|
|
click(value) {
|
|
tryCallBack(getDefaultValue(click, "function", null), [value]);
|
|
},
|
|
longClick(view, value) {
|
|
tryCallBack(getDefaultValue(longClick, "function", null), [value]);
|
|
}
|
|
});
|
|
|
|
let custom = new FileDetailPopup(
|
|
getActivityContext(),
|
|
getDefaultValue(title, "string", null),
|
|
getStringArray(options, [])
|
|
)
|
|
.withClickListener(clickListener);
|
|
let pop = builderXPopup()
|
|
.moveUpToKeyboard(false)
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function copyBottom(title, content) {
|
|
if (cannotTouchUI) return null;
|
|
let custom = new CustomCopyPopup(getActivityContext())
|
|
.with(
|
|
getDefaultValue(title, "string", null),
|
|
getDefaultValue(content, "string", ""),
|
|
);
|
|
let pop = builderXPopup()
|
|
.moveUpToKeyboard(false)
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function selectCenterColor(colors, callBack) {
|
|
if (typeof colors === "function") {
|
|
callBack = colors;
|
|
}
|
|
colors = getStringArray(colors, []);
|
|
let custom = new CustomColorPopup(getActivityContext());
|
|
custom.setColorSelect(new CustomColorPopup.OnColorSelect({
|
|
select(value) {
|
|
tryCallBack(getDefaultValue(callBack, "function", null), [value]);
|
|
}
|
|
}));
|
|
let pop = builderXPopup()
|
|
.setPopupCallback(newSimpleCallback({
|
|
onCreated(basePopupView) {
|
|
const count = colors.length > 8 ? 8 : colors.length;
|
|
for (let i = 0; i < count; i++) {
|
|
if (colors[i]) {
|
|
let color = android.graphics.Color.parseColor(colors[i]);
|
|
let relativeLayout = basePopupView.findViewById(R.id["color" + (i + 1) + "_bg"]);
|
|
relativeLayout.setTag(colors[i]);
|
|
relativeLayout.getChildAt(0).setCardBackgroundColor(color);
|
|
relativeLayout.getChildAt(1).setTextColor(color);
|
|
}
|
|
}
|
|
}
|
|
}))
|
|
.asCustom(custom);
|
|
showOnUI(pop);
|
|
return pop;
|
|
}
|
|
|
|
function chefSnackbarMake({
|
|
content,
|
|
duration,
|
|
confirm,
|
|
cancel,
|
|
okTitle,
|
|
cancelTitle
|
|
}) {
|
|
let decorView = getContext().getWindow().getDecorView();
|
|
ChefSnackbar.Companion.make(decorView)
|
|
.setText(getDefaultValue(content, "string", ""))
|
|
.setDuration(getDefaultValue(okTitle, "number", 0))
|
|
.setAction(getDefaultValue(okTitle, "string", "确认"), function() {
|
|
tryCallBack(getDefaultValue(confirm, "function", null));
|
|
})
|
|
.setCancelButton(getDefaultValue(cancelTitle, "string", "取消"), function() {
|
|
tryCallBack(getDefaultValue(cancel, "function", null));
|
|
})
|
|
.show();
|
|
}
|
|
|
|
function toastMeg(text, type) {
|
|
switch (type) {
|
|
case toastMeg.LC:
|
|
ToastMgr.longCenter(getContext(), String(text));
|
|
break;
|
|
case toastMeg.SC:
|
|
ToastMgr.shortCenter(getContext(), String(text));
|
|
break;
|
|
case toastMeg.LB:
|
|
ToastMgr.longBottomCenter(getContext(), String(text));
|
|
break;
|
|
case toastMeg.SC:
|
|
default:
|
|
ToastMgr.shortBottomCenter(getContext(), String(text));
|
|
break;
|
|
}
|
|
}
|
|
toastMeg.LC = 1;
|
|
toastMeg.SC = 2;
|
|
toastMeg.LB = 3;
|
|
toastMeg.SB = 4;
|
|
|
|
function getClipTopData() {
|
|
try {
|
|
const Context = android.content.Context;
|
|
const context = getContext();
|
|
let clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE);
|
|
let clipData = clipboard.getPrimaryClip();
|
|
if (clipData != null && clipData.getItemCount() > 0) {
|
|
let text = clipData.getItemAt(0).getText();
|
|
if (text != null) {
|
|
return String(text.toString());
|
|
}
|
|
}
|
|
return "";
|
|
} catch (e) {
|
|
log(e.toString());
|
|
return "";
|
|
}
|
|
}
|
|
|
|
function confirmSync({
|
|
title,
|
|
content,
|
|
okTitle,
|
|
cancelTitle,
|
|
hideCancel,
|
|
noDismissOnBack,
|
|
noDismissOnBlank
|
|
}) {
|
|
let countDownLatch = new java.util.concurrent.CountDownLatch(1);
|
|
let result = false;
|
|
showOnUI(
|
|
builderXPopup()
|
|
.dismissOnTouchOutside(!noDismissOnBlank)
|
|
.dismissOnBackPressed(!noDismissOnBack)
|
|
.setPopupCallback(newSimpleCallback({
|
|
onDismiss(basePopupView) {
|
|
countDownLatch.countDown();
|
|
}
|
|
}))
|
|
.asConfirm(getDefaultValue(title, "string", null), getDefaultValue(content, "string", ""), getDefaultValue(cancelTitle, "string", "取消"), getDefaultValue(okTitle, "string", "确认"), () => {
|
|
result = true;
|
|
}, () => {
|
|
result = false;
|
|
}, !!hideCancel)
|
|
);
|
|
countDownLatch.await();
|
|
return result;
|
|
}
|
|
|
|
function inputConfirmSync({
|
|
title,
|
|
content,
|
|
defaultValue,
|
|
hint,
|
|
textarea,
|
|
maxTextarea,
|
|
hideCancel,
|
|
noAutoSoft,
|
|
noDismissOnBack,
|
|
noDismissOnBlank
|
|
}) {
|
|
let countDownLatch = new java.util.concurrent.CountDownLatch(1);
|
|
let result = "";
|
|
showOnUI(
|
|
builderXPopup()
|
|
.autoOpenSoftInput(!noAutoSoft)
|
|
.autoFocusEditText(!noAutoSoft)
|
|
.dismissOnTouchOutside(!noDismissOnBlank)
|
|
.dismissOnBackPressed(!noDismissOnBack)
|
|
.setPopupCallback(newSimpleCallback({
|
|
onCreated(basePopupView) {
|
|
if (hideCancel) {
|
|
let cancelTextView = basePopupView.findViewById(R.id.tv_cancel);
|
|
if (cancelTextView) {
|
|
cancelTextView.setVisibility(8);
|
|
}
|
|
let dividerView = basePopupView.findViewById(R.id.xpopup_divider2);
|
|
if (dividerView) {
|
|
dividerView.setVisibility(8);
|
|
}
|
|
}
|
|
},
|
|
onDismiss(basePopupView) {
|
|
countDownLatch.countDown();
|
|
}
|
|
}))
|
|
.asInputConfirm(getDefaultValue(title, "string", null), getDefaultValue(content, "string", null), getDefaultValue(defaultValue, "string", null), getDefaultValue(hint, "string", null), (text) => {
|
|
result = text;
|
|
}, null, maxTextarea ? R.layout.xpopup_confirm_input_max : (textarea ? R.layout.xpopup_confirm_input : 0))
|
|
);
|
|
countDownLatch.await();
|
|
return result;
|
|
}
|
|
|
|
function dialogShowOnUI(dialogBuilder, callBack) {
|
|
runOnUI(() => {
|
|
let dialog = dialogBuilder.create();
|
|
DialogUtil.INSTANCE.showAsCard(getActivityContext(), dialog);
|
|
if (callBack) {
|
|
callBack(dialog);
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
function setAlertDialogButton({
|
|
rightTitle,
|
|
rightClick,
|
|
leftTitle,
|
|
leftClick,
|
|
centerTitle,
|
|
centerClick
|
|
}, dialogBuilder, getParam) {
|
|
if (rightTitle || rightClick) {
|
|
rightClick = getDefaultValue(rightClick, "function", null);
|
|
dialogBuilder.setPositiveButton(getDefaultValue(rightTitle, "string", "确认"), (dialog) => {
|
|
tryCallBack(rightClick, getParam(dialog));
|
|
});
|
|
}
|
|
if (leftTitle || leftClick) {
|
|
leftClick = getDefaultValue(leftClick, "function", null);
|
|
dialogBuilder.setNeutralButton(getDefaultValue(leftTitle, "string", "忽略"), (dialog) => {
|
|
tryCallBack(leftClick, getParam(dialog));
|
|
});
|
|
}
|
|
if (centerTitle || centerClick) {
|
|
centerClick = getDefaultValue(centerClick, "function", null);
|
|
dialogBuilder.setNegativeButton(getDefaultValue(centerTitle, "string", "取消"), (dialog) => {
|
|
tryCallBack(centerClick, getParam(dialog));
|
|
});
|
|
}
|
|
}
|
|
|
|
function setAlertDialogButtonTitle({
|
|
rightTitle,
|
|
rightClick,
|
|
leftTitle,
|
|
leftClick,
|
|
centerTitle,
|
|
centerClick
|
|
}, dialogBuilder) {
|
|
if (rightTitle || rightClick) {
|
|
dialogBuilder.setPositiveButton(getDefaultValue(rightTitle, "string", "确认"), null);
|
|
}
|
|
if (leftTitle || leftClick) {
|
|
dialogBuilder.setNeutralButton(getDefaultValue(leftTitle, "string", "忽略"), null);
|
|
}
|
|
if (centerTitle || centerClick) {
|
|
dialogBuilder.setNegativeButton(getDefaultValue(centerTitle, "string", "取消"), null);
|
|
}
|
|
}
|
|
|
|
function setAlertDialogButtonFunc({
|
|
rightTitle,
|
|
rightClick,
|
|
leftTitle,
|
|
leftClick,
|
|
centerTitle,
|
|
centerClick
|
|
}, dialog, getParam) {
|
|
const DialogInterface = android.content.DialogInterface;
|
|
if (rightTitle || rightClick) {
|
|
rightClick = getDefaultValue(rightClick, "function", null);
|
|
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(() => {
|
|
tryCallBack(rightClick, getParam(dialog));
|
|
});
|
|
}
|
|
if (leftTitle || leftClick) {
|
|
leftClick = getDefaultValue(leftClick, "function", null);
|
|
dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener(() => {
|
|
tryCallBack(leftClick, getParam(dialog));
|
|
});
|
|
}
|
|
if (centerTitle || centerClick) {
|
|
centerClick = getDefaultValue(centerClick, "function", null);
|
|
dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener(() => {
|
|
tryCallBack(centerClick, getParam(dialog));
|
|
});
|
|
}
|
|
}
|
|
|
|
function multiChoice({
|
|
title,
|
|
options,
|
|
checkedIndexs,
|
|
noAutoDismiss,
|
|
onChoice,
|
|
}) {
|
|
options = getStringArray(options, []);
|
|
checkedIndexs = getDefaultValue(checkedIndexs, "array", []);
|
|
let checkedItems = new Array(options.length).fill(false);
|
|
checkedIndexs.forEach(i => checkedItems[i] = true);
|
|
checkedItems.length = options.length;
|
|
onChoice = getDefaultValue(onChoice, "function", null);
|
|
let setItemChecked = (dialog, newcheckedIndexs) => {
|
|
if (!Array.isArray(newcheckedIndexs)) return;
|
|
|
|
checkedItems.fill(false);
|
|
newcheckedIndexs.forEach(i => checkedItems[i] = true);
|
|
|
|
let listView = dialog.getListView();
|
|
|
|
for (let i = 0; i < options.length; i++) {
|
|
listView.setItemChecked(i, checkedItems[i]);
|
|
}
|
|
listView.getAdapter().notifyDataSetChanged();
|
|
};
|
|
let dialogBuilder = new AlertDialog.Builder(getActivityContext())
|
|
.setTitle(getDefaultValue(title, "string", null))
|
|
.setMultiChoiceItems(options, checkedItems, (v, i, b) => {
|
|
checkedItems[i] = b;
|
|
tryCallBack(onChoice, [i, b]);
|
|
});
|
|
|
|
if (noAutoDismiss) {
|
|
setAlertDialogButtonTitle(arguments[0], dialogBuilder);
|
|
dialogShowOnUI(dialogBuilder, (dialog) => {
|
|
setAlertDialogButtonFunc(arguments[0], dialog, () => [options, checkedItems, setItemChecked.bind(null, dialog), dialog.dismiss.bind(dialog)]);
|
|
});
|
|
} else {
|
|
setAlertDialogButton(arguments[0], dialogBuilder, () => [options, checkedItems]);
|
|
dialogShowOnUI(dialogBuilder);
|
|
}
|
|
}
|
|
|
|
function getSeekAndLayout(max, pos, onChange) {
|
|
const Bundle = android.os.Bundle;
|
|
const LinearLayout = android.widget.LinearLayout;
|
|
const SeekBar = android.widget.SeekBar;
|
|
const TextView = android.widget.TextView;
|
|
const Gravity = android.view.Gravity;
|
|
const View = android.view.View;
|
|
const LayoutParams = android.view.ViewGroup.LayoutParams;
|
|
const RelativeLayout = android.widget.RelativeLayout;
|
|
const ImageView = android.widget.ImageView;
|
|
const Spanned = android.text.Spanned;
|
|
const Html = android.text.Html;
|
|
let linearLayout = new LinearLayout(getActivityContext());
|
|
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
|
linearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
|
linearLayout.setPadding(65, 50, 60, 50);
|
|
|
|
let titleStart = new TextView(getActivityContext());
|
|
titleStart.setId(View.generateViewId());
|
|
titleStart.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
|
|
titleStart.setTextSize(17);
|
|
titleStart.setPadding(0, 0, 0, 20);
|
|
let initText = tryCallBack(onChange, [pos, max, Html.fromHtml], true);
|
|
if (typeof initText === "string" || initText instanceof Spanned) {
|
|
titleStart.setText(initText);
|
|
}
|
|
let relativeLayout = new RelativeLayout(getActivityContext());
|
|
relativeLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
|
|
|
let startImgStart = new ImageView(getActivityContext());
|
|
startImgStart.setId(View.generateViewId());
|
|
startImgStart.setLayoutParams(new LayoutParams(32, 32));
|
|
startImgStart.setPadding(4, 4, 4, 4);
|
|
startImgStart.setImageResource(R.drawable.ic_arrow_start);
|
|
|
|
let startImgEnd = new ImageView(getActivityContext());
|
|
startImgEnd.setId(View.generateViewId());
|
|
startImgEnd.setLayoutParams(new LayoutParams(32, 32));
|
|
startImgEnd.setPadding(4, 4, 4, 4);
|
|
startImgEnd.setImageResource(R.drawable.ic_arrow_end);
|
|
|
|
let seekBar = new SeekBar(getActivityContext());
|
|
seekBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
|
|
seekBar.setMax(max);
|
|
seekBar.setProgress(pos);
|
|
|
|
linearLayout.addView(titleStart);
|
|
linearLayout.addView(relativeLayout);
|
|
|
|
let layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
|
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
|
|
startImgStart.setLayoutParams(layoutParams);
|
|
relativeLayout.addView(startImgStart);
|
|
|
|
layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
|
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
|
|
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
|
|
startImgEnd.setLayoutParams(layoutParams);
|
|
relativeLayout.addView(startImgEnd);
|
|
|
|
layoutParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
|
|
layoutParams.addRule(RelativeLayout.END_OF, startImgStart.getId());
|
|
layoutParams.addRule(RelativeLayout.START_OF, startImgEnd.getId());
|
|
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
|
|
seekBar.setLayoutParams(layoutParams);
|
|
relativeLayout.addView(seekBar);
|
|
|
|
startImgStart.setOnClickListener(() => {
|
|
let progress = seekBar.getProgress();
|
|
if (progress <= 0 || progress > max) {
|
|
return;
|
|
}
|
|
seekBar.setProgress(progress - 1);
|
|
});
|
|
startImgEnd.setOnClickListener(() => {
|
|
let progress = seekBar.getProgress();
|
|
if (progress < 0 || progress >= max) {
|
|
return;
|
|
}
|
|
seekBar.setProgress(progress + 1);
|
|
});
|
|
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener({
|
|
onProgressChanged(seekBar, progress, fromUser) {
|
|
let res = tryCallBack(onChange, [progress, max, Html.fromHtml], true);
|
|
if (typeof res === "string" || initText instanceof Spanned) {
|
|
titleStart.setText(res);
|
|
}
|
|
},
|
|
onStartTrackingTouch(seekBar) {},
|
|
onStopTrackingTouch(seekBar) {}
|
|
}));
|
|
return [seekBar, linearLayout];
|
|
}
|
|
|
|
function seekCenter({
|
|
title,
|
|
max,
|
|
pos,
|
|
onChange,
|
|
}) {
|
|
max = parseInt(max), pos = parseInt(pos) || 0;
|
|
if (!max || max < pos || pos < 0) {
|
|
throw Error("max和pos必须为整数,且max>0,max>=pos>=0");
|
|
}
|
|
let builder = new AlertDialog.Builder(getActivityContext());
|
|
builder.setTitle(getDefaultValue(title, "string", null));
|
|
let [seekBar, linearLayout] = getSeekAndLayout(max, pos, onChange);
|
|
setAlertDialogButton(arguments[0], builder, () => [Number(seekBar.getProgress()), max]);
|
|
builder.setView(linearLayout);
|
|
dialogShowOnUI(builder);
|
|
}
|
|
|
|
function canBiometric() {
|
|
return Number(BiometricManager.from(getActivityContext()).canAuthenticate())
|
|
}
|
|
|
|
function checkByBiometric(success) {
|
|
if (typeof success !== "function") return;
|
|
let can = canBiometric();
|
|
if (can !== 0) return can;
|
|
runOnUI(() => {
|
|
com.example.hikerview.ui.setting.office.MoreSettingOfficer.INSTANCE.checkByBiometric(getActivityContext(), () => {
|
|
tryCallBack(success, [], true);
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
function decodeQRCode(path) {
|
|
let result = null;
|
|
try {
|
|
let bitmap = android.graphics.BitmapFactory.decodeFile(path);
|
|
if (bitmap == null) return result;
|
|
let hints = new java.util.Hashtable();
|
|
let width = bitmap.getWidth();
|
|
let height = bitmap.getHeight();
|
|
let pixels = java.lang.reflect.Array.newInstance(java.lang.Class.forName("java.lang.Integer"), width * height);
|
|
pixels = java.util.Arrays.stream(pixels).mapToInt(v => 0).toArray();
|
|
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
|
|
let source = new com.google.zxing.RGBLuminanceSource(width, height, pixels);
|
|
let binaryBitmap = new com.google.zxing.BinaryBitmap(new com.google.zxing.common.HybridBinarizer(source));
|
|
let decodedResult = new com.google.zxing.MultiFormatReader().decode(binaryBitmap, hints);
|
|
result = String(decodedResult.getText());
|
|
} catch (e) {}
|
|
return result;
|
|
}
|
|
|
|
|
|
$.exports = {
|
|
confirm,
|
|
inputAutoRow,
|
|
inputConfirm,
|
|
selectCenter,
|
|
selectCenterMark,
|
|
selectBottom,
|
|
selectBottomMark,
|
|
IconExtraMenu,
|
|
selectCenterIcon,
|
|
inputTwoRow,
|
|
selectBottomSettingMenu,
|
|
selectBottomRes,
|
|
ResExtraInputBox,
|
|
infoBottom,
|
|
copyBottom,
|
|
selectCenterColor,
|
|
confirmSync,
|
|
inputConfirmSync,
|
|
icon: R.drawable,
|
|
chefSnackbarMake,
|
|
toastMeg,
|
|
playVideos,
|
|
getClipTopData,
|
|
multiChoice,
|
|
seekCenter,
|
|
setUseStartActivity,
|
|
runOnNewThread,
|
|
runOnUIThread: runOnUI,
|
|
canBiometric,
|
|
checkByBiometric,
|
|
decodeQRCode,
|
|
selectAttachList,
|
|
selectBottomResIcon,
|
|
updateRecordsBottom
|
|
}; |