├── .gradle ├── 7.4 │ ├── checksums │ │ ├── checksums.lock │ │ ├── md5-checksums.bin │ │ └── sha1-checksums.bin │ ├── dependencies-accessors │ │ ├── dependencies-accessors.lock │ │ └── gc.properties │ ├── executionHistory │ │ ├── executionHistory.bin │ │ └── executionHistory.lock │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ ├── fileHashes.bin │ │ ├── fileHashes.lock │ │ └── resourceHashesCache.bin │ └── gc.properties ├── buildOutputCleanup │ ├── buildOutputCleanup.lock │ ├── cache.properties │ └── outputFiles.bin ├── checksums │ ├── checksums.lock │ ├── md5-checksums.bin │ └── sha1-checksums.bin ├── file-system.probe └── vcs-1 │ └── gc.properties ├── .idea ├── .gitignore ├── assetWizardSettings.xml ├── compiler.xml ├── dbnavigator.xml ├── gradle.xml ├── misc.xml ├── modules │ └── stage.iml ├── navEditor.xml ├── other.xml ├── render.experimental.xml └── vcs.xml ├── LICENSE ├── README.en.md ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── thallo │ │ └── stage │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher_2-playstore.png │ ├── ic_launcher_3-playstore.png │ ├── ic_launcher_new-playstore.png │ ├── java │ │ └── com │ │ │ └── thallo │ │ │ └── stage │ │ │ ├── AboutFragment.java │ │ │ ├── BaseActivity.java │ │ │ ├── ContentType.java │ │ │ ├── CustomLinearLayout.java │ │ │ ├── DataHolder.kt │ │ │ ├── DownloadProgressObserver.java │ │ │ ├── FragmentHolder.java │ │ │ ├── HomeFragment.java │ │ │ ├── MyBaseAdapter.java │ │ │ ├── OSFragment.java │ │ │ ├── SearchChoice.java │ │ │ ├── SearchItem.java │ │ │ ├── Setting.java │ │ │ ├── SettingsFragment.java │ │ │ ├── StatusBar.java │ │ │ ├── WebSessionViewModel.java │ │ │ ├── bookmark │ │ │ ├── BookmarkFragment.java │ │ │ └── MyBookmarkAdapter.java │ │ │ ├── components │ │ │ ├── Qr.java │ │ │ ├── Shortcuts.kt │ │ │ ├── binding │ │ │ │ ├── AddressText.java │ │ │ │ └── ImageLoaderUtils.java │ │ │ ├── dialog │ │ │ │ ├── AgreementDialog.java │ │ │ │ ├── AlertDialog.java │ │ │ │ ├── BookmarkDialog.java │ │ │ │ ├── ContentPermissionDialog.java │ │ │ │ ├── ContextMenuDialog.java │ │ │ │ ├── JsChoiceDialog.java │ │ │ │ ├── PermissionDialog.java │ │ │ │ ├── SearchSelectDialog.java │ │ │ │ ├── WebDialog.java │ │ │ │ └── myDialog.java │ │ │ ├── filePicker │ │ │ │ ├── FilePicker.java │ │ │ │ ├── GetFile.java │ │ │ │ └── PickUtils.java │ │ │ └── popup │ │ │ │ ├── AddonsInformationPopup.java │ │ │ │ ├── DIYPopup.java │ │ │ │ ├── InformationPopup.java │ │ │ │ ├── IntentPopup.java │ │ │ │ ├── MyBottomSheetDialog.java │ │ │ │ ├── PopUp.java │ │ │ │ ├── SearchPopup.java │ │ │ │ ├── SettingPopUp.java │ │ │ │ └── TabsPopup.java │ │ │ ├── database │ │ │ ├── StageData.java │ │ │ ├── UserConverters.kt │ │ │ ├── bookmark │ │ │ │ ├── Bookmark.java │ │ │ │ ├── BookmarkDao.java │ │ │ │ ├── BookmarkRepository.java │ │ │ │ └── BookmarkViewModel.java │ │ │ ├── download │ │ │ │ ├── Download.java │ │ │ │ ├── DownloadDao.java │ │ │ │ ├── DownloadRepository.java │ │ │ │ └── DownloadViewModel.java │ │ │ └── history │ │ │ │ ├── History.java │ │ │ │ ├── HistoryDao.java │ │ │ │ ├── HistoryRepository.java │ │ │ │ └── HistoryViewModel.java │ │ │ ├── download │ │ │ ├── DownloadAdapter.java │ │ │ ├── DownloadFragment.java │ │ │ └── DownloadUtils.java │ │ │ ├── extension │ │ │ ├── AddOns.java │ │ │ ├── AddonsAdapter.java │ │ │ ├── AddonsManagerFragment.java │ │ │ └── Controller.java │ │ │ ├── history │ │ │ ├── HistoryFragment.java │ │ │ └── MyAdapter.java │ │ │ ├── interfaces │ │ │ └── confirm.java │ │ │ └── tab │ │ │ ├── PageTab.java │ │ │ └── TabDetails.java │ └── res │ │ ├── anim │ │ ├── fad_in.xml │ │ └── fad_out.xml │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── bg_bar.xml │ │ ├── bg_dialog.xml │ │ ├── bg_edittext.xml │ │ ├── bg_qr.xml │ │ ├── bg_round.xml │ │ ├── bg_search_icon.xml │ │ ├── bg_setting.xml │ │ ├── bg_setting_anddons.xml │ │ ├── bg_setting_menu.xml │ │ ├── bg_shap.xml │ │ ├── bg_shortcuts.xml │ │ ├── bg_test.xml │ │ ├── bg_trans.xml │ │ ├── bg_white_rounded.xml │ │ ├── button_back.xml │ │ ├── circle_check.xml │ │ ├── ic_add.xml │ │ ├── ic_addons.xml │ │ ├── ic_android.xml │ │ ├── ic_arrow_up_right_circle.xml │ │ ├── ic_baidu.xml │ │ ├── ic_bing.xml │ │ ├── ic_brand_telegram.xml │ │ ├── ic_broken_lock.xml │ │ ├── ic_broken_shield.xml │ │ ├── ic_bulb.xml │ │ ├── ic_bulb_off.xml │ │ ├── ic_circle.xml │ │ ├── ic_circle2.xml │ │ ├── ic_circle_check.xml │ │ ├── ic_clear.xml │ │ ├── ic_clear_24.xml │ │ ├── ic_copy.xml │ │ ├── ic_delete.xml │ │ ├── ic_desk.xml │ │ ├── ic_desktop_on.xml │ │ ├── ic_download.xml │ │ ├── ic_edit.xml │ │ ├── ic_edit2.xml │ │ ├── ic_extensions.xml │ │ ├── ic_file.xml │ │ ├── ic_forward.xml │ │ ├── ic_google.xml │ │ ├── ic_history.xml │ │ ├── ic_home.xml │ │ ├── ic_information.xml │ │ ├── ic_internet.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_left.xml │ │ ├── ic_left_24.xml │ │ ├── ic_lock.xml │ │ ├── ic_menu.xml │ │ ├── ic_menu2.xml │ │ ├── ic_menu3.xml │ │ ├── ic_reload.xml │ │ ├── ic_right.xml │ │ ├── ic_round_star.xml │ │ ├── ic_safe.xml │ │ ├── ic_scan.xml │ │ ├── ic_scan_view.xml │ │ ├── ic_setting.xml │ │ ├── ic_share.xml │ │ ├── ic_shield.xml │ │ ├── ic_sogou.xml │ │ ├── ic_star.xml │ │ ├── ic_tabs.xml │ │ ├── ic_trash.xml │ │ ├── ic_video.xml │ │ ├── logo.png │ │ ├── progress.xml │ │ ├── progress_circle.xml │ │ ├── search.xml │ │ └── shirt.xml │ │ ├── layout-large │ │ └── activity_main.xml │ │ ├── layout │ │ ├── activity_fragment_holder.xml │ │ ├── activity_main.xml │ │ ├── addons_icons.xml │ │ ├── addons_list.xml │ │ ├── addons_list_item.xml │ │ ├── addons_manager_item.xml │ │ ├── addons_window.xml │ │ ├── content_fragment_holder.xml │ │ ├── dia_agreement.xml │ │ ├── dia_bookmark.xml │ │ ├── dia_choice.xml │ │ ├── dia_contextmenu.xml │ │ ├── dia_install.xml │ │ ├── dia_permission.xml │ │ ├── dia_search_select.xml │ │ ├── dia_web.xml │ │ ├── download_item.xml │ │ ├── fragment_about.xml │ │ ├── fragment_addons_manager.xml │ │ ├── fragment_bookmark.xml │ │ ├── fragment_download.xml │ │ ├── fragment_first.xml │ │ ├── fragment_history.xml │ │ ├── fragment_home.xml │ │ ├── fragment_main.xml │ │ ├── fragment_o_s.xml │ │ ├── fragment_second.xml │ │ ├── history_item.xml │ │ ├── home_icon.xml │ │ ├── n.xml │ │ ├── popup.xml │ │ ├── popup_diy.xml │ │ ├── popup_information.xml │ │ ├── popup_information_addons.xml │ │ ├── popup_intent.xml │ │ ├── popup_layout.xml │ │ ├── popup_qr.xml │ │ ├── popup_search.xml │ │ ├── popup_tabs.xml │ │ ├── qr_layout.xml │ │ ├── se_select.xml │ │ ├── setting.xml │ │ ├── setting_menu.xml │ │ ├── switch_item.xml │ │ ├── tab.xml │ │ └── test.xml │ │ ├── menu │ │ ├── addons_menu.xml │ │ └── bookmark_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher_3.xml │ │ └── ic_launcher_3_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher_3.png │ │ ├── ic_launcher_3_foreground.png │ │ └── ic_launcher_3_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher_3.png │ │ ├── ic_launcher_3_foreground.png │ │ └── ic_launcher_3_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher_3.png │ │ ├── ic_launcher_3_foreground.png │ │ └── ic_launcher_3_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher_3.png │ │ ├── ic_launcher_3_foreground.png │ │ └── ic_launcher_3_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher_3.png │ │ ├── ic_launcher_3_foreground.png │ │ └── ic_launcher_3_round.png │ │ ├── navigation │ │ ├── holder.xml │ │ └── nav_graph.xml │ │ ├── raw │ │ └── notfound.json │ │ ├── values-large │ │ └── dimens.xml │ │ ├── values-night │ │ ├── colors.xml │ │ └── themes.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_3_background.xml │ │ ├── ic_launcher_new_background.xml │ │ ├── strings.xml │ │ ├── style.xml │ │ └── themes.xml │ │ └── xml │ │ ├── activity_main_xml_constraintlayout_scene.xml │ │ ├── filepaths.xml │ │ └── root_preferences.xml │ └── test │ └── java │ └── com │ └── thallo │ └── stage │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle /.gradle/7.4/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/7.4/checksums/md5-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/checksums/md5-checksums.bin -------------------------------------------------------------------------------- /.gradle/7.4/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /.gradle/7.4/dependencies-accessors/dependencies-accessors.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock -------------------------------------------------------------------------------- /.gradle/7.4/dependencies-accessors/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/dependencies-accessors/gc.properties -------------------------------------------------------------------------------- /.gradle/7.4/executionHistory/executionHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/executionHistory/executionHistory.bin -------------------------------------------------------------------------------- /.gradle/7.4/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.gradle/7.4/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/7.4/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/7.4/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/7.4/fileHashes/resourceHashesCache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/fileHashes/resourceHashesCache.bin -------------------------------------------------------------------------------- /.gradle/7.4/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/7.4/gc.properties -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Sat Oct 01 14:17:38 SGT 2022 2 | gradle.version=7.4 3 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/outputFiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/buildOutputCleanup/outputFiles.bin -------------------------------------------------------------------------------- /.gradle/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/checksums/md5-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/checksums/md5-checksums.bin -------------------------------------------------------------------------------- /.gradle/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /.gradle/file-system.probe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/file-system.probe -------------------------------------------------------------------------------- /.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/.gradle/vcs-1/gc.properties -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/modules/stage.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/other.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/render.experimental.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /README.en.md: -------------------------------------------------------------------------------- 1 | # stage 2 | 3 | #### Description 4 | {**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} 5 | 6 | #### Software Architecture 7 | Software architecture description 8 | 9 | #### Installation 10 | 11 | 1. xxxx 12 | 2. xxxx 13 | 3. xxxx 14 | 15 | #### Instructions 16 | 17 | 1. xxxx 18 | 2. xxxx 19 | 3. xxxx 20 | 21 | #### Contribution 22 | 23 | 1. Fork the repository 24 | 2. Create Feat_xxx branch 25 | 3. Commit your code 26 | 4. Create Pull Request 27 | 28 | 29 | #### Gitee Feature 30 | 31 | 1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md 32 | 2. Gitee blog [blog.gitee.com](https://blog.gitee.com) 33 | 3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) 34 | 4. The most valuable open source project [GVP](https://gitee.com/gvp) 35 | 5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) 36 | 6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # stage 2 | 3 | #### 介绍 4 | 基于Geckoview开发的浏览器。 5 | #### 支持功能 6 | 1. 书签 7 | 2. 历史 8 | 3. 下载文件 9 | 4. 自定义主页 10 | 5. 安装附加组件 11 | 12 | 现版本的设计目的在于个人爱好以及探索与推广Geckoview, 13 | 软件的构架设计以及代码可能存在诸多不合理之处,请对Geckoview感兴趣的开发者仅作参考。 -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -dontwarn com.tencent.bugly.** 23 | -keep public class com.tencent.bugly.**{*;} 24 | # okhttp https://github.com/square/okhttp/#proguard 25 | -dontwarn okhttp3.** 26 | -dontwarn okio.** 27 | -dontwarn javax.annotation.** 28 | -dontwarn org.conscrypt.** 29 | # A resource is loaded with a relative path so the package of this class must be preserved. 30 | -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase 31 | 32 | # okdownload:okhttp 33 | -keepnames class com.liulishuo.okdownload.core.connection.DownloadOkHttp3Connection 34 | 35 | # okdownload:sqlite 36 | -keep class com.liulishuo.okdownload.core.breakpoint.BreakpointStoreOnSQLite { 37 | public com.liulishuo.okdownload.core.breakpoint.DownloadStore createRemitSelf(); 38 | public com.liulishuo.okdownload.core.breakpoint.BreakpointStoreOnSQLite(android.content.Context); 39 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/thallo/stage/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.thallo.stage", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/ic_launcher_2-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/app/src/main/ic_launcher_2-playstore.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher_3-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/app/src/main/ic_launcher_3-playstore.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher_new-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/app/src/main/ic_launcher_new-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/AboutFragment.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.content.Intent; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | import android.os.Bundle; 7 | 8 | import androidx.fragment.app.Fragment; 9 | 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | 14 | import com.google.android.material.bottomsheet.BottomSheetBehavior; 15 | import com.thallo.stage.databinding.FragmentAboutBinding; 16 | 17 | 18 | public class AboutFragment extends Fragment { 19 | FragmentAboutBinding binding; 20 | 21 | 22 | @Override 23 | public void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | 26 | } 27 | 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 30 | Bundle savedInstanceState) { 31 | binding=FragmentAboutBinding.inflate(inflater,container,false); 32 | binding.aboutTelegram.setOnClickListener(new View.OnClickListener() { 33 | @Override 34 | public void onClick(View view) { 35 | BaseActivity.url="https://t.me/stage_browser_channel"; 36 | Intent intent = new Intent(getContext(), BaseActivity.class); 37 | getContext().startActivity(intent); 38 | } 39 | }); 40 | binding.button5.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View view) { 43 | BaseActivity.url="https://static-6e7c68d2-83dd-40b0-9f09-0150b6b22138.bspapp.com/"; 44 | Intent intent = new Intent(getContext(), BaseActivity.class); 45 | getContext().startActivity(intent); 46 | } 47 | }); 48 | 49 | binding.button3.setOnClickListener(new View.OnClickListener() { 50 | @Override 51 | public void onClick(View view) { 52 | BaseActivity.url="https://static-6e7c68d2-83dd-40b0-9f09-0150b6b22138.bspapp.com/Stage%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96.html"; 53 | Intent intent = new Intent(getContext(), BaseActivity.class); 54 | getContext().startActivity(intent); 55 | } 56 | }); 57 | 58 | binding.button6.setOnClickListener(new View.OnClickListener() { 59 | @Override 60 | public void onClick(View view) { 61 | Intent intent = new Intent(getContext(), FragmentHolder.class); 62 | intent.putExtra("page","OS"); 63 | getContext().startActivity(intent); 64 | } 65 | }); 66 | PackageManager manager = getContext().getPackageManager(); 67 | try { 68 | PackageInfo info = manager.getPackageInfo("com.thallo.stage", 0); 69 | binding.textView21.setText(info.versionName+" 🐻"); 70 | } catch (PackageManager.NameNotFoundException e) { 71 | e.printStackTrace(); 72 | } 73 | 74 | 75 | 76 | 77 | // Inflate the layout for this fragment 78 | return binding.getRoot(); 79 | } 80 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/ContentType.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.icu.text.DateTimePatternGenerator; 4 | 5 | import org.webrtc.MediaStreamTrack; 6 | 7 | import java.io.IOException; 8 | import java.net.HttpURLConnection; 9 | import java.net.MalformedURLException; 10 | import java.net.URL; 11 | 12 | public class ContentType { 13 | 14 | 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/CustomLinearLayout.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.content.Context; 4 | import android.graphics.Rect; 5 | import android.os.Build; 6 | import android.util.AttributeSet; 7 | import android.view.WindowInsets; 8 | 9 | import androidx.annotation.RequiresApi; 10 | import androidx.coordinatorlayout.widget.CoordinatorLayout; 11 | 12 | public class CustomLinearLayout extends CoordinatorLayout { 13 | public CustomLinearLayout(Context context) { 14 | super(context); 15 | } 16 | 17 | public CustomLinearLayout(Context context, AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { 22 | super(context, attrs, defStyleAttr); 23 | } 24 | 25 | 26 | @Override 27 | protected boolean fitSystemWindows(Rect insets) { 28 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 29 | insets.left = 0; 30 | insets.top = 0; 31 | insets.right = 0; 32 | 33 | } 34 | return super.fitSystemWindows(insets); 35 | } 36 | 37 | @RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH) 38 | @Override 39 | public WindowInsets onApplyWindowInsets(WindowInsets insets) { 40 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 41 | return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, insets.getSystemWindowInsetTop(), 0, 0)); 42 | } else { 43 | return insets; 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/DataHolder.kt: -------------------------------------------------------------------------------- 1 | package com.thallo.stage 2 | 3 | import android.app.Application 4 | import android.widget.Toast 5 | 6 | class DataHolder: Application() { 7 | var ids: Array = emptyArray() 8 | fun set(id:Long){ 9 | ids.plus(id) 10 | Toast.makeText(this,"ok",Toast.LENGTH_SHORT).show() 11 | } 12 | 13 | override fun onCreate() { 14 | super.onCreate() 15 | 16 | 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/DownloadProgressObserver.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | 4 | import androidx.lifecycle.MutableLiveData; 5 | import androidx.lifecycle.ViewModel; 6 | 7 | public class DownloadProgressObserver extends ViewModel { 8 | 9 | // Create a LiveData with a String 10 | private MutableLiveData progress; 11 | 12 | public MutableLiveData getProgress() { 13 | if (progress == null) { 14 | progress = new MutableLiveData(); 15 | } 16 | return progress; 17 | } 18 | 19 | // Rest of the ViewModel... 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/SearchChoice.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | public class SearchChoice { 4 | private int imageID; 5 | private String name; 6 | 7 | public int getImageID() { 8 | return imageID; 9 | } 10 | 11 | public void setImageID(int imageID) { 12 | this.imageID = imageID; 13 | } 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public void setName(String name) { 20 | this.name = name; 21 | } 22 | 23 | public SearchChoice(int imageID, String name) { 24 | this.imageID = imageID; 25 | this.name = name; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/SearchItem.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ArrayAdapter; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | import androidx.annotation.NonNull; 12 | import androidx.annotation.Nullable; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | public class SearchItem extends ArrayAdapter { 18 | public SearchItem(@NonNull Context context, int resource, @NonNull List objects) { 19 | super(context, resource, objects); 20 | } 21 | @NonNull 22 | @Override 23 | public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 24 | View view= LayoutInflater.from(getContext()).inflate(R.layout.se_select,parent,false); 25 | ImageView icon=view.findViewById(R.id.imageView16); 26 | TextView name=view.findViewById(R.id.textView10); 27 | View view1=view.findViewById(R.id.view); 28 | SearchChoice searchChoice=getItem(position); 29 | icon.setImageResource(searchChoice.getImageID()); 30 | name.setText(searchChoice.getName()); 31 | return view; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/Setting.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.os.Bundle; 4 | import android.os.PersistableBundle; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | 8 | import androidx.annotation.Nullable; 9 | import androidx.appcompat.app.ActionBar; 10 | import androidx.appcompat.app.AppCompatActivity; 11 | 12 | import com.gyf.immersionbar.ImmersionBar; 13 | import com.thallo.stage.databinding.SettingBinding; 14 | 15 | public class Setting extends AppCompatActivity { 16 | SettingBinding binding; 17 | 18 | @Override 19 | protected void onCreate(@Nullable Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | binding = SettingBinding.inflate(LayoutInflater.from(this)); 22 | setContentView(binding.getRoot()); 23 | setSupportActionBar(binding.toolbar); 24 | ImmersionBar.with(this) 25 | .fitsSystemWindows(true) 26 | .statusBarColor(R.color.background) 27 | .navigationBarColor(R.color.background) 28 | .autoStatusBarDarkModeEnable(true,0.2f) 29 | .init(); 30 | getSupportFragmentManager().beginTransaction().replace(binding.settingCon.getId(), new SettingsFragment()).commit(); 31 | binding.toolbar.setNavigationOnClickListener(new View.OnClickListener() { 32 | @Override 33 | public void onClick(View v) { 34 | finish(); //返回 35 | } 36 | }); 37 | 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/SettingsFragment.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | 6 | import androidx.preference.ListPreference; 7 | import androidx.preference.Preference; 8 | import androidx.preference.PreferenceFragmentCompat; 9 | 10 | public class SettingsFragment extends PreferenceFragmentCompat { 11 | 12 | @Override 13 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 14 | setPreferencesFromResource(R.xml.root_preferences, rootKey); 15 | Preference addons=findPreference("settingAddons"); 16 | Preference about=findPreference("settingAbout"); 17 | Preference feedback=findPreference("setting_feedback"); 18 | ListPreference searchEngine=findPreference("searchEngine"); 19 | 20 | about.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 21 | @Override 22 | public boolean onPreferenceClick(Preference preference) { 23 | Intent intent = new Intent(getContext(), FragmentHolder.class); 24 | intent.putExtra("page","ABOUT"); 25 | getContext().startActivity(intent); 26 | return false; 27 | } 28 | }); 29 | addons.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 30 | @Override 31 | public boolean onPreferenceClick(Preference preference) { 32 | Intent intent = new Intent(getContext(), FragmentHolder.class); 33 | intent.putExtra("page","ADDONS"); 34 | getContext().startActivity(intent); 35 | return false; 36 | } 37 | }); 38 | 39 | feedback.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 40 | @Override 41 | public boolean onPreferenceClick(Preference preference) { 42 | BaseActivity.url="https://support.qq.com/product/427204"; 43 | Intent intent = new Intent(getContext(), BaseActivity.class); 44 | getContext().startActivity(intent); 45 | return false; 46 | } 47 | }); 48 | 49 | 50 | 51 | 52 | 53 | } 54 | 55 | 56 | 57 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/Qr.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components; 2 | 3 | import android.content.DialogInterface; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | 8 | import com.google.android.material.bottomsheet.BottomSheetDialog; 9 | import com.thallo.stage.BaseActivity; 10 | import com.thallo.stage.R; 11 | import com.thallo.stage.components.popup.MyBottomSheetDialog; 12 | 13 | import cn.bingoogolapple.qrcode.core.QRCodeView; 14 | import cn.bingoogolapple.qrcode.zxing.ZXingView; 15 | 16 | public class Qr { 17 | public void show(BaseActivity baseActivity){ 18 | MyBottomSheetDialog bottomSheetDialog = new MyBottomSheetDialog(baseActivity, R.style.BottomSheetDialog,0); 19 | View popView= LayoutInflater.from(baseActivity).inflate(R.layout.qr_layout,null ); 20 | 21 | ZXingView zXingView=popView.findViewById(R.id.zxingview); 22 | ImageView imageView=popView.findViewById(R.id.qrFlash); 23 | 24 | bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 25 | @Override 26 | public void onDismiss(DialogInterface dialogInterface) { 27 | zXingView.onDestroy(); 28 | 29 | 30 | } 31 | }); 32 | 33 | 34 | new Thread(){ 35 | @Override 36 | public void run() { 37 | super.run(); 38 | zXingView.startCamera(); 39 | zXingView.startSpot(); 40 | } 41 | }.start(); 42 | 43 | imageView.setOnClickListener(new View.OnClickListener() { 44 | boolean a=false; 45 | @Override 46 | public void onClick(View view) { 47 | if (!a) 48 | { 49 | imageView.setImageResource(R.drawable.ic_bulb); 50 | a=true; 51 | zXingView.openFlashlight(); 52 | } 53 | else {imageView.setImageResource(R.drawable.ic_bulb_off);a=false;zXingView.closeFlashlight();} 54 | } 55 | }); 56 | zXingView.setDelegate(new QRCodeView.Delegate() { 57 | @Override 58 | public void onScanQRCodeSuccess(String result) { 59 | baseActivity.getWebSessionViewModel().getSession().loadUri(result); 60 | bottomSheetDialog.dismiss(); 61 | 62 | } 63 | 64 | @Override 65 | public void onCameraAmbientBrightnessChanged(boolean isDark) { 66 | 67 | } 68 | 69 | @Override 70 | public void onScanQRCodeOpenCameraError() { 71 | 72 | } 73 | }); 74 | 75 | bottomSheetDialog.setContentView(popView); 76 | bottomSheetDialog.show(); 77 | 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/Shortcuts.kt: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.Canvas 5 | import android.graphics.Color 6 | import android.view.View 7 | 8 | class Shortcuts { 9 | /** 10 | * author: stone 11 | * email: aa86799@163.com 12 | * 13 | * 创建新的 Canvas + Bitmap对象,利用View的draw(canvas) 14 | */ 15 | fun createBitmapFromView(view: View): Bitmap? { 16 | val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) 17 | val canvas = Canvas(bitmap) 18 | canvas.drawColor(Color.WHITE) 19 | view.draw(canvas) 20 | return bitmap 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/binding/AddressText.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.binding; 2 | 3 | import android.widget.TextView; 4 | 5 | import androidx.databinding.BindingAdapter; 6 | 7 | public class AddressText { 8 | @BindingAdapter(value = {"titleToUrl","url"} ,requireAll = false) 9 | public static void titleToUrl(TextView view, String title,String url){ 10 | if (title==null) return; 11 | if (url==null) return; 12 | 13 | if(title=="新标签页") 14 | view.setText(""); 15 | else view.setText(url); 16 | 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/binding/ImageLoaderUtils.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.binding; 2 | 3 | import android.util.Log; 4 | import android.view.View; 5 | import android.widget.ImageView; 6 | 7 | import androidx.databinding.BindingAdapter; 8 | 9 | import com.thallo.stage.R; 10 | 11 | import com.bumptech.glide.Glide; 12 | 13 | import java.net.URI; 14 | 15 | public class ImageLoaderUtils { 16 | 17 | @BindingAdapter(value = {"imageUrl"} ,requireAll = false) 18 | public static void loadImage(ImageView view, String url){ 19 | if (url==null) return; 20 | 21 | URI uri=URI.create(url); 22 | String faviconUrl=uri.getScheme()+"://"+uri.getHost()+"/favicon.ico"; 23 | Glide.with(view.getContext()).load(faviconUrl).placeholder(R.drawable.ic_internet) 24 | .into(view); 25 | } 26 | 27 | @BindingAdapter(value = {"isSecure","pageUrl"} ,requireAll = false) 28 | public static void loadSecureImage(ImageView view, boolean isSecure,String url){ 29 | Log.d("isSecure",isSecure+""); 30 | if (url==null) return; 31 | else if (url.indexOf("about:blank") == -1) 32 | {view.setVisibility(View.VISIBLE);Log.d("YES",url);} 33 | else if (url.indexOf("about:blank") != -1) 34 | {view.setVisibility(View.GONE);Log.d("YES",url);} 35 | if (isSecure) view.setImageResource(R.drawable.ic_lock); 36 | else view.setImageResource(R.drawable.ic_broken_lock); 37 | } 38 | 39 | @BindingAdapter(value = {"isProtecting"} ,requireAll = false) 40 | public static void loadProtectingImage(ImageView view, boolean isSecure){ 41 | Log.d("isProtecting",isSecure+""); 42 | if (isSecure) view.setImageResource(R.drawable.ic_shield); 43 | else view.setImageResource(R.drawable.ic_broken_shield); 44 | 45 | } 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/dialog/AgreementDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.dialog; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.content.SharedPreferences; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | 10 | import androidx.annotation.NonNull; 11 | 12 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 13 | import com.thallo.stage.R; 14 | import com.thallo.stage.databinding.DiaAgreementBinding; 15 | 16 | public class AgreementDialog extends MaterialAlertDialogBuilder { 17 | DiaAgreementBinding binding; 18 | public AgreementDialog(@NonNull Context context, SharedPreferences.Editor mEditor) { 19 | super(context); 20 | binding=DiaAgreementBinding.inflate(LayoutInflater.from(context)); 21 | setView(binding.getRoot()); 22 | binding.agreement.setOnClickListener(new View.OnClickListener() { 23 | @Override 24 | public void onClick(View view) { 25 | WebDialog webDialog=new WebDialog(context,true); 26 | webDialog.show(); 27 | } 28 | }); 29 | binding.privacy.setOnClickListener(new View.OnClickListener() { 30 | @Override 31 | public void onClick(View view) { 32 | WebDialog webDialog=new WebDialog(context,false); 33 | webDialog.show(); 34 | } 35 | }); 36 | setPositiveButton(R.string.agree, new DialogInterface.OnClickListener() { 37 | @Override 38 | public void onClick(DialogInterface dialogInterface, int i) { 39 | mEditor.putBoolean("first",true).commit(); 40 | } 41 | }); 42 | setNegativeButton(R.string.disagree, new DialogInterface.OnClickListener() { 43 | @Override 44 | public void onClick(DialogInterface dialogInterface, int i) { 45 | Activity context1 = (Activity) context; 46 | context1.finish(); 47 | 48 | 49 | } 50 | }); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/dialog/AlertDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.dialog; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.os.Handler; 7 | import android.os.Looper; 8 | import android.os.Message; 9 | import android.util.Log; 10 | import android.widget.TextView; 11 | 12 | import androidx.annotation.NonNull; 13 | 14 | import com.thallo.stage.R; 15 | 16 | import org.mozilla.geckoview.GeckoSession; 17 | 18 | public class AlertDialog extends androidx.appcompat.app.AlertDialog { 19 | GeckoSession.PromptDelegate.PromptResponse dialogResult; 20 | Handler mHandler ; 21 | Context context; 22 | public AlertDialog(@NonNull Context context, GeckoSession.PromptDelegate.AlertPrompt alertPrompt) { 23 | super(context); 24 | this.context=context; 25 | onCreate(alertPrompt,context); 26 | } 27 | public void onCreate(GeckoSession.PromptDelegate.AlertPrompt alertPrompt, Context context) { 28 | setTitle(alertPrompt.title); 29 | setMessage(alertPrompt.message); 30 | setButton(BUTTON_POSITIVE, "确认", new OnClickListener() { 31 | @Override 32 | public void onClick(DialogInterface dialogInterface, int i) { 33 | endDialog(alertPrompt.dismiss()); 34 | } 35 | }); 36 | 37 | 38 | } 39 | public void endDialog(GeckoSession.PromptDelegate.PromptResponse result) 40 | { 41 | setDialogResult(result); 42 | super.dismiss(); 43 | Message m = mHandler.obtainMessage(); 44 | mHandler.sendMessage(m); 45 | Log.d("endDia",result+""); 46 | 47 | 48 | 49 | 50 | 51 | } 52 | @SuppressLint("HandlerLeak") 53 | public GeckoSession.PromptDelegate.PromptResponse showDialog() 54 | { 55 | mHandler = new Handler() { 56 | @Override 57 | public void handleMessage(Message mesg) { 58 | // process incoming messages here 59 | //super.handleMessage(msg); 60 | throw new RuntimeException(); 61 | } 62 | }; 63 | super.show(); 64 | try { 65 | Looper.getMainLooper().loop(); 66 | } 67 | catch(RuntimeException e2) 68 | { 69 | } 70 | return dialogResult; 71 | } 72 | 73 | public GeckoSession.PromptDelegate.PromptResponse getDialogResult() { 74 | return dialogResult; 75 | } 76 | 77 | public void setDialogResult(GeckoSession.PromptDelegate.PromptResponse dialogResult) { 78 | this.dialogResult = dialogResult; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/dialog/BookmarkDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.dialog; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.widget.CompoundButton; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.appcompat.app.AlertDialog; 11 | 12 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 13 | import com.thallo.stage.R; 14 | import com.thallo.stage.database.bookmark.Bookmark; 15 | import com.thallo.stage.database.bookmark.BookmarkViewModel; 16 | import com.thallo.stage.databinding.DiaBookmarkBinding; 17 | 18 | public class BookmarkDialog extends myDialog { 19 | DiaBookmarkBinding diaBookmarkBinding; 20 | Context context; 21 | public BookmarkDialog(@NonNull Context context, String title, String url, BookmarkViewModel bookmarkViewModel) { 22 | super(context); 23 | this.context=context; 24 | diaBookmarkBinding=DiaBookmarkBinding.inflate(LayoutInflater.from(context)); 25 | diaBookmarkBinding.textView5.setText(R.string.dia_add_bookmark_title); 26 | diaBookmarkBinding.diaBookmarkTitle.setText(title); 27 | diaBookmarkBinding.diaBookmarkUrl.setText(url); 28 | setView(diaBookmarkBinding.getRoot()); 29 | setButton(BUTTON_POSITIVE,context.getString(R.string.confirm), new DialogInterface.OnClickListener() { 30 | @Override 31 | public void onClick(DialogInterface dialogInterface, int i) { 32 | Bookmark bookmark=new Bookmark(diaBookmarkBinding.diaBookmarkUrl.getText().toString(),diaBookmarkBinding.diaBookmarkTitle.getText().toString(),"默认",diaBookmarkBinding.radioButton.isChecked()); 33 | bookmarkViewModel.insertWords(bookmark); 34 | 35 | } 36 | }); 37 | setButton(BUTTON_NEGATIVE,context.getString(R.string.cancle), new DialogInterface.OnClickListener() { 38 | @Override 39 | public void onClick(DialogInterface dialogInterface, int i) { 40 | dialogInterface.dismiss(); 41 | 42 | } 43 | }); 44 | 45 | } 46 | 47 | public void open() { 48 | super.show(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/dialog/ContentPermissionDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.dialog; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import androidx.annotation.NonNull; 10 | 11 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 12 | import com.thallo.stage.R; 13 | import com.thallo.stage.interfaces.confirm; 14 | 15 | import org.mozilla.geckoview.GeckoResult; 16 | 17 | public class ContentPermissionDialog extends MaterialAlertDialogBuilder { 18 | public ContentPermissionDialog(@NonNull Context context) { 19 | super(context); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/dialog/WebDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.dialog; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.view.LayoutInflater; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.appcompat.app.AlertDialog; 10 | 11 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 12 | import com.thallo.stage.databinding.DiaWebBinding; 13 | 14 | import org.mozilla.geckoview.GeckoRuntime; 15 | import org.mozilla.geckoview.GeckoSession; 16 | 17 | public class WebDialog extends AlertDialog { 18 | DiaWebBinding binding; 19 | GeckoSession session; 20 | public WebDialog(@NonNull Context context, Boolean a) { 21 | super(context); 22 | binding=DiaWebBinding.inflate(LayoutInflater.from(context)); 23 | session=new GeckoSession(); 24 | if(a==true) session.loadUri("https://static-6e7c68d2-83dd-40b0-9f09-0150b6b22138.bspapp.com/"); 25 | else session.loadUri("https://static-6e7c68d2-83dd-40b0-9f09-0150b6b22138.bspapp.com/Stage%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96.html"); 26 | session.open(GeckoRuntime.getDefault(context)); 27 | binding.DiaGeckoview.setSession(session); 28 | setView(binding.getRoot()); 29 | setButton(BUTTON_POSITIVE, "同意", new OnClickListener() { 30 | @Override 31 | public void onClick(DialogInterface dialogInterface, int i) { 32 | 33 | } 34 | }); 35 | setButton(BUTTON_NEGATIVE, "不同意", new OnClickListener() { 36 | @Override 37 | public void onClick(DialogInterface dialogInterface, int i) { 38 | Activity context1 = (Activity) context; 39 | context1.finish(); 40 | 41 | } 42 | }); 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/dialog/myDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.dialog; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.appcompat.app.AlertDialog; 7 | 8 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; 9 | import com.thallo.stage.R; 10 | 11 | import org.mozilla.geckoview.GeckoSession; 12 | 13 | public class myDialog extends AlertDialog { 14 | 15 | public myDialog(@NonNull Context context) { 16 | super(context); 17 | getWindow().setBackgroundDrawable(context.getDrawable(R.drawable.bg_dialog)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/filePicker/FilePicker.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.filePicker; 2 | 3 | import android.Manifest; 4 | import android.app.Activity; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.content.pm.PackageManager; 8 | import android.net.Uri; 9 | import android.os.Build; 10 | import android.os.Bundle; 11 | import android.os.Environment; 12 | import android.os.Handler; 13 | import android.os.Looper; 14 | import android.os.Message; 15 | import android.provider.Settings; 16 | import android.util.Log; 17 | import android.widget.Toast; 18 | 19 | import androidx.annotation.Nullable; 20 | import androidx.appcompat.app.AppCompatActivity; 21 | import androidx.core.app.ActivityCompat; 22 | import androidx.core.content.ContextCompat; 23 | 24 | import com.thallo.stage.BaseActivity; 25 | 26 | import org.mozilla.geckoview.GeckoSession; 27 | 28 | public class FilePicker { 29 | UriListener uriListener; 30 | Activity activity; 31 | public FilePicker(Activity activity){ 32 | this.activity=activity; 33 | } 34 | public void open(Activity activity,int requestCode) { 35 | Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 36 | intent.setType("*/*"); 37 | intent.addCategory(Intent.CATEGORY_OPENABLE); 38 | activity.startActivityForResult(intent, requestCode); 39 | requestPermission(); 40 | 41 | } 42 | 43 | 44 | 45 | public void setUriListener(UriListener uriListener) { 46 | this.uriListener = uriListener; 47 | } 48 | 49 | public void setUri(Uri uri) { 50 | uriListener.UriGet(uri); 51 | } 52 | 53 | // 状态变化监听 54 | public interface UriListener { 55 | // 回调方法 56 | void UriGet(Uri uri); 57 | } 58 | 59 | 60 | private void requestPermission() { 61 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { 62 | // 先判断有没有权限 63 | if (Environment.isExternalStorageManager()) { 64 | 65 | } else { 66 | Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); 67 | intent.setData(Uri.parse("package:" + activity.getPackageName())); 68 | activity.startActivityForResult(intent, 1024); 69 | Toast.makeText(activity,"请先授予权限",Toast.LENGTH_SHORT).show(); 70 | } 71 | } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 72 | // 先判断有没有权限 73 | if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && 74 | ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 75 | 76 | } else { 77 | ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1024); 78 | } 79 | } 80 | } 81 | 82 | 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/filePicker/GetFile.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.filePicker; 2 | 3 | import android.app.Activity; 4 | import android.net.Uri; 5 | import android.os.Handler; 6 | import android.os.Looper; 7 | import android.os.Message; 8 | 9 | import com.thallo.stage.BaseActivity; 10 | import com.thallo.stage.components.filePicker.FilePicker; 11 | 12 | public class GetFile { 13 | Uri uri; 14 | Handler mHandler ; 15 | public GetFile(){ 16 | BaseActivity.filePicker.setUriListener(new FilePicker.UriListener() { 17 | @Override 18 | public void UriGet(Uri uri) { 19 | close(uri); 20 | } 21 | }); 22 | } 23 | public void open(Activity activity,int requestCode){ 24 | mHandler = new Handler() { 25 | @Override 26 | public void handleMessage(Message mesg) { 27 | // process incoming messages here 28 | //super.handleMessage(msg); 29 | throw new RuntimeException(); 30 | } 31 | }; 32 | BaseActivity.filePicker.open(activity,requestCode); 33 | try { 34 | Looper.getMainLooper().loop(); 35 | } 36 | catch(RuntimeException e2) 37 | { 38 | } 39 | 40 | } 41 | public void close(Uri uri){ 42 | setUri(uri); 43 | Message m = mHandler.obtainMessage(); 44 | mHandler.sendMessage(m); 45 | } 46 | 47 | public Uri getUri() { 48 | return uri; 49 | } 50 | 51 | public void setUri(Uri uri) { 52 | this.uri = uri; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/popup/InformationPopup.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.popup; 2 | 3 | import android.content.Context; 4 | import android.os.PerformanceHintManager; 5 | import android.util.Log; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | 9 | import com.bumptech.glide.Glide; 10 | import com.google.android.material.bottomsheet.BottomSheetDialog; 11 | import com.thallo.stage.R; 12 | import com.thallo.stage.WebSessionViewModel; 13 | import com.thallo.stage.databinding.PopupInformationBinding; 14 | import com.thallo.stage.databinding.SettingMenuBinding; 15 | import com.thallo.stage.extension.Controller; 16 | 17 | import org.mozilla.geckoview.GeckoSession; 18 | 19 | import java.net.URI; 20 | 21 | public class InformationPopup { 22 | Context context; 23 | BottomSheetDialog bottomSheetDialog; 24 | PopupInformationBinding binding; 25 | public InformationPopup(Context context){ 26 | this.context=context; 27 | bottomSheetDialog = new BottomSheetDialog(context, R.style.BottomSheetDialog); 28 | binding= PopupInformationBinding.inflate(LayoutInflater.from(context)); 29 | 30 | } 31 | 32 | 33 | public void show(WebSessionViewModel webSessionViewModel){ 34 | bottomSheetDialog.setContentView(binding.getRoot()); 35 | URI uri=URI.create(webSessionViewModel.getUrl()); 36 | 37 | if (webSessionViewModel.getSession().getSettings().getUseTrackingProtection()) { 38 | binding.informationProtection.setImageResource(R.drawable.ic_shield); 39 | binding.informationProtectionText.setText(context.getString(R.string.information_protection)); 40 | } 41 | else { 42 | binding.informationProtection.setImageResource(R.drawable.ic_broken_shield); 43 | binding.informationProtectionText.setText(context.getString(R.string.information_not_protection)); 44 | } 45 | 46 | if (webSessionViewModel.isSecure()) { 47 | binding.informationSecure.setImageResource(R.drawable.ic_lock); 48 | binding.informationSecureText.setText(context.getString(R.string.information_secure)); 49 | } 50 | else { 51 | binding.informationSecure.setImageResource(R.drawable.ic_broken_lock); 52 | binding.informationSecureText.setText(context.getString(R.string.information_not_secure)); 53 | 54 | } 55 | binding.informationUrl.setText(uri.getHost()); 56 | String faviconUrl=uri.getScheme()+"://"+uri.getHost()+"/favicon.ico"; 57 | Glide.with(context).load(faviconUrl).placeholder(R.drawable.ic_internet) 58 | .into(binding.informationIcon); 59 | bottomSheetDialog.show(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/popup/IntentPopup.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.popup; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.widget.Button; 9 | 10 | import com.google.android.material.bottomsheet.BottomSheetDialog; 11 | import com.thallo.stage.R; 12 | import com.thallo.stage.databinding.PopupInformationBinding; 13 | import com.thallo.stage.databinding.PopupIntentBinding; 14 | import com.thallo.stage.databinding.SettingMenuBinding; 15 | 16 | public class IntentPopup { 17 | Context context; 18 | PopupIntentBinding binding; 19 | 20 | 21 | 22 | public IntentPopup(Context context){ 23 | this.context=context; 24 | } 25 | public void show(Intent intent){ 26 | BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context, R.style.BottomSheetDialog); 27 | binding=PopupIntentBinding.inflate(LayoutInflater.from(context)); 28 | bottomSheetDialog.setContentView(binding.getRoot()); 29 | bottomSheetDialog.show(); 30 | binding.IntentButton.setOnClickListener(new View.OnClickListener() { 31 | @Override 32 | public void onClick(View view) { 33 | context.startActivity(intent); 34 | bottomSheetDialog.dismiss(); 35 | } 36 | }); 37 | } 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/popup/MyBottomSheetDialog.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.popup; 2 | 3 | import android.content.Context; 4 | import android.widget.FrameLayout; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | import com.google.android.material.bottomsheet.BottomSheetBehavior; 9 | import com.google.android.material.bottomsheet.BottomSheetDialog; 10 | 11 | public class MyBottomSheetDialog extends BottomSheetDialog { 12 | private BottomSheetBehavior behavior; 13 | int mode; 14 | public MyBottomSheetDialog(@NonNull Context context, int theme,int mode) { 15 | super(context, theme); 16 | this.mode=mode; 17 | } 18 | 19 | 20 | @Override 21 | protected void onStart() { 22 | super.onStart(); 23 | switch (mode){ 24 | case 0: 25 | if (behavior != null && behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { 26 | behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 27 | } 28 | break; 29 | case 1: 30 | BottomSheetBehavior behavior = getBehavior(); 31 | behavior.setState(BottomSheetBehavior.STATE_HALF_EXPANDED); 32 | break; 33 | case 2: 34 | behavior = getBehavior(); 35 | behavior.setState(BottomSheetBehavior.STATE_EXPANDED); 36 | break; 37 | } 38 | 39 | 40 | 41 | } 42 | 43 | } 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/popup/PopUp.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.popup; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.annotation.Nullable; 9 | 10 | import com.google.android.material.bottomsheet.BottomSheetDialog; 11 | import com.thallo.stage.R; 12 | 13 | import org.mozilla.geckoview.GeckoResult; 14 | import org.mozilla.geckoview.GeckoRuntime; 15 | import org.mozilla.geckoview.GeckoRuntimeSettings; 16 | import org.mozilla.geckoview.GeckoSession; 17 | import org.mozilla.geckoview.GeckoSessionSettings; 18 | import org.mozilla.geckoview.GeckoView; 19 | import org.mozilla.geckoview.WebExtension; 20 | 21 | public class PopUp { 22 | public void popUp(WebExtension webExtension, GeckoSession session, Context context){ 23 | MyBottomSheetDialog bottomSheetDialog = new MyBottomSheetDialog(context, R.style.BottomSheetDialog,0); 24 | View popView= LayoutInflater.from(context).inflate(R.layout.popup,null ); 25 | GeckoView geckoView= popView.findViewById(R.id.popupGecko); 26 | session.setContentDelegate(new GeckoSession.ContentDelegate() {}); 27 | session.open(GeckoRuntime.getDefault(context)); 28 | session.getSettings().setDisplayMode(GeckoSessionSettings.DISPLAY_MODE_MINIMAL_UI); 29 | session.setNavigationDelegate(new GeckoSession.NavigationDelegate() { 30 | @Nullable 31 | @Override 32 | public GeckoResult onNewSession(@NonNull GeckoSession session1, @NonNull String uri) { 33 | session.loadUri(uri); 34 | 35 | return GeckoSession.NavigationDelegate.super.onNewSession(session, uri); 36 | } 37 | }); 38 | geckoView.setSession(session); 39 | GeckoRuntimeSettings geckoRuntimeSettings = GeckoRuntime.getDefault(context).getSettings(); 40 | geckoRuntimeSettings.setInputAutoZoomEnabled(true); 41 | geckoRuntimeSettings.setLoginAutofillEnabled(true); 42 | geckoRuntimeSettings.setAboutConfigEnabled(true); 43 | geckoRuntimeSettings.setAutomaticFontSizeAdjustment(true); 44 | geckoRuntimeSettings.setForceUserScalableEnabled(true); 45 | bottomSheetDialog.setContentView(popView); 46 | bottomSheetDialog.show(); 47 | 48 | 49 | 50 | 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/components/popup/TabsPopup.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.components.popup; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.util.Log; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | 9 | import com.google.android.material.bottomsheet.BottomSheetDialog; 10 | import com.thallo.stage.R; 11 | import com.thallo.stage.databinding.PopupTabsBinding; 12 | import com.thallo.stage.tab.PageTab; 13 | 14 | import org.webrtc.EglBase10; 15 | 16 | import java.util.List; 17 | 18 | public class TabsPopup { 19 | PopupTabsBinding binding; 20 | List tabList; 21 | Context context; 22 | int index; 23 | MyBottomSheetDialog bottomSheetDialog; 24 | onAddNewTab onAddNewTab; 25 | public TabsPopup( Context context) { 26 | this.tabList = tabList; 27 | this.context = context; 28 | bottomSheetDialog = new MyBottomSheetDialog(context, R.style.BottomSheetDialog,2); 29 | binding=PopupTabsBinding.inflate(LayoutInflater.from(context)); 30 | bottomSheetDialog.setContentView(binding.getRoot()); 31 | bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 32 | @Override 33 | public void onDismiss(DialogInterface dialogInterface) { 34 | binding.tabs.removeAllViews(); 35 | } 36 | }); 37 | 38 | } 39 | public void show(List tabList,int index){ 40 | for (int i=0;i(){ 12 | 13 | }.type 14 | return Gson().fromJson(value,type) 15 | } 16 | @TypeConverter 17 | fun userToString(user:DownloadTask): String { 18 | val gson = Gson() 19 | return gson.toJson(user) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/bookmark/Bookmark.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.bookmark; 2 | import androidx.room.ColumnInfo; 3 | import androidx.room.Entity; 4 | import androidx.room.PrimaryKey; 5 | 6 | @Entity 7 | public class Bookmark { 8 | @PrimaryKey(autoGenerate = true) 9 | private int id; 10 | @ColumnInfo(name = "url_info") 11 | private String url; 12 | @ColumnInfo(name = "title_info") 13 | private String title; 14 | @ColumnInfo(name = "file_name") 15 | private String file; 16 | @ColumnInfo(name = "show_info") 17 | private Boolean show; 18 | @ColumnInfo(name = "mix") 19 | private String mix; 20 | public Bookmark(String url, String title,String file,Boolean show) { 21 | this.url=url; 22 | this.title=title; 23 | this.file=file; 24 | this.show=show; 25 | this.mix=url+title; 26 | 27 | } 28 | 29 | public String getMix() { 30 | return mix; 31 | } 32 | 33 | public void setMix(String mix) { 34 | this.mix = mix; 35 | } 36 | 37 | public Boolean getShow() { 38 | return show; 39 | } 40 | 41 | public void setShow(Boolean show) { 42 | this.show = show; 43 | } 44 | 45 | public String getUrl() { 46 | return url; 47 | } 48 | 49 | public void setUrl(String url) { 50 | this.url = url; 51 | } 52 | 53 | public String getTitle() { 54 | return title; 55 | } 56 | 57 | public void setTitle(String title) { 58 | this.title = title; 59 | } 60 | 61 | public String getFile() { 62 | return file; 63 | } 64 | 65 | public void setFile(String file) { 66 | this.file = file; 67 | } 68 | 69 | public int getId() { 70 | return id; 71 | } 72 | 73 | public void setId(int id) { 74 | this.id = id; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/bookmark/BookmarkDao.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.bookmark; 2 | 3 | import androidx.lifecycle.LiveData; 4 | import androidx.room.Dao; 5 | import androidx.room.Delete; 6 | import androidx.room.Insert; 7 | import androidx.room.Query; 8 | import androidx.room.Update; 9 | 10 | 11 | import java.util.List; 12 | 13 | @Dao 14 | public interface BookmarkDao { 15 | @Insert 16 | void insertBookmark(Bookmark... bookmarks); 17 | @Update 18 | void updateBookmark(Bookmark... bookmarks); 19 | @Delete 20 | void deleteBookmark(Bookmark... bookmarks); 21 | @Query("Delete FROM BOOKMARK") 22 | void deleteAllBookmark(); 23 | 24 | 25 | @Query("SELECT * FROM Bookmark ORDER BY ID DESC") 26 | LiveData> getAllBookmarksLive(); 27 | @Query("SELECT * FROM Bookmark WHERE url_info LIKE:pattern ORDER BY ID DESC") 28 | LiveData> findBookmarksWithPattern(String pattern); 29 | @Query("SELECT * FROM Bookmark WHERE title_info LIKE:pattern ORDER BY ID DESC") 30 | LiveData> findBookmarksWithTitle(String pattern); 31 | @Query("SELECT * FROM Bookmark WHERE show_info LIKE:pattern ORDER BY ID DESC") 32 | LiveData> findBookmarksWithShow(Boolean pattern); 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/bookmark/BookmarkViewModel.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.bookmark; 2 | 3 | import android.app.Application; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.lifecycle.AndroidViewModel; 7 | import androidx.lifecycle.LiveData; 8 | 9 | import com.thallo.stage.database.bookmark.Bookmark; 10 | 11 | import java.util.List; 12 | 13 | public class BookmarkViewModel extends AndroidViewModel { 14 | BookmarkRepository bookmarkRepository; 15 | public BookmarkViewModel(@NonNull Application application) { 16 | super(application); 17 | bookmarkRepository=new BookmarkRepository(application); 18 | } 19 | 20 | public LiveData> getAllBookmarksLive() { 21 | return bookmarkRepository.getAllBookmarkLive(); 22 | } 23 | public LiveData>findBookmarksWithPattern(String pattern){ 24 | return bookmarkRepository.findBookmarksWithPattern(pattern); 25 | } 26 | 27 | LiveData>findBookmarksWithTitle(String pattern){ 28 | return bookmarkRepository.findWordsWithTitle(pattern); 29 | } 30 | public LiveData>findBookmarksWithShow(Boolean pattern){ 31 | return bookmarkRepository.findWordsWithShow(pattern); 32 | } 33 | public void insertWords(com.thallo.stage.database.bookmark.Bookmark... bookmarks) { 34 | bookmarkRepository.insertBookmark(bookmarks); 35 | } 36 | public void updateWords(com.thallo.stage.database.bookmark.Bookmark... bookmarks) { 37 | bookmarkRepository.updateBookmark(bookmarks); 38 | } 39 | public void deleteWords(com.thallo.stage.database.bookmark.Bookmark... bookmarks) { 40 | bookmarkRepository.deleteBookmark(bookmarks); 41 | } 42 | public void deleteAllWords() { 43 | bookmarkRepository.deleteAllbookmarks(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/download/Download.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.download; 2 | 3 | import androidx.room.ColumnInfo; 4 | import androidx.room.Embedded; 5 | import androidx.room.Entity; 6 | import androidx.room.PrimaryKey; 7 | import androidx.room.TypeConverters; 8 | 9 | import com.liulishuo.okdownload.DownloadTask; 10 | 11 | @Entity 12 | public class Download { 13 | @PrimaryKey(autoGenerate = true) 14 | private int id; 15 | @ColumnInfo(name = "id_info") 16 | private long ids; 17 | 18 | 19 | 20 | 21 | public Download(long ids) { 22 | 23 | this.ids=ids; 24 | 25 | } 26 | public int getId() { 27 | return id; 28 | } 29 | 30 | public void setId(int id) { 31 | this.id = id; 32 | } 33 | 34 | public long getIds() { 35 | return ids; 36 | } 37 | 38 | public void setIds(long ids) { 39 | this.ids = ids; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/download/DownloadDao.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.download; 2 | 3 | import androidx.lifecycle.LiveData; 4 | import androidx.room.Dao; 5 | import androidx.room.Delete; 6 | import androidx.room.Insert; 7 | import androidx.room.Query; 8 | import androidx.room.Update; 9 | 10 | import com.thallo.stage.database.bookmark.Bookmark; 11 | 12 | import java.util.List; 13 | 14 | @Dao 15 | public interface DownloadDao { 16 | @Insert 17 | void insertDownload(Download... downloads); 18 | @Update 19 | void updateDownload(Download... downloads); 20 | @Delete 21 | void deleteDownload(Download... downloads); 22 | @Query("Delete FROM DOWNLOAD") 23 | void deleteAllDownload(); 24 | 25 | 26 | @Query("SELECT * FROM Download ORDER BY ID DESC") 27 | LiveData> getAllDownloadsLive(); 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/download/DownloadViewModel.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.download; 2 | 3 | import android.app.Application; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.lifecycle.AndroidViewModel; 7 | import androidx.lifecycle.LiveData; 8 | 9 | import com.thallo.stage.database.bookmark.Bookmark; 10 | 11 | import java.util.List; 12 | 13 | public class DownloadViewModel extends AndroidViewModel { 14 | DownloadRepository downloadRepository; 15 | public DownloadViewModel(@NonNull Application application) { 16 | super(application); 17 | downloadRepository=new DownloadRepository(application); 18 | } 19 | 20 | public LiveData> getAllDownloadsLive() { 21 | return downloadRepository.getAllDownloadLive(); 22 | } 23 | 24 | public void insertWords(Download... downloads) { 25 | downloadRepository.insertDownload(downloads); 26 | } 27 | public void updateWords(Download... downloads) { 28 | downloadRepository.updateDownload(downloads); 29 | } 30 | public void deleteWords(Download... downloads) { 31 | downloadRepository.deleteDownload(downloads); 32 | } 33 | public void deleteAllWords() { 34 | downloadRepository.deleteAlldownloads(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/history/History.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.history; 2 | 3 | import androidx.room.ColumnInfo; 4 | import androidx.room.Entity; 5 | import androidx.room.PrimaryKey; 6 | 7 | @Entity 8 | public class History { 9 | @PrimaryKey(autoGenerate = true) 10 | private int id; 11 | @ColumnInfo(name = "url_info") 12 | private String url; 13 | @ColumnInfo(name = "title_info") 14 | private String title; 15 | @ColumnInfo(name = "time_info") 16 | private int time; 17 | @ColumnInfo(name = "mix") 18 | private String mix; 19 | public History(String url, String title,int time) { 20 | this.url=url; 21 | this.title=title; 22 | this.time=time; 23 | this.mix=url+title; 24 | 25 | } 26 | 27 | public String getMix() { 28 | return mix; 29 | } 30 | 31 | public void setMix(String mix) { 32 | this.mix = mix; 33 | } 34 | 35 | public int getId() { 36 | return id; 37 | } 38 | 39 | public void setId(int id) { 40 | this.id = id; 41 | } 42 | 43 | public String getUrl() { 44 | return url; 45 | } 46 | 47 | public void setUrl(String url) { 48 | this.url = url; 49 | } 50 | 51 | public String getTitle() { 52 | return title; 53 | } 54 | 55 | public void setTitle(String title) { 56 | this.title = title; 57 | } 58 | 59 | public int getTime() { 60 | return time; 61 | } 62 | 63 | public void setTime(int time) { 64 | this.time = time; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/history/HistoryDao.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.history; 2 | 3 | import androidx.lifecycle.LiveData; 4 | import androidx.room.Dao; 5 | import androidx.room.Delete; 6 | import androidx.room.Insert; 7 | import androidx.room.Query; 8 | import androidx.room.Update; 9 | 10 | import java.util.List; 11 | @Dao 12 | public interface HistoryDao { 13 | @Insert 14 | void insertHistory(com.thallo.stage.database.history.History... histories) ; 15 | 16 | @Update 17 | void updateHistory(com.thallo.stage.database.history.History... histories); 18 | 19 | @Delete 20 | void deleteHistory(com.thallo.stage.database.history.History... histories); 21 | 22 | @Query("DELETE FROM HISTORY") 23 | void deleteAllHistories(); 24 | 25 | 26 | @Query("SELECT * FROM HISTORY ORDER BY ID DESC") 27 | LiveData> getAllHistoriesLive(); 28 | 29 | @Query("SELECT * FROM History WHERE url_info LIKE:pattern ORDER BY ID DESC") 30 | LiveData> findHistoriesWithPattern(String pattern); 31 | 32 | @Query("SELECT * FROM History WHERE title_info LIKE:pattern ORDER BY ID DESC") 33 | LiveData> findHistoriesWithTitle(String pattern); 34 | @Query("SELECT * FROM History WHERE mix LIKE:pattern ORDER BY ID DESC") 35 | LiveData> findHistoriesWithMix(String pattern); 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/database/history/HistoryViewModel.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.database.history; 2 | 3 | import android.app.Application; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.lifecycle.AndroidViewModel; 7 | import androidx.lifecycle.LiveData; 8 | 9 | import java.util.List; 10 | 11 | public class HistoryViewModel extends AndroidViewModel { 12 | private HistoryRepository historyRepository; 13 | public HistoryViewModel(@NonNull Application application) { 14 | super(application); 15 | historyRepository = new HistoryRepository(application); 16 | } 17 | 18 | public LiveData> getAllHistoriesLive() 19 | { 20 | return historyRepository.getAllHistoriesLive(); 21 | } 22 | LiveData>findHistoriesWithPattern(String pattern){ 23 | return historyRepository.findHistoriesWithPattern(pattern); 24 | } 25 | 26 | LiveData>findHistoriesWithTitle(String pattern){ 27 | return historyRepository.findWordsWithTitle(pattern); 28 | } 29 | LiveData>findHistoriesWithMix(String pattern){ 30 | return historyRepository.findWordsWithMix(pattern); 31 | } 32 | 33 | 34 | public void insertWords(com.thallo.stage.database.history.History... histories) { 35 | historyRepository.insertHistory(histories); 36 | } 37 | public void updateWords(com.thallo.stage.database.history.History... histories) { 38 | historyRepository.updateHistory(histories); 39 | } 40 | public void deleteWords(com.thallo.stage.database.history.History... histories) { 41 | historyRepository.deleteHistory(histories); 42 | } 43 | public void deleteAllWords() { 44 | historyRepository.deleteAllHistories(); 45 | } 46 | 47 | 48 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/download/DownloadFragment.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.download; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.fragment.app.Fragment; 6 | import androidx.lifecycle.Observer; 7 | import androidx.lifecycle.ViewModelProvider; 8 | import androidx.lifecycle.ViewModelStoreOwner; 9 | import androidx.recyclerview.widget.LinearLayoutManager; 10 | 11 | import android.view.LayoutInflater; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | 15 | import com.thallo.stage.R; 16 | import com.thallo.stage.database.download.Download; 17 | import com.thallo.stage.database.download.DownloadViewModel; 18 | import com.thallo.stage.databinding.FragmentDownloadBinding; 19 | 20 | import java.util.List; 21 | 22 | 23 | public class DownloadFragment extends Fragment { 24 | FragmentDownloadBinding binding; 25 | DownloadViewModel downloadViewModel; 26 | DownloadAdapter downloadAdapter; 27 | 28 | @Override 29 | public void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | 32 | } 33 | 34 | @Override 35 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 36 | Bundle savedInstanceState) { 37 | binding=FragmentDownloadBinding.inflate(inflater,container,false); 38 | binding.downloadRecycler.setLayoutManager(new LinearLayoutManager(getContext())); 39 | binding.toolbar.setTitle(R.string.pop_download); 40 | binding.toolbar.setNavigationOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View view) { 43 | getActivity().finish(); 44 | } 45 | }); 46 | 47 | downloadViewModel=new ViewModelProvider((ViewModelStoreOwner) getContext()).get(DownloadViewModel.class); 48 | downloadAdapter= new DownloadAdapter(); 49 | downloadAdapter.setDownloadViewModel(downloadViewModel); 50 | downloadViewModel.getAllDownloadsLive().observe(getViewLifecycleOwner(), new Observer>() { 51 | @Override 52 | public void onChanged(List downloads) { 53 | 54 | downloadAdapter.setAllDownload(downloads); 55 | binding.downloadRecycler.setAdapter(downloadAdapter); 56 | } 57 | }); 58 | 59 | // Inflate the layout for this fragment 60 | return binding.getRoot(); 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/extension/AddOns.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.extension; 2 | 3 | import android.graphics.Bitmap; 4 | import android.media.Image; 5 | 6 | public class AddOns { 7 | private String name; 8 | private Bitmap imageId; 9 | 10 | public AddOns(String name, Bitmap imageId) { 11 | this.name = name; 12 | this.imageId = imageId; 13 | } 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public Bitmap getImageId() { 20 | return imageId; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/history/HistoryFragment.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.history; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.fragment.app.Fragment; 6 | import androidx.fragment.app.FragmentActivity; 7 | import androidx.lifecycle.LifecycleOwner; 8 | import androidx.lifecycle.Observer; 9 | import androidx.lifecycle.ViewModelProvider; 10 | import androidx.recyclerview.widget.LinearLayoutManager; 11 | 12 | import android.view.LayoutInflater; 13 | import android.view.View; 14 | import android.view.ViewGroup; 15 | 16 | import com.thallo.stage.R; 17 | import com.thallo.stage.database.history.History; 18 | import com.thallo.stage.database.history.HistoryViewModel; 19 | import com.thallo.stage.databinding.FragmentHistoryBinding; 20 | 21 | import java.util.List; 22 | 23 | 24 | public class HistoryFragment extends Fragment { 25 | HistoryViewModel historyViewModel; 26 | FragmentHistoryBinding binding; 27 | MyAdapter myAdapter; 28 | 29 | 30 | @Override 31 | public void onCreate(Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | 34 | } 35 | 36 | @Override 37 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 38 | Bundle savedInstanceState) { 39 | binding=FragmentHistoryBinding.inflate(inflater,container,false); 40 | binding.historyRecycler.setLayoutManager(new LinearLayoutManager(getContext())); 41 | binding.toolbar.setTitle(R.string.pop_history); 42 | binding.toolbar.setNavigationOnClickListener(new View.OnClickListener() { 43 | @Override 44 | public void onClick(View view) { 45 | getActivity().finish(); 46 | } 47 | }); 48 | 49 | myAdapter=new MyAdapter(); 50 | historyViewModel= new ViewModelProvider((FragmentActivity)getContext()).get(HistoryViewModel.class); 51 | historyViewModel.getAllHistoriesLive().observe((LifecycleOwner) this, histories -> { 52 | myAdapter.setAllHistory(histories); 53 | binding.historyRecycler.setAdapter(myAdapter); 54 | binding.historyRecycler.setItemViewCacheSize(histories.size()); 55 | if (histories.size()==0) binding.lottie.setVisibility(View.VISIBLE); 56 | else binding.lottie.setVisibility(View.GONE); 57 | }); 58 | binding.lottie.loop(true); 59 | binding.lottie.playAnimation(); 60 | 61 | 62 | 63 | 64 | // Inflate the layout for this fragment 65 | return binding.getRoot(); 66 | } 67 | 68 | 69 | } -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/interfaces/confirm.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.interfaces; 2 | 3 | import com.thallo.stage.databinding.TabBinding; 4 | 5 | import org.mozilla.geckoview.GeckoResult; 6 | 7 | public interface confirm { 8 | void getConfirm(GeckoResult i); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/thallo/stage/tab/PageTab.java: -------------------------------------------------------------------------------- 1 | package com.thallo.stage.tab; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.BitmapFactory; 6 | import android.graphics.Color; 7 | import android.net.Uri; 8 | import android.util.AttributeSet; 9 | import android.util.Log; 10 | import android.view.LayoutInflater; 11 | import android.widget.RelativeLayout; 12 | 13 | import com.bumptech.glide.Glide; 14 | import com.thallo.stage.WebSessionViewModel; 15 | import com.thallo.stage.databinding.TabBinding; 16 | 17 | import java.net.MalformedURLException; 18 | import java.net.URL; 19 | 20 | public class PageTab extends RelativeLayout { 21 | TabBinding binding; 22 | 23 | public PageTab(Context context, WebSessionViewModel model){ 24 | this(context); 25 | binding.setSession(model); 26 | 27 | 28 | 29 | 30 | 31 | } 32 | public PageTab(Context context) { 33 | this(context,(AttributeSet) null); 34 | } 35 | 36 | public PageTab(Context context, AttributeSet attrs) { 37 | super(context, attrs); 38 | initUI(context); 39 | 40 | } 41 | 42 | private void initUI(Context context){ 43 | binding=TabBinding.inflate(LayoutInflater.from(context),this,true); 44 | } 45 | public WebSessionViewModel getModel() { 46 | return binding.getSession(); 47 | } 48 | 49 | public TabBinding getBinding() { 50 | return binding; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fad_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fad_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_edittext.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_qr.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_search_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_setting_anddons.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_setting_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_trans.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_white_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_back.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_check.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_addons.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_android.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_up_right_circle.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baidu.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bing.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_brand_telegram.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_broken_lock.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 15 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_broken_shield.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bulb.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bulb_off.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle2.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle_check.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_desk.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 11 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_desktop_on.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit2.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_extensions.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_forward.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_google.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_history.xml: -------------------------------------------------------------------------------- 1 | 4 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_information.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_internet.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 11 | 15 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_left.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_left_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu2.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu3.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reload.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_right.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_round_star.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_safe.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_scan.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 16 | 20 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_scan_view.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 16 | 20 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_setting.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 16 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shield.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sogou.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tabs.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_trash.xml: -------------------------------------------------------------------------------- 1 | 4 | 7 | 10 | 13 | 17 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_video.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thalloerupt/stage/872b5faecf4e12854322afe1dbbb3182ebe446cf/app/src/main/res/drawable/logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 35 | 36 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shirt.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fragment_holder.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 22 | 23 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/addons_icons.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 30 | 31 | 38 | 39 | 46 | 47 | 50 | 51 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/res/layout/addons_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/addons_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/addons_manager_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 23 | 24 | 33 | 34 | 45 | 46 | 54 | 55 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /app/src/main/res/layout/addons_window.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_fragment_holder.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dia_agreement.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 |