diff --git a/source/SkyAutoplayer.js b/source/SkyAutoplayer.js index 44a5501..182302f 100644 --- a/source/SkyAutoplayer.js +++ b/source/SkyAutoplayer.js @@ -64,41 +64,122 @@ sheetmgr = { rootDir: android.os.Environment.getExternalStorageDirectory() + "/Android/data/com.Maple.SkyStudio/files/Sheet/", encoding: "utf-16le", - cachedSheetList: [], + cachedLocalSheetList: [], + cachedOnlineSharedSheetInfoList: [], - getSheetList: function(forceRefresh, listener) { - if(this.cachedSheetList.length == 0 || forceRefresh) { + getLocalSheetList: function(forceRefresh, listener) { + if(this.cachedLocalSheetList.length == 0 || forceRefresh) { this.__internal_fetchLocalSheets(listener); } - return this.cachedSheetList; + return this.cachedLocalSheetList; + }, + getOnlineSharedSheetInfoList: function(forceRefresh) { + if(this.cachedOnlineSharedSheetInfoList.length == 0 || forceRefresh) { + this.__internal_fetchOnlineSharedSheets(); + } + return this.cachedOnlineSharedSheetInfoList; + }, + + downloadAndLoad: function(file, listener) { + listener({status:1}); + var remoteHost = "https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/shared_sheets/" + file; + var resp = http.get(remoteHost); + if(resp.statusCode >= 200 && resp.statusCode < 300) { + var sheet = files.join(this.rootDir, files.getNameWithoutExtension(file) + (function(length) { + var string = "0123456789abcde"; + var stringBuffer = new java.lang.StringBuffer(); + for (var i = 0; i < length; i++) { + stringBuffer.append(string.charAt(Math.round(Math.random() * (string.length - 1)))); + } + return stringBuffer.toString(); + } (7)) + ".txt"); + files.create(sheet); + files.writeBytes(sheet, resp.body.bytes()); + listener({status:2}); + var readable = files.open(sheet, "r", this.encoding); + var parsed = eval(readable.read())[0]; + readable.close(); + parsed.songNotes = this.parseSongNote(parsed.songNotes); + this.cachedLocalSheetList.push(parsed); + listener({status:3}); + } else { + listener({status:-1, msg: "获取 " + remoteHost + " 失败,原因:" + resp.statusMessage}); + } }, __internal_fetchLocalSheets: function(listener) { var sheets = files.listDir(this.rootDir, function(name){return name.endsWith(".txt");}); - this.cachedSheetList.length = 0; + this.cachedLocalSheetList.length = 0; for(var i in sheets) { if(listener != null) listener(i); var readable = files.open(files.join(this.rootDir, sheets[i]), "r", this.encoding); var parsed = eval(readable.read())[0]; readable.close(); - parsed.songNotes = (function(raw){ - var r = []; - var t_time = 0; - var t_sets = []; - for(var i in raw) { - var key = Number(raw[i].key.replace(/^(\d)Key(\d{1,})$/, "$2")); - if(raw[i].time != t_time) { - r.push({time: t_time, keys: t_sets}); - t_sets = []; - t_time = raw[i].time; - } - if(t_sets.indexOf(key) == -1) t_sets.push(key); - } - return r; - }(parsed.songNotes)); - this.cachedSheetList.push(parsed); + parsed.songNotes = this.parseSongNote(parsed.songNotes); + parsed.fileName = sheets[i]; + this.cachedLocalSheetList.push(parsed); } }, + __internal_fetchOnlineSharedSheets: function() { + var remoteHost = "https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/shared_sheets.json"; + var data = http.get(remoteHost).body.json(); + this.cachedOnlineSharedSheetInfoList = data.sheets; + }, + + parseSongNote: function(raw) { + var r = []; + var t_time = 0; + var t_sets = []; + for(var i in raw) { + var key = Number(raw[i].key.replace(/^(\d)Key(\d{1,})$/, "$2")); + if(raw[i].time != t_time) { + r.push({time: t_time, keys: t_sets}); + t_sets = []; + t_time = raw[i].time; + } + if(t_sets.indexOf(key) == -1) t_sets.push(key); + } + return r; + }, + + pitch_suggestion: [{ + name: "C", + places: ["境遇", "墓土四龙图", "雨林终点神庙音乐结束后" ] + }, { + name: "D♭", + places: ["云野八人升降梯", "雨林鱼骨图水母升起前" ] + }, { + name: "D", + places: ["云野球形洞(通过云洞)", "雨林起点(不飞下去)", + "霞谷终点(一堆蜡烛)", "墓土远古战场"] + }, { + name: "E♭", + places: ["雨林第一个门后右边的拱形洞内", "墓土破旧神庙" ] + }, { + name: "E", + places: ["重生之路", "暴风眼起始位置" ] + }, { + name: "F", + places: ["雨林右隐藏图", "霞谷霞光城", "禁阁一楼"] + }, { + name: "G♭", + places: ["雨林鱼骨图释放被困海蜇或鳐后"] + }, { + name: "G", + places: ["雨林鱼骨图水母升起后"] + }, { + name: "A♭", + places: ["霞谷终点观众席"] + }, { + name: "A", + places: ["禁阁四楼"] + }, { + name: "B♭", + places: ["雨林起点(不飞下去)右边空地"] + }, { + name: "B", + places: ["雨林鱼骨图水母升起后", "霞谷任意赛道中", "禁阁二楼"] + }], }; sheetplayer = { @@ -128,6 +209,7 @@ sheetplayer = { if(sheetplayer.mode == 1) { click(config.values.key_coordinates[e][0], config.values.key_coordinates[e][1]); } else if(sheetplayer.mode == 2){ + //Tap(config.values.key_coordinates[e][0], config.values.key_coordinates[e][1]); sheetplayer.rootAutomator.press(config.values.key_coordinates[e][0], config.values.key_coordinates[e][1], 75); } });}); @@ -184,7 +266,7 @@ config = { skipRunScriptTip: false, skipOpenWindowTip: false, skipOnlineUploadSkip: false, - currentVersion: 2, + currentVersion: 3, play_mode: 1, //1 = Accessbility, 2 = RootAutomator gitVersion: "", }, @@ -206,6 +288,7 @@ config = { checkVersion: function() { this.values.gitVersion = http.get("https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/gitVersion").body.string(); + //this.values.gitVersion = "b8b694aa74de3bccfb2e0f432b49a16e9c8846bc"; var periodVersion = this._global_storage.get("version", this.values.currentVersion); var currentVersion = this.values.currentVersion; if(periodVersion < currentVersion) { @@ -226,7 +309,7 @@ config = { fetchResources: function(listener) { var remoteHost = "https://cdn.jsdelivr.net/gh/StageGuard/SkyAutoPlayerScript@" + this.values.gitVersion + "/resources/"; - var resourceList = ["local.png", "online.png", "play.png", "pause.png", "refresh.png", "settings.png"]; + var resourceList = ["local.png", "online.png", "play.png", "pause.png", "refresh.png", "settings.png", "info.png", "download.png", "bin.png"]; var localRootDir = android.os.Environment.getExternalStorageDirectory() + "/Documents/SkyAutoPlayer/"; var downloadQueue = []; var tryCount = 1; @@ -506,7 +589,6 @@ gui = { config: { colors: { background: android.graphics.Color.parseColor("#212121"), - primary: android.graphics.Color.parseColor("#009688"), text: android.graphics.Color.WHITE, dark_text: android.graphics.Color.BLACK, sec_text: android.graphics.Color.parseColor("#7B7B7B"), @@ -855,6 +937,15 @@ gui = { } if(j instanceof Object) gui.main.views.push(j); }, + + getPage: function(index) { + for(var i in gui.main.views) { + if(gui.main.views[i].index == index) { + return gui.main.views[i]; + } + } + }, + removePage: function(index) { for(var i in gui.main.views) { if(gui.main.views[i].index == index) { @@ -898,7 +989,7 @@ gui = { s.statusBar = new android.widget.RelativeLayout(ctx); s.statusBar.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-1, dp * gui.main.status_bar_height)); - s.statusBar.setBackgroundColor(gui.config.colors.primary); + s.statusBar.setBackgroundColor(gui.config.colors.background); s.statusBar.setElevation(10 * dp); gui.main._global_title = new android.widget.TextView(ctx); @@ -1640,13 +1731,56 @@ gui.dialogs.showProgressDialog(function(o) { self.relative.addView(self.author); self.play = new android.widget.ImageView(ctx); + self.play.setId(12); self.play.setScaleType(android.widget.ImageView.ScaleType.CENTER_CROP); - self.play.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(dp * 22, dp * 22)); - self.play.getLayoutParams().setMargins(dp * 15, dp * 15, dp * 15, dp * 15); + self.play.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(dp * 25, dp * 25)); + self.play.getLayoutParams().setMargins(dp * 7, dp * 15, dp * 15, dp * 15); self.play.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_RIGHT); self.play.getLayoutParams().addRule(android.widget.RelativeLayout.CENTER_VERTICAL); - self.play.setImageBitmap(config.bitmaps.play ); + self.play.setImageBitmap(config.bitmaps.play); + self.play.measure(0, 0); + self.play.setBackgroundDrawable(gui.utils.ripple_drawable(self.play.getMeasuredWidth(), self.play.getMeasuredHeight(), "rect")); + self.play.setOnClickListener(new android.view.View.OnClickListener({ + onClick: function() { + if(config.values.key_coordinates.length == 15 && gui.main.isShowing) { + sheetplayer.setSheet(element); + gui.main.__internal_dismiss(); + gui.player_panel.__internal_showPanel(); + } else { + toast("未设置键位坐标或坐标数据错误,请前往设置页设置键位坐标"); + } + } + })); + + self.delete = new android.widget.ImageView(ctx); + self.delete.setScaleType(android.widget.ImageView.ScaleType.CENTER_CROP); + self.delete.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(dp * 25, dp * 25)); + self.delete.getLayoutParams().setMargins(dp * 15, dp * 15, dp * 7, dp * 15); + self.delete.getLayoutParams().addRule(android.widget.RelativeLayout.LEFT_OF, 12); + self.delete.getLayoutParams().addRule(android.widget.RelativeLayout.CENTER_VERTICAL); + self.delete.setImageBitmap(config.bitmaps.bin); + self.delete.measure(0, 0); + self.delete.setBackgroundDrawable(gui.utils.ripple_drawable(self.delete.getMeasuredWidth(), self.delete.getMeasuredHeight(), "rect")); + self.delete.setOnClickListener(new android.view.View.OnClickListener({ + onClick: function() { + var path = files.join(sheetmgr.rootDir, element.fileName); + gui.dialogs.showConfirmDialog({ + title: "删除文件", + text: "确认要删除 " + path + " 吗?\n该操作不可恢复!", + canExit: true, + buttons: ["确认", "取消"], + callback: function(id) { + if(id == 0) { + files.remove(path); + gui.main.getPage(0).getSheetList(s, true); + } + }, + }); + } + })); + self.relative.addView(self.play); + self.relative.addView(self.delete); return self.relative; })); @@ -1655,13 +1789,71 @@ gui.dialogs.showProgressDialog(function(o) { s.ns0_listView.setAdapter(s.ns0_listAdapterController.self); s.ns0_listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ onItemClick: function(parent, view, pos, id) { - if(config.values.key_coordinates.length == 15 && gui.main.isShowing) { - sheetplayer.setSheet(s.ns0_listAdapterController.get(pos)); - gui.main.__internal_dismiss(); - gui.player_panel.__internal_showPanel(); - } else { - toast("未设置键位坐标或坐标数据错误,请前往设置页设置键位坐标"); - } + var item = s.ns0_listAdapterController.get(pos); + gui.dialogs.showDialog((function () { + var scr = new android.widget.ScrollView(ctx); + scr.setBackgroundColor(gui.config.colors.background); + var layout = new android.widget.LinearLayout(ctx); + layout.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-2, -2)); + layout.setOrientation(android.widget.LinearLayout.VERTICAL); + layout.setPadding(15 * dp, 15 * dp, 15 * dp, 5 * dp); + var title = new android.widget.TextView(ctx); + title.setText(item.name); + title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); + title.setPadding(0, 0, 0, 10 * dp); + title.setTextColor(gui.config.colors.text); + title.setTextSize(16); + layout.addView(title); + var text = new android.widget.TextView(ctx); + text.setText(android.text.Html.fromHtml( + "作者: " + (item.author.length == 0 ? "Not Provided" : item.author) + "
" + + "BPM: " + item.bpm + "
" + + "时长: " + (function(){ + var time_ms = item.songNotes[item.songNotes.length - 1].time; + var second_s = Math.floor(time_ms / 1000); + + var millis = time_ms - second_s * 1000; + var minute = Math.floor(second_s / 60); + var second = second_s - minute * 60; + + return minute + ":" + second + "." + millis; + }()) + "
" + + "
" + + "音高: " + (function(){ + var r = "
" + + "建议弹奏地点: " + (function(){ + var r = ""; + sheetmgr.pitch_suggestion[item.pitchLevel].places.map(function(e, i) { + r += "
* " + e + "" + }); + return r; + }()) + )); + text.setPadding(0, 0, 0, 10 * dp); + text.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); + text.setTextColor(gui.config.colors.sec_text); + text.setTextSize(14); + layout.addView(text); + scr.addView(layout) + return scr; + }()), -2, -2, null, true); } })); s.ns0_rl.addView(s.ns0_listView); @@ -1672,7 +1864,7 @@ gui.dialogs.showProgressDialog(function(o) { s.ns0_progress.setPadding(0, 0, 0, 0); s.ns0_progress.getLayoutParams().setMargins(0, 0, 0, 0); s.ns0_progress.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM); - s.ns0_progress.setProgressDrawable(new android.graphics.drawable.ColorDrawable(gui.config.colors.primary)); + s.ns0_progress.setProgressDrawable(new android.graphics.drawable.ColorDrawable(gui.config.colors.background)); s.ns0_progress.setIndeterminate(true); s.ns0_progress.setAlpha(0); @@ -1697,7 +1889,7 @@ gui.dialogs.showProgressDialog(function(o) { s.ns0_listAdapterController.notifyChange(); s.ns0_listView.setAlpha(1); threads.start(function() { - sheetmgr.getSheetList(isForce, function(i) { + sheetmgr.getLocalSheetList(isForce, function(i) { gui.run(function(){ gui.main._global_title.setText("加载中: 共" + i + "首乐谱"); s.ns0_listAdapterController.notifyChange(); @@ -1726,16 +1918,293 @@ gui.dialogs.showProgressDialog(function(o) { title: "共享乐谱", navigation_title: "共享乐谱", navigation_icon: config.bitmaps.online, + func: function(s) { + this.getOnlineSheetList(s, true); + }, + func_icon: android.graphics.Bitmap.createBitmap(config.bitmaps.refresh), view: function(s) { - s.ns - var text = new android.widget.TextView(ctx); - text.setText("Still working on it...\nNot avaliable now :)"); - text.setTextSize(18); - text.setGravity(android.view.Gravity.CENTER | android.view.Gravity.CENTER); - text.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, s._content_height)); - text.setTextColor(gui.config.colors.sec_text); - return text; - }, + s.ns1_rl = new android.widget.RelativeLayout(ctx); + s.ns1_rl.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, s._content_height)); + + s.ns1_listView = new android.widget.ListView(ctx); + s.ns1_listView.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, s._content_height)); + s.ns1_listView.setAdapter(s.ns1_listAdapter = new RhinoListAdapter([], function self(element) { + + self.relative = new android.widget.RelativeLayout(ctx); + self.relative.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2)); + + if(element.type == -1) { + self.upload = new android.widget.TextView(ctx); + self.upload.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER); + self.upload.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-2, -2)); + self.upload.getLayoutParams().setMargins(dp * 15, dp * 15, dp * 15, dp * 15); + self.upload.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_LEFT); + self.upload.setTextSize(13); + self.upload.setTextColor(gui.config.colors.sec_text); + self.upload.setText("上传乐谱"); + self.relative.addView(self.upload); + return self.relative; + } + + self.title = new android.widget.TextView(ctx); + self.title.setId(10); + self.title.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER); + self.title.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-2, -2)); + self.title.getLayoutParams().setMargins(dp * 15, dp * 15, dp * 15, dp * 1); + self.title.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_LEFT); + self.title.setTextSize(16); + self.title.setTextColor(gui.config.colors.text); + self.title.setText(element.name); + self.relative.addView(self.title); + + self.info = new android.widget.TextView(ctx); + self.info.setId(11); + self.info.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-2, -2)); + self.info.getLayoutParams().setMargins(dp * 15, dp * 1, dp * 15, dp * 2); + self.info.getLayoutParams().addRule(android.widget.RelativeLayout.BELOW, 10); + self.info.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_LEFT); + self.info.setTextSize(15); + self.info.setTextColor(gui.config.colors.text); + self.info.setText(element.author); + self.relative.addView(self.info); + + self.desc = new android.widget.TextView(ctx); + self.desc.setId(12); + self.desc.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-2, -2)); + self.desc.getLayoutParams().setMargins(dp * 15, dp * 2, dp * 15, dp * 15); + self.desc.getLayoutParams().addRule(android.widget.RelativeLayout.BELOW, 11); + self.desc.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_LEFT); + self.desc.setTextSize(13); + self.desc.setTextColor(gui.config.colors.sec_text); + self.desc.setText(android.text.Html.fromHtml(element.desc.replace(new RegExp("\x0a", "gi"), "
"))); + self.relative.addView(self.desc); + + self.download = new android.widget.ImageView(ctx); + self.download.setScaleType(android.widget.ImageView.ScaleType.CENTER_CROP); + self.download.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(dp * 25, dp * 25)); + self.download.getLayoutParams().setMargins(dp * 15, dp * 15, dp * 15, dp * 15); + self.download.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_RIGHT); + self.download.getLayoutParams().addRule(android.widget.RelativeLayout.CENTER_VERTICAL); + self.download.setImageBitmap(config.bitmaps.download); + self.download.measure(0, 0); + self.download.setBackgroundDrawable(gui.utils.ripple_drawable(self.download.getMeasuredWidth(), self.download.getMeasuredHeight(), "rect")); + self.download.setOnClickListener(new android.view.View.OnClickListener({ + onClick: function() { threads.start(function() { + sheetmgr.downloadAndLoad(element.file, function(r) { + switch(r.status) { + case 1: { + gui.run(function() { + self.status.setText("下载中..."); + self.relative.addView(self.status); + self.relative.addView(self.progress); + self.progress.setIndeterminate(true); + self.desc.getLayoutParams().setMargins(dp * 15, dp * 2, dp * 15, dp * 1); + gui.utils.value_animation("Float", 0, 1.0, 150, new android.view.animation.LinearInterpolator(), function(anim) { + self.progress.setAlpha(anim.getAnimatedValue()); + self.status.setAlpha(anim.getAnimatedValue()); + }); + }); + break; + } + case 2: { + if(gui.main.isShowing) gui.run(function() { + self.status.setText("解析中..."); + }); + break; + } + case 3: { + if(gui.main.isShowing) { gui.run(function() { + toast("下载完成: " + element.name + "\n请在本地曲谱页面刷新"); + gui.utils.value_animation("Float", 1, 0, 150, new android.view.animation.LinearInterpolator(), function(anim) { + self.progress.setAlpha(anim.getAnimatedValue()); + self.status.setAlpha(anim.getAnimatedValue()); + if(anim.getAnimatedValue() == 0) { + self.desc.getLayoutParams().setMargins(dp * 15, dp * 2, dp * 15, dp * 15); + self.relative.removeView(self.status); + self.relative.removeView(self.progress); + } + }); + });} + break; + } + case -1: { + if(gui.main.isShowing) { gui.run(function() { + self.status.setText("下载失败: " + r.msg); + self.progress.setIndeterminate(false); + });} + break; + } + } + }); + }); } + })); + self.relative.addView(self.download); + + self.status = new android.widget.TextView(ctx); + self.status.setId(13); + self.status.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-2, -2)); + self.status.getLayoutParams().setMargins(dp * 15, 0, dp * 15, 0); + self.status.getLayoutParams().addRule(android.widget.RelativeLayout.BELOW, 12); + self.status.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_LEFT); + self.status.setTextSize(13); + self.status.setAlpha(0); + self.status.setTextColor(gui.config.colors.text); + + //self.relative.addView(self.status); + + self.progress = new android.widget.ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal); + self.progress.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-1, dp * 15)); + self.progress.setPadding(0, 0, 0, 0); + self.progress.getLayoutParams().addRule(android.widget.RelativeLayout.BELOW, 13); + self.progress.getLayoutParams().setMargins(dp * 15, 0, dp * 15, dp * 5); + self.progress.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM); + self.progress.setProgressDrawable(new android.graphics.drawable.ColorDrawable(gui.config.colors.background)); + self.progress.setIndeterminate(false); + self.progress.setAlpha(0); + + //self.relative.addView(self.progress); + + return self.relative; + })); + s.ns1_listAdapterController = RhinoListAdapter.getController(s.ns1_listAdapter); + + s.ns1_listView.setAdapter(s.ns1_listAdapterController.self); + s.ns1_listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ + onItemClick: function(parent, view, pos, id) { + var item = s.ns1_listAdapterController.get(pos); + if(item.type == -1 || pos == 0) { + gui.dialogs.showConfirmDialog({ + title: "如何上传乐谱", + text: "共有两种方式可以上传乐谱:\n\n" + + "①酷安私信@StageGuard,发送时请附带简介,曲谱链接(百度云或其他云盘都可)\n" + + "②在github fork StageGuard/SkyAutoplayerScript,在shared_sheets文件夹添加你的曲谱,并按照格式修改shared_sheets.json\n\n" + + "注:若是转载转载请注明原作者同意\n\n" + + "如果所有人都白嫖,那么这个列表将永远也不会扩充", + canExit: true, + buttons: ["打开酷安", "打开Github", "取消"], + callback: function(id) { + if(id == 0) { + if(!app.launch("com.coolapk.market")) toast("应用 酷安 不存在!"); + } else if(id == 1) { + app.openUrl("https://github.com/StageGuard/SkyAutoplayerScript/"); + } + }, + }); + return true; + } + gui.dialogs.showDialog((function () { + var scr = new android.widget.ScrollView(ctx); + scr.setBackgroundColor(gui.config.colors.background); + var layout = new android.widget.LinearLayout(ctx); + layout.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-2, -2)); + layout.setOrientation(android.widget.LinearLayout.VERTICAL); + layout.setPadding(15 * dp, 15 * dp, 15 * dp, 5 * dp); + var title = new android.widget.TextView(ctx); + title.setText(item.name); + title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); + title.setPadding(0, 0, 0, 10 * dp); + title.setTextColor(gui.config.colors.text); + title.setTextSize(16); + layout.addView(title); + var text = new android.widget.TextView(ctx); + text.setText(android.text.Html.fromHtml( + "作者: " + (item.author.length == 0 ? "Not Provided" : item.author) + "
" + + "BPM: " + item.bpm + "
" + + "
" + + "音高: " + (function(){ + var r = "
" + + "建议弹奏地点: " + (function(){ + var r = ""; + sheetmgr.pitch_suggestion[item.pitchLevel].places.map(function(e, i) { + r += "
* " + e + "" + }); + return r; + }()) + + "

" + + "简介:
" + + item.desc.replace(new RegExp("\x0a", "gi"), "
") + + + "
" + )); + text.setPadding(0, 0, 0, 10 * dp); + text.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); + text.setTextColor(gui.config.colors.sec_text); + text.setTextSize(14); + layout.addView(text); + scr.addView(layout) + return scr; + }()), -2, -2, null, true); + } + })); + s.ns1_rl.addView(s.ns1_listView); + + s.ns1_progress = new android.widget.ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal); + s.ns1_progress.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-1, dp * 15)); + s.ns1_progress.setTranslationY(dp * 5); + s.ns1_progress.setPadding(0, 0, 0, 0); + s.ns1_progress.getLayoutParams().setMargins(0, 0, 0, 0); + s.ns1_progress.getLayoutParams().addRule(android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM); + s.ns1_progress.setProgressDrawable(new android.graphics.drawable.ColorDrawable(gui.config.colors.background)); + s.ns1_progress.setIndeterminate(true); + s.ns1_progress.setAlpha(0); + + s.ns1_rl.addView(s.ns1_progress); + return s.ns1_rl; + }, + update: function(s) { + if(s.initial) this.getOnlineSheetList(s, false); + }, + getOnlineSheetList: function(s, isForce) { + gui.run(function() { + s.ns1_progress.setIndeterminate(true); + s.ns1_listAdapterController.removeAll(); + s.ns1_listAdapterController.add({type: -1}); + gui.utils.value_animation("Float", 0, 1.0, 200, new android.view.animation.LinearInterpolator(), function(anim) { + gui.main._global_title.setAlpha(anim.getAnimatedValue()); + }); + gui.utils.value_animation("Float", 1.0, 0, 100, new android.view.animation.DecelerateInterpolator(), function(anim) { + s.ns1_listView.setAlpha(anim.getAnimatedValue()); + s.ns1_progress.setAlpha(1 - anim.getAnimatedValue()); + if(anim.getAnimatedValue() == 0) { + s.ns1_listAdapterController.notifyChange(); + s.ns1_listView.setAlpha(1); + gui.main._global_title.setText("获取列表中..."); + threads.start(function() { + sheetmgr.getOnlineSharedSheetInfoList(isForce).map(function(e, i) { + s.ns1_listAdapterController.add(e); + }); + gui.run(function() { + s.ns1_listAdapterController.notifyChange(); + gui.main._global_title.setText(gui.main.getPageInfo(s.index).title); + gui.utils.value_animation("Float", 0, 1.0, 200, new android.view.animation.DecelerateInterpolator(), function(anim) { + gui.main._global_title.setAlpha(anim.getAnimatedValue()); + s.ns1_listView.setAlpha(anim.getAnimatedValue()); + s.ns1_progress.setAlpha(1 - anim.getAnimatedValue()); + if(anim.getAnimatedValue() == 1.0) s.ns1_progress.setIndeterminate(false); + }); + }); + }); + } + }); + }); + } }); gui.main.addPage({ index: 2, @@ -1770,7 +2239,7 @@ gui.dialogs.showProgressDialog(function(o) { toast("按压方式已设置为 " + item.text + " 模式"); }, true); }, - },*/ { + }, */{ type: "default", name: "查看使用须知", onClick: function(v) { @@ -1859,7 +2328,16 @@ gui.dialogs.showProgressDialog(function(o) { callback: function(id) {}, }); } -}, false, true); +}, false, false); + +/*sheetmgr.downloadAndLoad("Nevada.txt", function(r) { + switch(r.status) { + case 1: toast("Downloading");break; + case 2: toast("Parsing");break; + case 3: toast("Parsed");break; + case -1: toast("Error: " + r.msg);break; + } +});*/ /*gui.dialogs.showOperateDialog([{ diff --git a/update_log.txt b/update_log.txt index c00833c..ebed1d2 100644 --- a/update_log.txt +++ b/update_log.txt @@ -1,3 +1,11 @@ +版本: 3 +更新时间: 2020.07.23 09:30 +更新内容: + * 启用"在线共享乐谱"功能 + * UI标题栏颜色改为灰色 + * 添加乐谱详情界面,点击列表项目查看 + * 修复BUG + 版本: 2 更新时间: 2020.07.22 13:23 更新内容: