├── .idea
├── .name
├── .gitignore
├── compiler.xml
├── runConfigurations.xml
├── misc.xml
└── jarRepositories.xml
├── app
├── .gitignore
├── .DS_Store
├── src
│ ├── .DS_Store
│ ├── main
│ │ ├── .DS_Store
│ │ ├── java
│ │ │ ├── .DS_Store
│ │ │ └── com
│ │ │ │ ├── .DS_Store
│ │ │ │ └── example
│ │ │ │ ├── .DS_Store
│ │ │ │ └── fruit
│ │ │ │ ├── .DS_Store
│ │ │ │ ├── MainView.java
│ │ │ │ ├── register
│ │ │ │ ├── RegisterView.java
│ │ │ │ ├── RegisterModel.java
│ │ │ │ └── RegisterPresenter.java
│ │ │ │ ├── login
│ │ │ │ ├── LoginView.java
│ │ │ │ ├── LoginModel.java
│ │ │ │ └── LoginPresenter.java
│ │ │ │ ├── history
│ │ │ │ ├── HistoryView.java
│ │ │ │ ├── OnItemClickListener.java
│ │ │ │ ├── HistoryModel.java
│ │ │ │ ├── HistoryPresenter.java
│ │ │ │ └── HistoryAdapter.java
│ │ │ │ ├── collection
│ │ │ │ ├── OnItemClickListener.java
│ │ │ │ ├── CollectionView.java
│ │ │ │ ├── CollectionModel.java
│ │ │ │ ├── CollectionItem.java
│ │ │ │ ├── CollectionPresenter.java
│ │ │ │ └── CollectionAdapter.java
│ │ │ │ ├── home
│ │ │ │ ├── QuickView.java
│ │ │ │ ├── QuickModel.java
│ │ │ │ ├── QuickPage.java
│ │ │ │ ├── QuickPresenter.java
│ │ │ │ └── QuickPageAdapter.java
│ │ │ │ ├── setting
│ │ │ │ ├── SettingsView.java
│ │ │ │ ├── SettingsModel.java
│ │ │ │ └── SettingsPresenter.java
│ │ │ │ ├── MainModel.java
│ │ │ │ ├── search
│ │ │ │ ├── MJavascriptInterface.java
│ │ │ │ ├── SearchPresenter.java
│ │ │ │ ├── SearchModel.java
│ │ │ │ └── BlockerTool.java
│ │ │ │ ├── MyAppliaction.java
│ │ │ │ ├── bean
│ │ │ │ ├── Collection.java
│ │ │ │ ├── History.java
│ │ │ │ ├── Quick.java
│ │ │ │ └── User.java
│ │ │ │ ├── MainPresenter.java
│ │ │ │ ├── splash
│ │ │ │ └── SplashActivity.java
│ │ │ │ ├── discover
│ │ │ │ └── DiscoverFragment.java
│ │ │ │ └── utils
│ │ │ │ └── Util.java
│ │ ├── res
│ │ │ ├── .DS_Store
│ │ │ ├── drawable
│ │ │ │ ├── .DS_Store
│ │ │ │ ├── logo.png
│ │ │ │ ├── discover1.png
│ │ │ │ ├── discover2.png
│ │ │ │ ├── discover3.png
│ │ │ │ ├── discover4.png
│ │ │ │ ├── discover5.png
│ │ │ │ ├── discover6.png
│ │ │ │ ├── discover7.jpeg
│ │ │ │ ├── icon_logo.png
│ │ │ │ ├── bytedance_logo.png
│ │ │ │ ├── edit_text_focus.xml
│ │ │ │ ├── menu_icon_bg_border_my_exit.xml
│ │ │ │ ├── menu_icon_bg_border_add_collection.xml
│ │ │ │ ├── menu_icon_bg_border_my_collection.xml
│ │ │ │ ├── menu_icon_bg_border_my_history.xml
│ │ │ │ ├── menu_icon_bg_border_my_setting.xml
│ │ │ │ ├── lnk_icon_bg_border.xml
│ │ │ │ ├── menu_icon_bg_border.xml
│ │ │ │ ├── pop_window_border.xml
│ │ │ │ ├── search_button_border.xml
│ │ │ │ ├── home_search_bar_border.xml
│ │ │ │ ├── home_discover_bar_border.xml
│ │ │ │ ├── cursor_style.xml
│ │ │ │ ├── save_photo_border.xml
│ │ │ │ ├── user_image.xml
│ │ │ │ ├── player_gesture_shape.xml
│ │ │ │ ├── login_register_edittext_border.xml
│ │ │ │ ├── search_bar_border.xml
│ │ │ │ ├── setting_image_window_shape.xml
│ │ │ │ ├── setting_name_window_shape.xml
│ │ │ │ ├── switch_style.xml
│ │ │ │ ├── logout_window_shape.xml
│ │ │ │ ├── switch_off.xml
│ │ │ │ ├── search_btn_shape.xml
│ │ │ │ ├── switch_on.xml
│ │ │ │ ├── reload_shape.xml
│ │ │ │ ├── logout_btn_shape.xml
│ │ │ │ ├── switch_thume.xml
│ │ │ │ ├── navigation_bar.xml
│ │ │ │ ├── button_circle_shape.xml
│ │ │ │ ├── login_btn_shape.xml
│ │ │ │ ├── discover_image.xml
│ │ │ │ └── ic_launcher_background.xml
│ │ │ ├── drawable-v24
│ │ │ │ ├── qq.png
│ │ │ │ ├── .DS_Store
│ │ │ │ ├── home.png
│ │ │ │ ├── menu.png
│ │ │ │ ├── paging.png
│ │ │ │ ├── quit.png
│ │ │ │ ├── reload.png
│ │ │ │ ├── search.png
│ │ │ │ ├── trash.png
│ │ │ │ ├── user.png
│ │ │ │ ├── wechat.png
│ │ │ │ ├── add_lnk.png
│ │ │ │ ├── add_page.png
│ │ │ │ ├── app_logo.png
│ │ │ │ ├── go_page.png
│ │ │ │ ├── history.png
│ │ │ │ ├── setting.png
│ │ │ │ ├── back_page.png
│ │ │ │ ├── collection.png
│ │ │ │ ├── home_logo.png
│ │ │ │ ├── rotate_left.png
│ │ │ │ ├── search_home.png
│ │ │ │ ├── home_enabled.png
│ │ │ │ ├── page_history.png
│ │ │ │ ├── player_bright.png
│ │ │ │ ├── player_volume.png
│ │ │ │ ├── rotate_right.png
│ │ │ │ ├── setting_user.png
│ │ │ │ ├── add_collection.png
│ │ │ │ ├── add_quick_page.png
│ │ │ │ ├── confirm_password.png
│ │ │ │ ├── go_page_enabled.png
│ │ │ │ ├── home_logo_text.png
│ │ │ │ ├── lnk_default_item.png
│ │ │ │ ├── page_collection.png
│ │ │ │ ├── back_page_enabled.png
│ │ │ │ ├── search_delete_edittext.png
│ │ │ │ ├── login_register_edit_user.png
│ │ │ │ ├── login_register_edit_password.png
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── logo.png
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── logo.png
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── logo.png
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── logo.png
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── logo.png
│ │ │ │ ├── .DS_Store
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── quick_page.png
│ │ │ │ ├── logo.xml
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── values
│ │ │ │ ├── arrays.xml
│ │ │ │ ├── attrs.xml
│ │ │ │ ├── styles.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── strings.xml
│ │ │ ├── xml
│ │ │ │ └── provider_paths.xml
│ │ │ ├── anim
│ │ │ │ ├── night_fade_out.xml
│ │ │ │ ├── nigth_fade_in.xml
│ │ │ │ ├── rotate_left.xml
│ │ │ │ ├── rotate_right.xml
│ │ │ │ ├── pop_hidden.xml
│ │ │ │ ├── pop_show.xml
│ │ │ │ ├── photo_browser_in.xml
│ │ │ │ └── photo_browser_out.xml
│ │ │ ├── layout
│ │ │ │ ├── splash_activity.xml
│ │ │ │ ├── search_fragment.xml
│ │ │ │ ├── confirm_window.xml
│ │ │ │ ├── collection_item.xml
│ │ │ │ ├── quick_page_item.xml
│ │ │ │ ├── activity_photo_browser.xml
│ │ │ │ ├── confirm_password_window.xml
│ │ │ │ ├── setting_name_window.xml
│ │ │ │ ├── history_item.xml
│ │ │ │ ├── setting_image_window.xml
│ │ │ │ ├── history_fragment.xml
│ │ │ │ ├── setting_password_window.xml
│ │ │ │ ├── collection_fragment.xml
│ │ │ │ ├── quick_page_dialog.xml
│ │ │ │ ├── home_fragment.xml
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── login_fragment.xml
│ │ │ │ └── discover_fragment.xml
│ │ │ ├── raw
│ │ │ │ └── night.css
│ │ │ └── values-night
│ │ │ │ └── colors.xml
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── fruit
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── example
│ │ └── fruit
│ │ └── ExampleInstrumentedTest.java
├── .settings
│ └── org.eclipse.buildship.core.prefs
├── .classpath
├── proguard-rules.pro
├── .project
└── build.gradle
├── settings.gradle
├── .DS_Store
├── images
├── and.png
├── logo.png
├── .DS_Store
├── search.gif
├── splash.gif
├── title.png
├── unity.png
├── dark_mode.gif
├── home_dark.png
├── logo_text.png
├── scut_logo.png
├── home_light.png
├── quick_page.gif
├── bytedance_logo.png
└── history_bookmark.gif
├── gradle
├── .DS_Store
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .settings
└── org.eclipse.buildship.core.prefs
├── .project
├── gradle.properties
├── .gitignore
├── gradlew.bat
├── Chinese_Introduction
└── README.md
├── README.md
└── gradlew
/.idea/.name:
--------------------------------------------------------------------------------
1 | Fruit
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | #忽略根目录下的
2 | /build
3 |
4 | #
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 | rootProject.name = "Fruit"
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/.DS_Store
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/app/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/.DS_Store
--------------------------------------------------------------------------------
/images/and.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/and.png
--------------------------------------------------------------------------------
/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/logo.png
--------------------------------------------------------------------------------
/app/src/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/.DS_Store
--------------------------------------------------------------------------------
/gradle/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/gradle/.DS_Store
--------------------------------------------------------------------------------
/images/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/.DS_Store
--------------------------------------------------------------------------------
/images/search.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/search.gif
--------------------------------------------------------------------------------
/images/splash.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/splash.gif
--------------------------------------------------------------------------------
/images/title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/title.png
--------------------------------------------------------------------------------
/images/unity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/unity.png
--------------------------------------------------------------------------------
/images/dark_mode.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/dark_mode.gif
--------------------------------------------------------------------------------
/images/home_dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/home_dark.png
--------------------------------------------------------------------------------
/images/logo_text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/logo_text.png
--------------------------------------------------------------------------------
/images/scut_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/scut_logo.png
--------------------------------------------------------------------------------
/app/src/main/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/.DS_Store
--------------------------------------------------------------------------------
/images/home_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/home_light.png
--------------------------------------------------------------------------------
/images/quick_page.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/quick_page.gif
--------------------------------------------------------------------------------
/images/bytedance_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/bytedance_logo.png
--------------------------------------------------------------------------------
/app/.settings/org.eclipse.buildship.core.prefs:
--------------------------------------------------------------------------------
1 | connection.project.dir=..
2 | eclipse.preferences.version=1
3 |
--------------------------------------------------------------------------------
/app/src/main/java/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/java/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/res/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/.DS_Store
--------------------------------------------------------------------------------
/images/history_bookmark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/images/history_bookmark.gif
--------------------------------------------------------------------------------
/app/src/main/java/com/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/java/com/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/res/drawable/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/res/drawable/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/logo.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/qq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/qq.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-hdpi/logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-mdpi/logo.png
--------------------------------------------------------------------------------
/app/src/main/java/com/example/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/java/com/example/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/home.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/menu.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/paging.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/paging.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/quit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/quit.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/reload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/reload.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/search.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/trash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/trash.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/user.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/wechat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/wechat.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover5.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover6.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover7.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/discover7.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/icon_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/icon_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xhdpi/logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxhdpi/logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxxhdpi/logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/add_lnk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/add_lnk.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/add_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/add_page.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/app_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/app_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/go_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/go_page.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/history.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/history.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/setting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/setting.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxxhdpi/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/java/com/example/fruit/.DS_Store
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/back_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/back_page.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/collection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/collection.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/home_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/home_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/rotate_left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/rotate_left.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/search_home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/search_home.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bytedance_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable/bytedance_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/home_enabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/home_enabled.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/page_history.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/page_history.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/player_bright.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/player_bright.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/player_volume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/player_volume.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/rotate_right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/rotate_right.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/setting_user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/setting_user.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/MainView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit;
2 |
3 | public interface MainView {
4 | void showAddCollection();
5 | }
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/add_collection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/add_collection.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/add_quick_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/add_quick_page.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/confirm_password.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/confirm_password.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/go_page_enabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/go_page_enabled.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/home_logo_text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/home_logo_text.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/lnk_default_item.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/lnk_default_item.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/page_collection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/page_collection.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/quick_page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-anydpi-v26/quick_page.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/back_page_enabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/back_page_enabled.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/search_delete_edittext.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/search_delete_edittext.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/login_register_edit_user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/login_register_edit_user.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/edit_text_focus.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/login_register_edit_password.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HeXavi8/Orange-Browser/HEAD/app/src/main/res/drawable-v24/login_register_edit_password.png
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - baidu.com
5 |
6 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/register/RegisterView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.register;
2 |
3 | public interface RegisterView {
4 | void showRegisterSuccessfully();
5 | void showUsernameExist();
6 | }
7 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/menu_icon_bg_border_my_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/menu_icon_bg_border_add_collection.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/menu_icon_bg_border_my_collection.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/menu_icon_bg_border_my_history.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/menu_icon_bg_border_my_setting.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/lnk_icon_bg_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/login/LoginView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.login;
2 |
3 | import com.example.fruit.bean.User;
4 |
5 | public interface LoginView {
6 | void showLoginSuccessfully(User user);
7 |
8 | void showLoginFailed();
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/menu_icon_bg_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/pop_window_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/history/HistoryView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.history;
2 |
3 | import com.example.fruit.bean.History;
4 |
5 | import java.util.List;
6 |
7 | public interface HistoryView {
8 | void showAll(List histories);
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/search_button_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/night_fade_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_search_bar_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/logo.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Jun 15 16:58:12 CST 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/history/OnItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.history;
2 |
3 | import android.view.View;
4 |
5 | public interface OnItemClickListener {
6 | void onClick(View view, int pos);
7 |
8 | boolean onLongClick(View view, int pos);
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_discover_bar_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/collection/OnItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.collection;
2 |
3 | import android.view.View;
4 |
5 | public interface OnItemClickListener {
6 | void onClick(View view, int pos);
7 |
8 | boolean onLongClick(View view, int pos);
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/cursor_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/collection/CollectionView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.collection;
2 |
3 | import com.example.fruit.bean.Collection;
4 |
5 | import java.util.List;
6 |
7 | public interface CollectionView {
8 | void showAllCollection(List collections);
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/nigth_fade_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/save_photo_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/user_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/home/QuickView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.home;
2 |
3 | import com.example.fruit.bean.Quick;
4 |
5 | import java.util.List;
6 |
7 | public interface QuickView {
8 | void insertSuccess();
9 |
10 | void insertFail();
11 |
12 | void showAll(List quicks);
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/player_gesture_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/login_register_edittext_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/setting/SettingsView.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.setting;
2 |
3 | public interface SettingsView {
4 | void showChangeName();
5 |
6 | void showProfileAfterChange();
7 |
8 | void showCheckPasswordFalse();
9 |
10 | void showCheckPasswordSuccess();
11 |
12 | void showDeleteUser();
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/search_bar_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/rotate_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/rotate_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/app/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/setting_image_window_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | android:shape="rectangle">
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/setting_name_window_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/pop_hidden.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/switch_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/pop_show.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
12 |
--------------------------------------------------------------------------------
/.settings/org.eclipse.buildship.core.prefs:
--------------------------------------------------------------------------------
1 | arguments=
2 | auto.sync=false
3 | build.scans.enabled=false
4 | connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
5 | connection.project.dir=
6 | eclipse.preferences.version=1
7 | gradle.user.home=
8 | java.home=/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
9 | jvm.arguments=
10 | offline.mode=false
11 | override.workspace.settings=true
12 | show.console.view=true
13 | show.executions.view=true
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/logout_window_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/switch_off.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
7 |
8 |
10 |
11 |
12 |
13 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/search_btn_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/switch_on.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/test/java/com/example/fruit/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/reload_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/photo_browser_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/photo_browser_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/logout_btn_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
8 | -
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/switch_thume.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/MainModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit;
2 |
3 | import com.example.fruit.dao.DBController;
4 | import com.example.fruit.utils.Util;
5 |
6 | public class MainModel {
7 | private DBController mDBController;
8 | private String username;
9 |
10 | public MainModel() {
11 | mDBController = DBController.getInstance(MyAppliaction.getContext());
12 | username = Util.getInstance().getUserName();
13 | }
14 |
15 | public void addCollection(String url, String title) {
16 | mDBController.addCollection(username, url, title);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/navigation_bar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 | //边框的颜色
5 |
6 |
7 |
8 |
9 |
10 | - //这里有四个方向可以选择,这里因为只要显示底部边框,所以就设置bottom
12 |
13 |
14 | //整个空间的背景颜色
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/button_circle_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
11 |
12 | **设置文字padding**
13 |
14 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/search/MJavascriptInterface.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.search;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 |
6 | public class MJavascriptInterface {
7 | private Context context;
8 |
9 | public MJavascriptInterface(Context context) {
10 | this.context = context;
11 | }
12 |
13 | @android.webkit.JavascriptInterface
14 | public void openImage(String img) {
15 | Intent intent = new Intent();
16 | intent.putExtra("image", img);
17 | intent.setClass(context, PhotoBrowserActivity.class);
18 | context.startActivity(intent);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/login_btn_shape.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 | -
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
11 |
12 | **设置文字padding**
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/search/SearchPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.search;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | import com.example.fruit.bean.History;
9 |
10 | import java.util.List;
11 |
12 | public class SearchPresenter {
13 | private SearchModel mSearchModel;
14 |
15 | public SearchPresenter() {
16 | mSearchModel = new SearchModel();
17 | }
18 |
19 | public void insertHistories(List histories) {
20 | new Thread(new Runnable() {
21 | @Override
22 | public void run() {
23 | mSearchModel.insertHistory(histories);
24 | }
25 | }).start();
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/search/SearchModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.search;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.bean.Collection;
5 | import com.example.fruit.bean.History;
6 | import com.example.fruit.dao.DBController;
7 | import com.example.fruit.utils.Util;
8 |
9 | import java.util.List;
10 |
11 | public class SearchModel {
12 | private DBController mDBController;
13 | private String mUsername;
14 |
15 | public SearchModel() {
16 | mDBController = DBController.getInstance(MyAppliaction.getContext());
17 | mUsername = Util.getInstance().getUserName();
18 | }
19 |
20 | public void insertHistory(List histories) {
21 | mDBController.insertHistory(histories);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/search/BlockerTool.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.search;
2 |
3 | import android.content.Context;
4 | import android.content.res.Resources;
5 |
6 | import com.example.fruit.R;
7 |
8 | public class BlockerTool {
9 | public static boolean isBlock(Context context, String url) {
10 | Resources resources = context.getResources();
11 | String [] urlsToBeBlocked = resources.getStringArray(R.array.BlockUrl);
12 | for (String adURL : urlsToBeBlocked) {
13 | if (matchURL(url, adURL)) {
14 | return true;
15 | }
16 | }
17 | return false;
18 | }
19 |
20 | private static boolean matchURL(String sourceURL, String targetURL) {
21 | return sourceURL.contains(targetURL);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/history/HistoryModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.history;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.bean.History;
5 | import com.example.fruit.dao.DBController;
6 |
7 | import java.util.List;
8 |
9 | public class HistoryModel {
10 | private DBController mDBController;
11 |
12 | public HistoryModel() {
13 | mDBController = DBController.getInstance(MyAppliaction.getContext());
14 | }
15 |
16 | public List getAllHistory() {
17 | return mDBController.getAll();
18 | }
19 |
20 | public void deleteAll() {
21 | mDBController.deleteAllHistory();
22 | }
23 |
24 | public void deleteSelected(List toBeDeleted) {
25 | mDBController.deleteSelectedHistory(toBeDeleted);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | Fruit
4 | Project Fruit-Browser created by Buildship.
5 |
6 |
7 |
8 |
9 | org.eclipse.buildship.core.gradleprojectbuilder
10 |
11 |
12 |
13 |
14 |
15 | org.eclipse.buildship.core.gradleprojectnature
16 |
17 |
18 |
19 | 0
20 |
21 | 30
22 |
23 | org.eclipse.core.resources.regexFilterMatcher
24 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/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
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/login/LoginModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.login;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.bean.User;
5 | import com.example.fruit.dao.DBController;
6 |
7 | public class LoginModel {
8 | private DBController mDbController;
9 | private User mUser;
10 |
11 | public LoginModel() {
12 | mUser = new User(null, "", "", "",null);
13 | mDbController = DBController.getInstance(MyAppliaction.getContext());
14 | }
15 |
16 | public User checkUserAndPassword () {
17 | return mDbController.checkUserAndPassword(mUser.getName(), mUser.getPassword());
18 | }
19 |
20 | public void setUser(String username, String password) {
21 | mUser.setName(username);
22 | mUser.setPassword(password);
23 | mUser.setCustomizeName(username);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/example/fruit/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit;
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.example.fruit", appContext.getPackageName());
25 | }
26 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/register/RegisterModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.register;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.bean.User;
5 | import com.example.fruit.dao.DBController;
6 |
7 | public class RegisterModel {
8 | private DBController mDBController;
9 | private User mUser;
10 |
11 | public RegisterModel() {
12 | mUser = new User(null, "", "", "",null);
13 | mDBController = DBController.getInstance(MyAppliaction.getContext());
14 | }
15 |
16 | public boolean checkUserExist(String username) {
17 | return mDBController.checkUserExist(username);
18 | }
19 |
20 | public void insertUser(String username, String password) {
21 | mUser.setName(username);
22 | mUser.setPassword(password);
23 | mUser.setCustomizeName(username);
24 | mDBController.insertUser(mUser);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/MyAppliaction.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit;
2 |
3 | import android.app.Application;
4 | import android.content.Context;
5 | import android.content.res.Configuration;
6 | import android.content.res.Resources;
7 | import android.util.DisplayMetrics;
8 |
9 | import androidx.appcompat.app.AppCompatDelegate;
10 |
11 | import com.example.fruit.utils.Util;
12 |
13 | public class MyAppliaction extends Application {
14 | private static Context sContext;
15 |
16 | @Override
17 | public void onCreate() {
18 | super.onCreate();
19 | sContext = getApplicationContext();
20 | //初始化我们的主题模式
21 | // if(Util.getNight()) {
22 | // AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
23 | // };
24 |
25 | }
26 |
27 | public static Context getContext() {
28 | return sContext;
29 | }
30 |
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/splash_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/home/QuickModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.home;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.bean.Quick;
5 | import com.example.fruit.dao.DBController;
6 |
7 | import java.util.List;
8 |
9 | public class QuickModel {
10 | private DBController mDbController;
11 |
12 | public QuickModel() {
13 | mDbController = DBController.getInstance(MyAppliaction.getContext());
14 | }
15 |
16 | public boolean insertQuick(String title, String url) {
17 | return mDbController.insertQuick(title, url);
18 | }
19 |
20 | public List getAllQuick() {
21 | return mDbController.getQuick();
22 | }
23 |
24 | public void deleteQuick(String title, String url) {
25 | mDbController.deleteQuick(title, url);
26 | }
27 |
28 | public void changeQuick(String title, String url, String newTitle, String newUrl) {
29 | mDbController.changeQuick(title, url, newTitle, newUrl);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/res/raw/night.css:
--------------------------------------------------------------------------------
1 |
2 | /*所有元素的背景色都设置为黑夜模式,原来使用#201f26(rgb)会影响celltick资讯详情页里列表项的图片显示,这里改用rgba,有0.8的透明度*/
3 | *, *:before, *:after {
4 | box-sizing: inherit;
5 | background-color: rgba(32, 31, 38, 0.8) !important;
6 | }
7 |
8 | /*背景颜色和一般字体颜色*/
9 | div,h1,h2,h3,h4,h5,h6,p,body,em,html,link,textarea,form,select,input,span,button,em,menu,aside,table,tr,td,nav,dl,dt,dd,amp-iframe,main{
10 | /*background-color: rgba(32, 31, 38, 0.8) !important;*/
11 | color: #888888!important;
12 | border-color: #555555 !important;
13 | text-shadow : 0 0 0 #000; /*去掉文本的阴影效果*/
14 | }
15 |
16 | /*超链接*/
17 | a{
18 | color:#3c5180 !important;
19 | }
20 |
21 | strong {
22 | display: block;
23 | }
24 |
25 | img, iframe, canvas, svg,amp-social-share,
26 | embed[type='application/x-shockwave-flash'],
27 | object[type='application/x-shockwave-flash'],
28 | *[style*='url('] {
29 | -webkit-filter : opacity(50%);
30 | -ms-filter : opacity(50%);
31 | filter : opacity(50%);
32 | }
33 |
--------------------------------------------------------------------------------
/app/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | app
4 | Project app created by Buildship.
5 |
6 |
7 |
8 |
9 | org.eclipse.jdt.core.javabuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.buildship.core.gradleprojectbuilder
15 |
16 |
17 |
18 |
19 |
20 | org.eclipse.jdt.core.javanature
21 | org.eclipse.buildship.core.gradleprojectnature
22 |
23 |
24 |
25 | 1633539444081
26 |
27 | 30
28 |
29 | org.eclipse.core.resources.regexFilterMatcher
30 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/bean/Collection.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.bean;
2 |
3 | import org.greenrobot.greendao.annotation.Entity;
4 | import org.greenrobot.greendao.annotation.Generated;
5 |
6 | @Entity
7 | public class Collection {
8 | String name;
9 | String url;
10 | String title;
11 | @Generated(hash = 512964657)
12 | public Collection(String name, String url, String title) {
13 | this.name = name;
14 | this.url = url;
15 | this.title = title;
16 | }
17 | @Generated(hash = 1149123052)
18 | public Collection() {
19 | }
20 |
21 | public String getUrl() {
22 | return this.url;
23 | }
24 | public void setUrl(String url) {
25 | this.url = url;
26 | }
27 | public String getTitle() {
28 | return this.title;
29 | }
30 | public void setTitle(String title) {
31 | this.title = title;
32 | }
33 | public String getName() {
34 | return this.name;
35 | }
36 | public void setName(String name) {
37 | this.name = name;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/bean/History.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.bean;
2 |
3 | import org.greenrobot.greendao.annotation.Entity;
4 | import org.greenrobot.greendao.annotation.Generated;
5 |
6 | @Entity
7 | public class History {
8 | private String title;
9 | private String url;
10 | private String time;
11 | @Generated(hash = 1019327556)
12 | public History(String title, String url, String time) {
13 | this.title = title;
14 | this.url = url;
15 | this.time = time;
16 | }
17 | @Generated(hash = 869423138)
18 | public History() {
19 | }
20 | public String getTitle() {
21 | return this.title;
22 | }
23 | public void setTitle(String title) {
24 | this.title = title;
25 | }
26 | public String getUrl() {
27 | return this.url;
28 | }
29 | public void setUrl(String url) {
30 | this.url = url;
31 | }
32 | public String getTime() {
33 | return this.time;
34 | }
35 | public void setTime(String time) {
36 | this.time = time;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/collection/CollectionModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.collection;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.bean.Collection;
5 | import com.example.fruit.dao.DBController;
6 | import com.example.fruit.utils.Util;
7 |
8 | import java.util.List;
9 |
10 | public class CollectionModel {
11 | private DBController mDBController;
12 | private String mUsername;
13 |
14 | public CollectionModel() {
15 | mDBController = DBController.getInstance(MyAppliaction.getContext());
16 | mUsername = Util.getInstance().getUserName();
17 | }
18 |
19 | public List getCollection() {
20 | if (mUsername != null) {
21 | return mDBController.getUserCollection(mUsername);
22 | }
23 | return null;
24 | }
25 |
26 | public void deleteAllUserCollection() {
27 | mDBController.deleteAllCollection(mUsername);
28 | }
29 |
30 | public void deleteSelectedUserCollection(List toBeDeleted) {
31 | mDBController.deleteSelectedCollection(toBeDeleted);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/bean/Quick.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.bean;
2 |
3 | import org.greenrobot.greendao.annotation.Entity;
4 | import org.greenrobot.greendao.annotation.Generated;
5 | import org.greenrobot.greendao.annotation.Id;
6 |
7 | @Entity
8 | public class Quick {
9 | @Id(autoincrement = true)
10 | private Long id;
11 | private String title;
12 | private String url;
13 | @Generated(hash = 501286242)
14 | public Quick(Long id, String title, String url) {
15 | this.id = id;
16 | this.title = title;
17 | this.url = url;
18 | }
19 | @Generated(hash = 258038605)
20 | public Quick() {
21 | }
22 | public String getTitle() {
23 | return this.title;
24 | }
25 | public void setTitle(String title) {
26 | this.title = title;
27 | }
28 | public String getUrl() {
29 | return this.url;
30 | }
31 | public void setUrl(String url) {
32 | this.url = url;
33 | }
34 | public Long getId() {
35 | return this.id;
36 | }
37 | public void setId(Long id) {
38 | this.id = id;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/setting/SettingsModel.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.setting;
2 |
3 | import com.example.fruit.MyAppliaction;
4 | import com.example.fruit.dao.DBController;
5 | import com.example.fruit.utils.Util;
6 |
7 | public class SettingsModel {
8 | private DBController mDBController;
9 | private String mUsername;
10 |
11 | public SettingsModel() {
12 | mDBController = new DBController(MyAppliaction.getContext());
13 | mUsername = Util.getInstance().getUserName();
14 | }
15 |
16 | public void changeName(String newName) {
17 | mDBController.changeUsername(mUsername, newName);
18 | }
19 |
20 | public void setProfile(String profile) {
21 | mDBController.setProfile(mUsername, profile);
22 | }
23 | public String getProfile(){
24 | return mDBController.getProfile(mUsername);
25 | }
26 |
27 | public boolean checkPassword(String password) {
28 | return mDBController.checkUserAndPassword(mUsername, password) != null;
29 | }
30 |
31 | public void changePassword(String newPassword) {
32 | mDBController.changeUsername(mUsername, newPassword);
33 | }
34 |
35 | public void deleteUser() {
36 | mDBController.deleteUser(mUsername);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/MainPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | import com.example.fruit.utils.Util;
9 |
10 | public class MainPresenter {
11 | private static final int ADD_COLLECTION = 0;
12 |
13 | private MainModel mMainModel;
14 | private MainView mMainView;
15 |
16 | private Handler mHandler = new Handler() {
17 | @Override
18 | public void handleMessage(@NonNull Message msg) {
19 | switch (msg.what) {
20 | case ADD_COLLECTION:
21 | mMainView.showAddCollection();
22 | break;
23 | }
24 | }
25 | };
26 |
27 | public MainPresenter(MainView mainView) {
28 | mMainModel = new MainModel();
29 | mMainView = mainView;
30 | }
31 |
32 |
33 | public void addCollection(String url, String title) {
34 | new Thread(new Runnable() {
35 | @Override
36 | public void run() {
37 | mMainModel.addCollection(url, title);
38 | Message message = new Message();
39 | message.what = ADD_COLLECTION;
40 | mHandler.sendMessage(message);
41 | }
42 | }).start();
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/collection/CollectionItem.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.collection;
2 |
3 | public class CollectionItem {
4 |
5 | public String imgPath;//图片地址
6 | private String title;//收藏名字
7 | private String url;//收藏URL
8 | private boolean isSelected;//是否选中
9 |
10 |
11 | public String getImgPath() {
12 | return imgPath;
13 | }
14 |
15 | public void setImgPath(String imgPath) {
16 | this.imgPath = imgPath;
17 | }
18 |
19 |
20 | public String getTitle() {
21 | return title;
22 | }
23 |
24 | public void setTitle(String title) {
25 | this.title = title;
26 | }
27 |
28 | public String getUrl() {
29 | return url;
30 | }
31 |
32 | public void setUrl(String url) {
33 | this.url = url;
34 | }
35 |
36 | public boolean isSelected() {
37 | return isSelected;
38 | }
39 |
40 | public void setSelected(boolean selected) {
41 | isSelected = selected;
42 | }
43 |
44 |
45 |
46 | public CollectionItem() {
47 |
48 | }
49 |
50 | public CollectionItem(String title, String url,String imgPath) {
51 | this.title = title;
52 | this.url = url;
53 | this.imgPath = imgPath;
54 | }
55 |
56 | @Override
57 | public String toString() {
58 | return "HistoryItem{" +
59 | "title='" + title + '\'' +
60 | ", url=" + url +
61 | '}';
62 | }
63 |
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/home/QuickPage.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.home;
2 |
3 | import org.greenrobot.greendao.annotation.Entity;
4 | import org.greenrobot.greendao.annotation.Generated;
5 |
6 | public class QuickPage {
7 | private String url;
8 | private String title;
9 | private int imgPathId;//本地图片就是ID
10 | private String imgPathUrl;//网页图片就是string
11 | private boolean isAddIcon;//判断是添加的图标还是编辑图标
12 |
13 | public QuickPage(String title, String url, int imgPathId, String imgPathUrl, boolean isAddIcon) {
14 | this.url = url;
15 | this.title = title;
16 | this.imgPathId = imgPathId;
17 | this.imgPathUrl = imgPathUrl;
18 | this.isAddIcon = isAddIcon;
19 | }
20 |
21 | public QuickPage() {
22 | }
23 |
24 | public String getUrl() {
25 | return this.url;
26 | }
27 | public void setUrl(String url) {
28 | this.url = url;
29 | }
30 | public String getTitle() {
31 | return this.title;
32 | }
33 | public void setTitle(String title) {
34 | this.title = title;
35 | }
36 | public int getImgPathId() {
37 | return this.imgPathId;
38 | }
39 | public void setImgPathId(int imgPathId) {
40 | this.imgPathId = imgPathId;
41 | }
42 | public String getImgPathUrl() {
43 | return this.imgPathUrl;
44 | }
45 | public void setImgPathUrl(String imgPathUrl) {
46 | this.imgPathUrl = imgPathUrl;
47 | }
48 |
49 | public boolean getIsAddIcon() {
50 | return this.isAddIcon;
51 | }
52 | public void setIsAddIcon(boolean isAddIcon) {
53 | this.isAddIcon = isAddIcon;
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/search_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
13 |
20 |
26 |
34 |
35 |
36 |
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/register/RegisterPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.register;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | public class RegisterPresenter {
9 | private static final int REGISTER_SUCCESSFULLY = 1;
10 | private static final int USERNAME_EXIST = 2;
11 | private RegisterModel mRegisterModel;
12 | private RegisterView mRegisterView;
13 | private Handler mHandler = new Handler() {
14 | @Override
15 | public void handleMessage(@NonNull Message msg) {
16 | switch (msg.what) {
17 | case REGISTER_SUCCESSFULLY:
18 | mRegisterView.showRegisterSuccessfully();
19 | break;
20 | case USERNAME_EXIST:
21 | mRegisterView.showUsernameExist();
22 | break;
23 | }
24 | }
25 | };
26 |
27 | public RegisterPresenter(RegisterView registerView) {
28 | mRegisterModel = new RegisterModel();
29 | mRegisterView = registerView;
30 | }
31 |
32 | public void register(String username, String password) {
33 | new Thread(new Runnable() {
34 | @Override
35 | public void run() {
36 | boolean res = mRegisterModel.checkUserExist(username);
37 | Message message = new Message();
38 | if (res) {
39 | message.what = USERNAME_EXIST;
40 | } else {
41 | mRegisterModel.insertUser(username, password);
42 | message.what = REGISTER_SUCCESSFULLY;
43 | }
44 | mHandler.sendMessage(message);
45 | }
46 | }).start();
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Built application files
2 | *.apk
3 | *.aar
4 | *.ap_
5 | *.aab
6 |
7 | # Files for the ART/Dalvik VM
8 | *.dex
9 |
10 | # Java class files
11 | *.class
12 |
13 | # Generated files
14 | bin/
15 | gen/
16 | out/
17 | # Uncomment the following line in case you need and you don't have the release build type files in your app
18 | # release/
19 |
20 | # Gradle files
21 | .gradle/
22 | build/
23 |
24 | # Local configuration file (sdk path, etc)
25 | local.properties
26 |
27 | # Proguard folder generated by Eclipse
28 | proguard/
29 |
30 | # Log Files
31 | *.log
32 |
33 | # Android Studio Navigation editor temp files
34 | .navigation/
35 |
36 | # Android Studio captures folder
37 | captures/
38 |
39 | # IntelliJ
40 | *.iml
41 | .idea/workspace.xml
42 | .idea/tasks.xml
43 | .idea/gradle.xml
44 | .idea/assetWizardSettings.xml
45 | .idea/dictionaries
46 | .idea/libraries
47 | # Android Studio 3 in .gitignore file.
48 | .idea/caches
49 | .idea/modules.xml
50 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you
51 | .idea/navEditor.xml
52 |
53 | # Keystore files
54 | # Uncomment the following lines if you do not want to check your keystore files in.
55 | #*.jks
56 | #*.keystore
57 |
58 | # External native build folder generated in Android Studio 2.2 and later
59 | .externalNativeBuild
60 | .cxx/
61 |
62 | # Google Services (e.g. APIs or Firebase)
63 | # google-services.json
64 |
65 | # Freeline
66 | freeline.py
67 | freeline/
68 | freeline_project_description.json
69 |
70 | # fastlane
71 | fastlane/report.xml
72 | fastlane/Preview.html
73 | fastlane/screenshots
74 | fastlane/test_output
75 | fastlane/readme.md
76 |
77 | # Version control
78 | vcs.xml
79 |
80 | # lint
81 | lint/intermediates/
82 | lint/generated/
83 | lint/outputs/
84 | lint/tmp/
85 | # lint/reports/
86 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/login/LoginPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.login;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | import com.example.fruit.bean.User;
9 |
10 | public class LoginPresenter {
11 | private static final int LOGIN_SUCCESSFULLY = 1;
12 | private static final int LOGIN_FAILED = 2;
13 | private LoginModel mLoginModel;
14 | private LoginView mLoginView;
15 | private User mUser;
16 |
17 | private Handler mHandler = new Handler() {
18 | @Override
19 | public void handleMessage(@NonNull Message msg) {
20 | switch (msg.what) {
21 | case LOGIN_SUCCESSFULLY:
22 | mLoginView.showLoginSuccessfully(mUser);
23 | break;
24 | case LOGIN_FAILED:
25 | mLoginView.showLoginFailed();
26 | break;
27 | }
28 | }
29 | };
30 |
31 | public LoginPresenter(LoginView loginView) {
32 | mLoginModel = new LoginModel();
33 | mLoginView = loginView;
34 | }
35 |
36 | public void login(String username, String password) {
37 | mLoginModel.setUser(username, password);
38 | new Thread(new Runnable() {
39 | @Override
40 | public void run() {
41 | User res = mLoginModel.checkUserAndPassword();
42 | Message message = new Message();
43 | if (res != null) {
44 | mUser = res;
45 | message.what = LOGIN_SUCCESSFULLY;
46 | } else {
47 | message.what = LOGIN_FAILED;
48 | }
49 | mHandler.sendMessage(message);
50 | }
51 | }).start();
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/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/layout/confirm_window.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
21 |
25 |
26 |
27 |
35 |
39 |
40 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/bean/User.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.bean;
2 |
3 | import org.greenrobot.greendao.annotation.Entity;
4 | import org.greenrobot.greendao.annotation.Id;
5 | import org.greenrobot.greendao.annotation.Index;
6 | import org.greenrobot.greendao.annotation.Generated;
7 |
8 | import java.sql.Blob;
9 |
10 | @Entity
11 | public class User {
12 | @Id(autoincrement = true)
13 | private Long id;
14 | @Index(unique = true)
15 | private String name;
16 | private String password;
17 | private String customizeName;
18 | private String profile;
19 | @Generated(hash = 1711170821)
20 | public User(Long id, String name, String password, String customizeName,
21 | String profile) {
22 | this.id = id;
23 | this.name = name;
24 | this.password = password;
25 | this.customizeName = customizeName;
26 | this.profile = profile;
27 | }
28 | @Generated(hash = 586692638)
29 | public User() {
30 | }
31 | public Long getId() {
32 | return this.id;
33 | }
34 | public void setId(Long id) {
35 | this.id = id;
36 | }
37 | public String getName() {
38 | return this.name;
39 | }
40 | public void setName(String name) {
41 | this.name = name;
42 | }
43 | public String getPassword() {
44 | return this.password;
45 | }
46 | public void setPassword(String password) {
47 | this.password = password;
48 | }
49 | public String getCustomizeName() {
50 | return this.customizeName;
51 | }
52 | public void setCustomizeName(String customizeName) {
53 | this.customizeName = customizeName;
54 | }
55 | public String getProfile() {
56 | return this.profile;
57 | }
58 | public void setProfile(String profile) {
59 | this.profile = profile;
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'org.greenrobot.greendao'
3 |
4 | android {
5 |
6 | compileSdkVersion 30
7 | buildToolsVersion "30.0.2"
8 |
9 | defaultConfig {
10 | applicationId "com.example.fruit"
11 | minSdkVersion 26
12 | targetSdkVersion 30
13 | versionCode 1
14 | versionName "1.0"
15 |
16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
17 | }
18 |
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 | }
26 |
27 | dependencies {
28 | implementation 'com.github.bumptech.glide:glide:4.8.0'//图片
29 | annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
30 | implementation fileTree(dir: "libs", include: ["*.jar"])
31 | implementation 'androidx.appcompat:appcompat:1.2.0'
32 | //noinspection GradleCompatible
33 | implementation 'com.android.support:appcompat-v7:21.0.3'
34 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
35 | implementation 'com.github.chrisbanes:PhotoView:2.0.0'
36 | implementation 'org.greenrobot:greendao:3.3.0'
37 | implementation 'androidx.recyclerview:recyclerview:1.1.0'
38 | implementation 'org.jetbrains:annotations:15.0'
39 | testImplementation 'junit:junit:4.12'
40 | androidTestImplementation 'androidx.test.ext:junit:1.1.2'
41 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
42 | }
43 |
44 | //
45 | //buildscript {
46 | // repositories {
47 | // jcenter()
48 | // }
49 | // dependencies {
50 | // classpath 'com.android.tools.build:gradle:4.1.1'
51 | // //注意:更换成自己的AS的版本
52 | // }
53 | //}
54 | //allprojects {
55 | // repositories {
56 | // jcenter()
57 | // }
58 | //}
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
15 |
16 |
20 |
21 |
25 |
26 |
27 |
31 |
32 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/collection_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
19 |
20 |
32 |
33 |
34 |
43 |
44 |
51 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/quick_page_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
34 |
35 |
36 |
37 |
38 |
39 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_photo_browser.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
20 |
28 |
39 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/splash/SplashActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.splash;
2 |
3 |
4 | import android.app.Activity;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 | import android.os.Handler;
8 | import android.view.View;
9 | import android.view.animation.AlphaAnimation;
10 | import android.view.animation.Animation;
11 |
12 | import com.example.fruit.MainActivity;
13 | import com.example.fruit.R;
14 | /**
15 | * Created by AbhiAndroid
16 | */
17 |
18 | public class SplashActivity extends Activity {
19 |
20 | Handler handler;
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | // super.onCreate(savedInstanceState);
24 | // setContentView(R.layout.splash_activity);
25 |
26 | super.onCreate(savedInstanceState);
27 | final View view = View.inflate(this, R.layout.splash_activity, null);
28 | setContentView(view);
29 |
30 | //渐变展示启动屏
31 | AlphaAnimation aa = new AlphaAnimation(0.6f,1.0f);
32 | aa.setDuration(1000);
33 | view.startAnimation(aa);
34 | aa.setAnimationListener(new Animation.AnimationListener()
35 | {
36 | @Override
37 | public void onAnimationEnd(Animation arg0) {
38 | redirectTo();
39 | }
40 | @Override
41 | public void onAnimationRepeat(Animation animation) {}
42 | @Override
43 | public void onAnimationStart(Animation animation) {}
44 | });
45 |
46 | // handler=new Handler();
47 | // handler.postDelayed(new Runnable() {
48 | // @Override
49 | // public void run() {
50 | // Intent intent=new Intent(SplashActivity.this, MainActivity.class);
51 | // startActivity(intent);
52 | // finish();
53 | // }
54 | // },1000);
55 |
56 | }
57 |
58 | /**
59 | * 跳转到...
60 | */
61 | private void redirectTo(){
62 | Intent intent = new Intent(this, MainActivity.class);
63 | startActivity(intent);
64 | finish();
65 | }
66 |
67 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/collection/CollectionPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.collection;
2 |
3 |
4 | import android.os.Handler;
5 | import android.os.Message;
6 |
7 | import androidx.annotation.NonNull;
8 |
9 | import com.example.fruit.bean.Collection;
10 |
11 | import java.util.List;
12 |
13 | public class CollectionPresenter {
14 | private static final int SHOW_ALL_COLLECTION = 0;
15 |
16 | private CollectionModel mCollectionModel;
17 | private CollectionView mCollectionView;
18 | private List mCollections;
19 | private Handler mHandler = new android.os.Handler(){
20 | @Override
21 | public void handleMessage(@NonNull Message msg) {
22 | switch (msg.what) {
23 | case SHOW_ALL_COLLECTION:
24 | mCollectionView.showAllCollection(mCollections);
25 | break;
26 | }
27 | }
28 | };
29 |
30 | public CollectionPresenter(CollectionView collectionView) {
31 | mCollectionModel = new CollectionModel();
32 | mCollectionView = collectionView;
33 | }
34 |
35 | public void getCollections() {
36 | new Thread(new Runnable() {
37 | @Override
38 | public void run() {
39 | mCollections = mCollectionModel.getCollection();
40 | Message message = new Message();
41 | message.what = SHOW_ALL_COLLECTION;
42 | mHandler.sendMessage(message);
43 | }
44 | }).start();
45 | }
46 |
47 | public void deleteAllCollection() {
48 | new Thread(new Runnable() {
49 | @Override
50 | public void run() {
51 | mCollectionModel.deleteAllUserCollection();
52 | }
53 | }).start();
54 | }
55 |
56 | public void deleteSelectedCollection(List toBeDeleted) {
57 | new Thread(new Runnable() {
58 | @Override
59 | public void run() {
60 | mCollectionModel.deleteSelectedUserCollection(toBeDeleted);
61 | }
62 | }).start();
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #8D7AA8
4 | #000000
5 | #5C7572
6 |
7 | #8095AC
8 |
9 | #232323
10 | #181818
11 | #181818
12 |
13 | #000000
14 | #7E7676
15 | #000000
16 | #707070
17 |
18 | #181818
19 |
20 | #FDEFE0
21 |
22 | #E59246
23 | #FDEFE0
24 | #FDEFE0
25 |
26 | #F0BF9D
27 |
28 | #F0BF9D
29 | #F0BF9D
30 | #F0BF9D
31 | #F0BF9D
32 |
33 | #FFFFFF
34 | #FFFFFF
35 |
36 | #E57A46
37 |
38 | #FDEFE0
39 |
40 | #6E5D5D
41 | #AEADAD
42 | #887E79
43 | #C93756
44 | #000000
45 | #181818
46 | #ffffff
47 | #776E6E
48 | #cc000000
49 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/confirm_password_window.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
16 |
24 |
28 |
29 |
30 |
40 |
41 |
50 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/history/HistoryPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.history;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | import com.example.fruit.bean.History;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | public class HistoryPresenter {
14 | private static final int SHOW_ALL_LIST = 0;
15 | private HistoryModel mHistoryModel;
16 | private HistoryView mHistoryView;
17 | private List mHistories;
18 | private Handler mHandler = new Handler() {
19 | @Override
20 | public void handleMessage(@NonNull Message msg) {
21 | switch (msg.what) {
22 | case SHOW_ALL_LIST:
23 | mHistoryView.showAll(mHistories);
24 | break;
25 | }
26 | }
27 | };
28 | public HistoryPresenter(HistoryView historyView) {
29 | mHistoryModel = new HistoryModel();
30 | mHistoryView = historyView;
31 | }
32 |
33 | //得到所有的历史记录并进行显示
34 | public void getHistories() {
35 | new Thread(new Runnable() {
36 | @Override
37 | public void run() {
38 | mHistories = mHistoryModel.getAllHistory();
39 | Message message = new Message();
40 | message.what = SHOW_ALL_LIST;
41 | mHandler.sendMessage(message);
42 | }
43 | }).start();
44 | }
45 |
46 | public void deleteAllHistory() {
47 | new Thread(new Runnable() {
48 | @Override
49 | public void run() {
50 | mHistoryModel.deleteAll();
51 | }
52 | }).start();
53 | }
54 |
55 | public void deleteSelectedHistory(List toBeDeleted) {
56 | new Thread((new Runnable() {
57 | @Override
58 | public void run() {
59 | System.out.println("aaaa"+toBeDeleted.size());
60 | for (int i= 0;i
2 |
9 |
10 |
11 |
17 |
26 |
27 |
28 |
39 |
40 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/history_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
19 |
20 |
32 |
33 |
42 |
51 |
52 |
59 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/setting_image_window.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
14 |
17 |
18 |
19 |
28 |
33 |
34 |
43 |
48 |
49 |
58 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
7 | #409EFF
8 | #FFFFFF
9 | #FFFFFF
10 | #FDFDFD
11 |
12 | #F0F0F0
13 | #BEBEBE
14 | #000000
15 | #707070
16 |
17 | #f0bf9d
18 | #E8E8E8
19 |
20 | #F2F2F2
21 |
22 |
23 |
24 | #D3D3D3
25 | #F2F3F7
26 | #F0BF9D
27 | #FDEFE0
28 | #F0BF9D
29 | #F9F8F8
30 | #747474
31 | #747474
32 | #747474
33 |
34 | #E8E8E8
35 | #747474
36 | #747474
37 | #747474
38 | #E57A46
39 | #747474
40 |
41 | #E59246
42 | #9B9B9B
43 | #000000
44 |
45 | #747474
46 |
47 |
48 | #EAB7B7
49 | #F5D7C1
50 | #ffffff
51 |
52 | #FAEBD7
53 | #C93756
54 | #cc000000
55 | #BEBEBE
56 | #cc000000
57 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
38 |
39 |
40 |
41 |
42 |
43 |
45 |
50 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/discover/DiscoverFragment.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.discover;
2 |
3 | import android.app.Fragment;
4 | import android.app.FragmentManager;
5 | import android.os.Bundle;
6 | import android.view.KeyEvent;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.view.Window;
11 | import android.widget.ImageView;
12 |
13 | import androidx.annotation.Nullable;
14 |
15 | import com.example.fruit.MainActivity;
16 | import com.example.fruit.R;
17 | import com.example.fruit.collection.CollectionFragment;
18 | import com.example.fruit.history.HistoryFragment;
19 | import com.example.fruit.login.LoginFragment;
20 | import com.example.fruit.setting.SettingsPresenter;
21 | import com.example.fruit.utils.Util;
22 |
23 |
24 | public class DiscoverFragment extends Fragment {
25 | private ImageView mGoBack;
26 | private MainActivity mActivity;
27 | private Window mWindow;
28 |
29 | @Override
30 | public void onResume(){
31 | super.onResume();
32 | getView().setFocusableInTouchMode(true);
33 | getView().requestFocus();
34 | getView().setOnKeyListener(new View.OnKeyListener() {
35 | @Override
36 | public boolean onKey(View v, int keyCode, KeyEvent event) {
37 | if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK){
38 | mActivity.onBackPressed();
39 | return true;
40 | }
41 | return false;
42 | }
43 | });
44 | }
45 |
46 | @Nullable
47 | @Override
48 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
49 | View view = inflater.inflate(R.layout.discover_fragment, container, false);
50 | //mSettingsPresenter = new SettingsPresenter(this);
51 | mActivity = (MainActivity) getActivity();
52 | mActivity.getNavigationBar().setVisibility(View.GONE);
53 | mActivity.getTopSearch().setVisibility(View.GONE);
54 | mGoBack = (ImageView) view.findViewById(R.id.discover_back);
55 | mGoBack.setOnClickListener(new View.OnClickListener() {
56 | @Override
57 | public void onClick(View view) {
58 | mActivity.onBackPressed();
59 | }
60 | });
61 |
62 | return view;
63 | };
64 |
65 | // @Override
66 | // public void onClick(View view) {
67 | // switch (view.getId()) {
68 | // case R.id.setting_back:
69 | // mActivity.onBackPressed();
70 | // break;
71 | // }
72 | // }
73 |
74 |
75 |
76 | }
77 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/history_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
20 |
29 |
41 |
53 |
54 |
55 |
60 |
61 |
66 |
67 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/setting_password_window.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
15 |
24 |
25 |
26 |
38 |
39 |
51 |
52 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/home/QuickPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.home;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | import com.example.fruit.bean.Quick;
9 |
10 | import java.util.List;
11 |
12 |
13 | public class QuickPresenter {
14 | private static final int INSERT_SUCCESS = 0;
15 | private static final int INSERT_FAIL = 1;
16 | private static final int SHOW_ALL = 2;
17 |
18 | private QuickModel mQuickModel;
19 | private QuickView mQuickView;
20 | private List mQuickList;
21 |
22 | private Handler mHandler = new Handler() {
23 | @Override
24 | public void handleMessage(@NonNull Message msg) {
25 | switch (msg.what) {
26 | case INSERT_SUCCESS:
27 | mQuickView.insertSuccess();
28 | break;
29 | case INSERT_FAIL:
30 | mQuickView.insertFail();;
31 | break;
32 | case SHOW_ALL:
33 | mQuickView.showAll(mQuickList);
34 | break;
35 | }
36 | }
37 | };
38 |
39 | public QuickPresenter(QuickView quickView) {
40 | mQuickModel = new QuickModel();
41 | mQuickView = quickView;
42 | }
43 |
44 | public void insertQuick(String title, String url) {
45 | new Thread(new Runnable() {
46 | @Override
47 | public void run() {
48 | Message message = new Message();
49 | if (mQuickModel.insertQuick(title, url)) {
50 | message.what = INSERT_SUCCESS;
51 | }else {
52 | message.what = INSERT_FAIL;
53 | }
54 | mHandler.sendMessage(message);
55 | }
56 | }).start();
57 | }
58 |
59 | public void getAllQuick() {
60 | new Thread(new Runnable() {
61 | @Override
62 | public void run() {
63 | mQuickList = mQuickModel.getAllQuick();
64 | Message message = new Message();
65 | message.what = SHOW_ALL;
66 | mHandler.sendMessage(message);
67 | }
68 | }).start();
69 | }
70 |
71 | public void deleteQuick(String title, String url) {
72 | new Thread(new Runnable() {
73 | @Override
74 | public void run() {
75 | mQuickModel.deleteQuick(title, url);
76 | }
77 | }).start();
78 | }
79 |
80 | public void changeQuick(String title, String url, String newTitle, String newUrl) {
81 | new Thread(new Runnable() {
82 | @Override
83 | public void run() {
84 | mQuickModel.changeQuick(title, url, newTitle, newUrl);
85 | }
86 | }).start();
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/collection_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
20 |
29 |
41 |
53 |
54 |
55 |
56 |
61 |
62 |
63 |
68 |
69 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/utils/Util.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.utils;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 | import android.os.Message;
6 | import android.preference.PreferenceManager;
7 |
8 | import com.example.fruit.MyAppliaction;
9 |
10 | public class Util {
11 | private static final String PREF_NAME = "loginState";
12 | private static Util mInstance;
13 | private static SharedPreferences mSP;
14 |
15 | private static SharedPreferences.Editor mEditor;
16 |
17 | private Util() {
18 | Context context = MyAppliaction.getContext();
19 | mSP = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
20 | mEditor = mSP.edit();
21 | }
22 |
23 | public static Util getInstance() {
24 | if (mInstance == null) {
25 | System.out.println("错误");
26 | mInstance = new Util();
27 | }
28 | return mInstance;
29 | }
30 |
31 | // 返回true表示登录,返回false表示未登录
32 | public static boolean getLoginState() {
33 | return mSP.getBoolean("isLogin", false);
34 | }
35 |
36 | public static void setLoginState(Boolean loginState) {
37 | mEditor.putBoolean("isLogin", loginState).commit();
38 | }
39 |
40 | public static String getUserName() {
41 | return mSP.getString("username", null);
42 | }
43 |
44 | public static void setUserName(String username) {
45 | mEditor.putString("username", username).commit();
46 | }
47 |
48 | public static void setCustomizeName(String customizeName) {
49 | mEditor.putString("name", customizeName).commit();
50 | }
51 |
52 | public static String getCustomizeName() {
53 | return mSP.getString("name", "");
54 | }
55 |
56 | public static void setProfile(String profile) {
57 | mEditor.putString("profile", profile).commit();
58 | }
59 |
60 | public static String getProfile() {
61 | return mSP.getString("profile", null);
62 | }
63 |
64 | public static void setNight(Boolean ifNight) {
65 | mEditor.putBoolean("night", ifNight).commit();
66 | }
67 |
68 | public static Boolean getNight() {
69 | return mSP.getBoolean("night", true);
70 | }
71 |
72 | public static void setNoHistory(Boolean ifNoHistory) {
73 | mEditor.putBoolean("noHistory", ifNoHistory).commit();
74 | }
75 |
76 | public static Boolean getNoHistory() {
77 | return mSP.getBoolean("noHistory", false);
78 | }
79 |
80 | public static int dip2px(Context context, float dpValue) {
81 | final float scale = context.getResources().getDisplayMetrics().density;
82 | return (int) (dpValue * scale + 0.5f);
83 | }
84 |
85 | /**
86 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
87 | */
88 | public static int px2dip(Context context, float pxValue) {
89 | final float scale = context.getResources().getDisplayMetrics().density;
90 | return (int) (pxValue / scale + 0.5f);
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/Chinese_Introduction/README.md:
--------------------------------------------------------------------------------
1 | ### [English](https://github.com/HeXavi8/Orange-Browser) | 中文
2 | #
3 |
4 | “橘子浏览器”是字节跳动与华南理工大学联合举办的为期六周实训项目中开发的一款android应用程序。
5 |
6 |
7 |
8 |
9 | ## 目录
10 | * [截图](#Snapshots)
11 | * [功能](#Functions)
12 | * [使用](#Usage)
13 | * [文档](#Documentations)
14 | * [设计](#Design)
15 | * [项目成员](#Project_Members)
16 | * [动图](#Gifs)
17 | * [License](#License)
18 |
19 |
20 | ## 截图
21 |
22 |
23 |
24 | ## 功能
25 |
26 | * 书签
27 | * 历史
28 | * 快速页面
29 | * 用户管理(注册、登录、信息变更)
30 | * 无痕浏览模式
31 | * 夜间模式
32 | * 多媒体(视频播放&照片浏览&照片下载)
33 | * 搜索
34 |
35 | ## 使用
36 |
37 | 请克隆该仓库,并在Android Studio运行。
38 |
39 | Gradle 版本:
40 | ```
41 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
42 | ```
43 | 依赖:
44 | ```
45 | dependencies {
46 | implementation 'com.github.bumptech.glide:glide:4.8.0'
47 | annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
48 | implementation fileTree(dir: "libs", include: ["*.jar"])
49 | implementation 'androidx.appcompat:appcompat:1.2.0'
50 | implementation 'com.android.support:appcompat-v7:21.0.3'
51 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
52 | implementation 'com.github.chrisbanes:PhotoView:2.0.0'
53 | implementation 'org.greenrobot:greendao:3.3.0'
54 | implementation 'androidx.recyclerview:recyclerview:1.1.0'
55 | implementation 'org.jetbrains:annotations:15.0'
56 | testImplementation 'junit:junit:4.12'
57 | androidTestImplementation 'androidx.test.ext:junit:1.1.2'
58 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
59 | }
60 | ```
61 |
62 | ## 文档
63 | * [需求调研与分析文档](https://gmja06lqlv.feishu.cn/docs/doccnHKdKTbgC3bJ3vR0YWX3pdh#)
64 | * [交互设计文档](https://gmja06lqlv.feishu.cn/docs/doccnL7AnOJU59VLdlAdy6n4DXc#)
65 | * [技术设计文档](https://gmja06lqlv.feishu.cn/docs/doccnA3Ya4Bk4qzcJY2D772wJcb#)
66 |
67 | ## 设计
68 |
69 |
70 |
71 | 我们的Logo和用户界面设计是由 [Zixuan](https://github.com/coddlly) 和 [Xavi](https://github.com/HeXavi8) 完成的。
72 |
73 | ## 项目成员
74 |
75 | - [Xavi](https://github.com/HeXavi8) - **Xavi He** <xavihe.work@outlook.com> (he/him)
76 | - [Li Xiaofei](https://github.com/Makka-Pakka111) - **Li Xiaofei** <1040314319@qq.com> (she/her)
77 | - [Walden](https://github.com/Aoliao-w) - **Walden** <1215454179@qq.com> (she/her)
78 | - [Zixuan](https://github.com/coddlly) - **Zixuan** <1906377395@qq.com> (she/her)
79 |
80 | 我们的代码和设计远非完美。如果您有任何建议或想贡献代码,请随时联系我们或作出拉请求。
81 |
82 | ## 动图
83 |
84 |
85 | ## License
86 | [Apache-2.0 License](./LICENSE)
87 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/quick_page_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
16 |
17 |
25 |
26 |
32 |
38 |
49 |
50 |
51 |
58 |
64 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### English | [中文](./Chinese_Introduction)
2 | #
3 |
4 | Orange Browser is an android application developed during a six-week training program jointly held by ByteDance and South China University of Technology(SCUT).
5 |
6 |
7 |
8 |
9 | ## Table of Contents
10 | * [Snapshots](#Snapshots)
11 | * [Functions](#Functions)
12 | * [Usage](#Usage)
13 | * [Documentations](#Documentations)
14 | * [Design](#Design)
15 | * [Project Members](#Project_Members)
16 | * [Gifs](#Gifs)
17 | * [License](#License)
18 |
19 |
20 | ## Snapshots
21 |
22 |
23 |
24 | ## Functions
25 |
26 | * Bookmarks
27 | * History
28 | * Quick page
29 | * User management (Register & Login & Information Change)
30 | * Incognito mode
31 | * Dark mode
32 | * Multimedia (Video Player & Photo Viewer & Photo Download)
33 | * Search
34 |
35 | ## Usage
36 |
37 | If you are interested in this application, please clone the repository and run it in Android Studio.
38 |
39 | Gradle version:
40 | ```
41 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
42 | ```
43 | Dependencies:
44 | ```
45 | dependencies {
46 | implementation 'com.github.bumptech.glide:glide:4.8.0'
47 | annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
48 | implementation fileTree(dir: "libs", include: ["*.jar"])
49 | implementation 'androidx.appcompat:appcompat:1.2.0'
50 | implementation 'com.android.support:appcompat-v7:21.0.3'
51 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
52 | implementation 'com.github.chrisbanes:PhotoView:2.0.0'
53 | implementation 'org.greenrobot:greendao:3.3.0'
54 | implementation 'androidx.recyclerview:recyclerview:1.1.0'
55 | implementation 'org.jetbrains:annotations:15.0'
56 | testImplementation 'junit:junit:4.12'
57 | androidTestImplementation 'androidx.test.ext:junit:1.1.2'
58 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
59 | }
60 | ```
61 |
62 | ## Documentations
63 | * [Requirements Research and Analysis](https://gmja06lqlv.feishu.cn/docs/doccnHKdKTbgC3bJ3vR0YWX3pdh#)
64 | * [Interaction Design Documentation](https://gmja06lqlv.feishu.cn/docs/doccnL7AnOJU59VLdlAdy6n4DXc#)
65 | * [Technical Design Documentation](https://gmja06lqlv.feishu.cn/docs/doccnA3Ya4Bk4qzcJY2D772wJcb#)
66 |
67 | ## Design
68 |
69 |
70 |
71 | Our logo and user interface were designed by [Zixuan](https://github.com/coddlly) and [Xavi](https://github.com/HeXavi8).
72 |
73 | ## Project Members
74 |
75 | - [Xavi](https://github.com/HeXavi8) - **Xavi He** <xavihe.work@outlook.com> (he/him)
76 | - [Li Xiaofei](https://github.com/Makka-Pakka111) - **Li Xiaofei** <1040314319@qq.com> (she/her)
77 | - [Walden](https://github.com/Aoliao-w) - **Walden** <1215454179@qq.com> (she/her)
78 | - [Zixuan](https://github.com/coddlly) - **Zixuan** <1906377395@qq.com> (she/her)
79 |
80 | Our code and design are far from perfect. If you have any suggestions or would like to contribute code, please feel free to contact us or make pull requests.
81 |
82 | ## Gifs
83 |
84 |
85 | ## License
86 | [Apache-2.0 License](./LICENSE)
87 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/history/HistoryAdapter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.history;
2 |
3 | import android.view.LayoutInflater;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 | import android.widget.CheckBox;
7 | import android.widget.TextView;
8 |
9 | import androidx.annotation.NonNull;
10 | import androidx.recyclerview.widget.RecyclerView;
11 |
12 | import com.example.fruit.R;
13 | import com.example.fruit.bean.History;
14 |
15 | import org.jetbrains.annotations.NotNull;
16 |
17 | import java.util.List;
18 |
19 | public class HistoryAdapter extends RecyclerView.Adapter {
20 | private List mHistoryItems;
21 | private HistoryFragment mHistoryFragment;
22 | private boolean ifShowCheckBox;
23 |
24 |
25 | static class ViewHolder extends RecyclerView.ViewHolder {
26 | View itemView;
27 | TextView title;
28 | TextView url;
29 | CheckBox checkBox;
30 | TextView time;
31 |
32 | public ViewHolder(@NonNull @org.jetbrains.annotations.NotNull View itemView) {
33 | super(itemView);
34 | this.itemView = itemView;
35 | title = itemView.findViewById(R.id.tv_title);
36 | url = itemView.findViewById(R.id.tv_url);
37 | time = itemView.findViewById(R.id.tv_time);
38 | checkBox = itemView.findViewById(R.id.checkbox);
39 | checkBox.setClickable(false);
40 | }
41 | }
42 |
43 | public HistoryAdapter(List historyItems, HistoryFragment historyFragment) {
44 | mHistoryItems = historyItems;
45 | mHistoryFragment = historyFragment;
46 | ifShowCheckBox = false;
47 | }
48 |
49 | @NonNull
50 | @NotNull
51 | @Override
52 | public ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
53 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.history_item,
54 | parent, false);
55 | ViewHolder viewHolder = new ViewHolder(view);
56 | return viewHolder;
57 | }
58 |
59 | @Override
60 | public void onBindViewHolder(@NonNull @NotNull HistoryAdapter.ViewHolder holder, int position) {
61 | History historyItem = mHistoryItems.get(position);
62 | holder.title.setText(historyItem.getTitle());
63 | holder.url.setText(historyItem.getUrl());
64 | holder.time.setText(historyItem.getTime());
65 | if (ifShowCheckBox) {
66 | holder.checkBox.setVisibility(View.VISIBLE);
67 | } else {
68 | holder.checkBox.setVisibility(View.INVISIBLE);
69 | }
70 | holder.itemView.setOnClickListener(new View.OnClickListener() {
71 | @Override
72 | public void onClick(View view) {
73 | if (ifShowCheckBox) {
74 | if (holder.checkBox.isChecked()) {
75 | holder.checkBox.setChecked(false);
76 | } else {
77 | holder.checkBox.setChecked(true);
78 | }
79 | mHistoryFragment.onClick(view, position);
80 | } else {
81 | mHistoryFragment.goToSearch(holder.url.getText().toString());
82 |
83 | }
84 | }
85 | });
86 | holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
87 | @Override
88 | public boolean onLongClick(View view) {
89 | ifShowCheckBox = true;
90 | return mHistoryFragment.onLongClick(view, position);
91 | }
92 | });
93 | }
94 |
95 | @Override
96 | public int getItemCount() {
97 | return mHistoryItems.size();
98 | }
99 |
100 | public void setShowCheckBox(Boolean val) {
101 | ifShowCheckBox = val;
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/collection/CollectionAdapter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.collection;
2 |
3 |
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.CheckBox;
8 | import android.widget.TextView;
9 |
10 | import androidx.annotation.NonNull;
11 | import androidx.recyclerview.widget.RecyclerView;
12 |
13 | import com.example.fruit.R;
14 | import com.example.fruit.bean.Collection;
15 |
16 | import com.example.fruit.collection.CollectionAdapter;
17 | import com.example.fruit.collection.CollectionFragment;
18 |
19 | import org.jetbrains.annotations.NotNull;
20 |
21 | import java.util.List;
22 |
23 | public class CollectionAdapter extends RecyclerView.Adapter{
24 | private List mCollectionItems;
25 | private CollectionFragment mCollectionFragment;
26 | private boolean ifShowCheckBox;
27 |
28 | static class ViewHolder extends RecyclerView.ViewHolder {
29 | View itemView;
30 | TextView title;
31 | TextView url;
32 | CheckBox checkBox;
33 |
34 | public ViewHolder(@NonNull @org.jetbrains.annotations.NotNull View itemView) {
35 | super(itemView);
36 | this.itemView = itemView;
37 | title = itemView.findViewById(R.id.tv_title);
38 | url = itemView.findViewById(R.id.tv_url);
39 | checkBox = itemView.findViewById(R.id.checkbox);
40 | checkBox.setClickable(false);
41 | }
42 | }
43 |
44 | public CollectionAdapter(List collectionItems, CollectionFragment collectionFragment) {
45 | mCollectionItems = collectionItems;
46 | mCollectionFragment = collectionFragment;
47 | ifShowCheckBox = false;
48 | }
49 |
50 |
51 | @NonNull
52 | @NotNull
53 | @Override
54 | //与collection_item.xml绑定
55 | public CollectionAdapter.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
56 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.collection_item,
57 | parent, false);
58 | CollectionAdapter.ViewHolder viewHolder = new CollectionAdapter.ViewHolder(view);
59 | return viewHolder;
60 | }
61 |
62 |
63 | @Override
64 | public void onBindViewHolder(@NonNull @NotNull CollectionAdapter.ViewHolder holder, int position) {
65 | Collection collectionItem = mCollectionItems.get(position);
66 | holder.title.setText(collectionItem.getTitle());
67 | holder.url.setText(collectionItem.getUrl());
68 | //holder.time.setText(collectionItem.getTime());
69 | if (ifShowCheckBox) {
70 | holder.checkBox.setVisibility(View.VISIBLE);
71 | } else {
72 | holder.checkBox.setVisibility(View.INVISIBLE);
73 | }
74 | holder.itemView.setOnClickListener(new View.OnClickListener() {
75 | @Override
76 | public void onClick(View view) {
77 | if (ifShowCheckBox) {
78 | if (holder.checkBox.isChecked()) {
79 | holder.checkBox.setChecked(false);
80 | } else {
81 | holder.checkBox.setChecked(true);
82 | }
83 | mCollectionFragment.onClick(view, position);
84 | } else {
85 | mCollectionFragment.goToSearch(holder.url.getText().toString());
86 | }
87 | }
88 | });
89 | holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
90 | @Override
91 | public boolean onLongClick(View view) {
92 | ifShowCheckBox = true;
93 | return mCollectionFragment.onLongClick(view, position);
94 | }
95 | });
96 | }
97 |
98 | @Override
99 | public int getItemCount() {
100 | return mCollectionItems.size();
101 | }
102 |
103 | public void setShowCheckBox(Boolean val) {
104 | ifShowCheckBox = val;
105 | }
106 |
107 |
108 | }
109 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/setting/SettingsPresenter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.setting;
2 |
3 | import android.os.Handler;
4 | import android.os.Message;
5 | import android.util.Log;
6 |
7 | import androidx.annotation.NonNull;
8 |
9 | import com.example.fruit.R;
10 | import com.example.fruit.utils.Util;
11 |
12 |
13 | public class SettingsPresenter {
14 | private static final int NAME_CHANGED = 0;
15 | private static final int PROFILE_CHANGED = 1;
16 | private static final int CHECK_FALSE = 2;
17 | private static final int CHECK_SUCCESS = 3;
18 | private static final int DELETE_USER = 4;
19 | private static final int GET_PROFILE=5;
20 |
21 | private SettingsModel mSettingsModel;
22 | private SettingsView mSettingsView;
23 | private Boolean mCheckRes;
24 |
25 | private Handler mHandler = new Handler() {
26 | @Override
27 | public void handleMessage(@NonNull Message msg) {
28 | switch (msg.what) {
29 | case NAME_CHANGED:
30 | mSettingsView.showChangeName();
31 | break;
32 | case PROFILE_CHANGED:
33 | mSettingsView.showProfileAfterChange();
34 | break;
35 | case CHECK_FALSE:
36 | mSettingsView.showCheckPasswordFalse();
37 | break;
38 | case CHECK_SUCCESS:
39 | mSettingsView.showCheckPasswordSuccess();
40 | break;
41 | case DELETE_USER:
42 | mSettingsView.showDeleteUser();
43 | break;
44 |
45 | }
46 | }
47 | };
48 |
49 | public SettingsPresenter(SettingsView settingsView) {
50 | mSettingsModel = new SettingsModel();
51 | mSettingsView = settingsView;
52 | }
53 |
54 | public void changeName(String newName) {
55 | new Thread(new Runnable() {
56 | @Override
57 | public void run() {
58 | mSettingsModel.changeName(newName);
59 | Message message = new Message();
60 | message.what = NAME_CHANGED;
61 | mHandler.sendMessage(message);
62 | }
63 | }).start();
64 | }
65 |
66 | public void changeProfile(String profile) {
67 | new Thread(new Runnable() {
68 | @Override
69 | public void run() {
70 | mSettingsModel.setProfile(profile);
71 | Message message = new Message();
72 | message.what = PROFILE_CHANGED;
73 | mHandler.sendMessage(message);
74 | }
75 | }).start();
76 |
77 | }
78 |
79 | public void changePassword(String password, String newPassword) {
80 | new Thread(new Runnable() {
81 | @Override
82 | public void run() {
83 | mCheckRes = mSettingsModel.checkPassword(password);
84 | Message message = new Message();
85 | if (mCheckRes) {
86 | mSettingsModel.changePassword(newPassword);
87 | message.what = CHECK_SUCCESS;
88 | } else {
89 | message.what = CHECK_FALSE;
90 | }
91 | mHandler.sendMessage(message);
92 | }
93 | }).start();
94 | }
95 |
96 | public void deleteUser(String password) {
97 | new Thread(new Runnable() {
98 | @Override
99 | public void run() {
100 | mCheckRes = mSettingsModel.checkPassword(password);
101 | Message message = new Message();
102 | if (mCheckRes) {
103 | mSettingsModel.deleteUser();
104 | message.what = DELETE_USER;
105 | } else {
106 | message.what = CHECK_FALSE;
107 | }
108 | mHandler.sendMessage(message);
109 | }
110 | }).start();
111 | }
112 | public void getProfile(){
113 | new Thread(new Runnable() {
114 | @Override
115 | public void run() {
116 | mSettingsModel.getProfile();
117 | Message message = new Message();
118 | message.what = GET_PROFILE;
119 | mHandler.sendMessage(message);
120 |
121 | }
122 | }).start();
123 |
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Orange Broswer
3 | Orange
4 |
5 | 搜索
6 | 搜索或输入网址
7 | 立即登录
8 | 添加收藏
9 | 我的收藏
10 | 历史记录
11 | 收藏
12 | 退出
13 | 设置
14 | 取消
15 | 保存成功
16 | 保存本地
17 | 警告
18 | 您访问的网页存在潜在危险,是否继续访问?
19 | 确认
20 | 取消
21 | 修改密码
22 | 注销后会删除除历史记录外的所有用户数据
23 | 注销
24 | 刷新
25 | 验证密码
26 | 确认
27 |
28 | 设置
29 | 请输入手机号
30 | 请输入密码
31 | 登录
32 | login_back
33 | register_back
34 | 注册
35 | 请设置密码
36 | 请重复设置密码
37 | 还没有账号?
38 | 马上注册
39 | 注册
40 | 立即登录
41 | 已有账号?
42 | 清空
43 | 删除
44 | 退出登录
45 | 退出后不会删除任何历史数据,下次登录依然可以使用本账号
46 | 修改昵称
47 | 修改密码
48 | 手机号
49 | 注销账号
50 | 夜间模式
51 | 无痕浏览
52 | 确认清空历史记录
53 | 确认清空所有收藏
54 | 登录后才能使用该功能
55 |
56 | Hello blank fragment
57 | 修改昵称
58 | 修改
59 | 更换头像
60 | 从相册中选取
61 | 拍摄照片
62 | 添加收藏成功
63 | 添加快捷
64 | 快捷网址名称
65 | www.xxxx.com
66 |
67 |
68 | ByteDance
69 | Inspire Creativity, Enrich Life
70 | Culture
71 | ByteStyle is fundamental to corporate culture at ByteDance and represents the principles we uphold as employees.
72 | Raise the bar.
73 | Wait for bigger gains.
74 | Find the best solutions by widening your perspective.
75 | Be attentive.
76 |
77 | Make your own discoveries.
78 | Dive deep into facts.
79 | Stay level-headed. Focus on impact.
80 | Assume ownership, take risks, break the mold.
81 |
82 | Trust yourself, trust each other.
83 | Be willing to offer and ask for help. Collaboration creates value.
84 |
85 | Dare to share your honest opinions.
86 | It is okay to make mistakes.
87 | Own it when you do.
88 | Stick to the facts, identify issues.
89 |
90 | Take initiative and push boundaries — there is no task too big or too small.
91 | Be resilient. Face reality and change it.
92 |
93 | Be tenacious in making sure that the diversity of the world is reflected in your team.
94 | Welcome people as they are, value uniqueness.
95 |
96 |
--------------------------------------------------------------------------------
/app/src/main/java/com/example/fruit/home/QuickPageAdapter.java:
--------------------------------------------------------------------------------
1 | package com.example.fruit.home;
2 |
3 |
4 | import android.content.Context;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.ImageView;
9 | import android.widget.TextView;
10 |
11 | import androidx.recyclerview.widget.RecyclerView;
12 |
13 | import com.bumptech.glide.Glide;
14 | import com.example.fruit.R;
15 |
16 | import java.util.ArrayList;
17 |
18 |
19 | public class QuickPageAdapter extends RecyclerView.Adapter implements View.OnClickListener,View.OnLongClickListener{
20 |
21 |
22 | private Context mContext;
23 | private ArrayList mQuickList;
24 | //private int itemLayoutId;
25 |
26 | private QuickViewHolder mQuickViewHolder;
27 | private QuickPage mQuickPage;
28 |
29 | public QuickPageAdapter(Context context, ArrayList quickList) {
30 | this.mContext = context;
31 | this.mQuickList = quickList;
32 | }
33 |
34 |
35 |
36 | @Override
37 |
38 | public int getItemCount() {
39 |
40 | return mQuickList.size();
41 |
42 | }
43 |
44 | @Override
45 |
46 | public QuickViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
47 | // Log.i("main","onCreateViewHolder---mQuickList.size()=="+mQuickList.size());
48 | View view = LayoutInflater.from(mContext).inflate(R.layout.quick_page_item, null, true);//R.layout.layout_QuickPages_grid_item
49 |
50 | mQuickViewHolder = new QuickViewHolder(view);
51 |
52 | //给每个quick page 设置点击事件
53 | view.setOnClickListener(this);
54 |
55 | //长按事件监听
56 | view.setOnLongClickListener(this);
57 |
58 | return mQuickViewHolder;
59 |
60 | }
61 |
62 |
63 |
64 | @Override
65 |
66 | public void onBindViewHolder(QuickViewHolder mQuickViewHolder, final int position) {
67 | // Log.i("main","onBindViewHolder---mQuickList====="+mQuickList.size()+"-------position=="+position);
68 |
69 | mQuickPage = mQuickList.get(position);
70 |
71 | mQuickViewHolder.tv_title.setText(mQuickPage.getTitle());
72 |
73 | //mQuickViewHolder.tv_url.setText("URL:"+mQuickPage.getUrl()+"");
74 |
75 | // //设置图片
76 | // Glide.with(mContext).load(mQuickPage.getImgPathId()).into(mQuickViewHolder.iv_headImg);
77 | //如果设置了网上图片url的就按照网上的设置,否则设置本地的图片
78 | if(mQuickPage.getImgPathUrl()!=null && !mQuickPage.getImgPathUrl().isEmpty())
79 | {
80 | try {
81 | Glide.with(mContext).load(mQuickPage.getImgPathUrl()).into(mQuickViewHolder.iv_headImg);
82 | }catch (Exception e)
83 | {
84 | //如果网上的图片路径出错则加载本地的图片
85 | Glide.with(mContext).load(mQuickPage.getImgPathId()).into(mQuickViewHolder.iv_headImg);
86 | }
87 |
88 | }else {
89 | //加载项目本地图片
90 | Glide.with(mContext).load(mQuickPage.getImgPathId()).into(mQuickViewHolder.iv_headImg);
91 | }
92 |
93 |
94 | mQuickViewHolder.itemView.setTag(position);
95 |
96 | }
97 |
98 | /**
99 | * 设置ViewHolder
100 | */
101 | public class QuickViewHolder extends RecyclerView.ViewHolder {
102 |
103 | private ImageView iv_headImg;
104 | private TextView tv_title;
105 | //private TextView tv_url;
106 |
107 | public QuickViewHolder(View itemView) {
108 | super(itemView);
109 |
110 | iv_headImg = (ImageView)itemView.findViewById(R.id.iv_headImg);
111 | tv_title = (TextView)itemView.findViewById(R.id.tv_title);
112 | //tv_url = (TextView)itemView.findViewById(R.id.tv_url);
113 |
114 | }
115 |
116 | }
117 |
118 | //点击事件监听
119 | public OnItemClickListener mItemClickListener;
120 |
121 | @Override
122 |
123 | public void onClick(View v) {
124 | //设置item的点击事件
125 | if (mItemClickListener != null)
126 | {
127 | mItemClickListener.onItemClick((Integer) v.getTag());
128 | }
129 |
130 | }
131 |
132 | public interface OnItemClickListener {
133 | void onItemClick(int position);
134 | }
135 |
136 | public void setItemClickListener(OnItemClickListener itemClickListener) {
137 | mItemClickListener = itemClickListener;
138 | }
139 |
140 | //长按事件监听
141 | public OnItemLongClickListener mItemLongClickListener;
142 | @Override
143 | public boolean onLongClick(View view) {
144 | if(mItemLongClickListener!=null)
145 | {
146 | mItemLongClickListener.onItemLongClick((Integer) view.getTag());
147 | }
148 | return false;
149 | }
150 | public interface OnItemLongClickListener {
151 | void onItemLongClick(int position);
152 | }
153 |
154 | public void setItemLongClickListener(OnItemLongClickListener itemLongClickListener) {
155 | mItemLongClickListener = itemLongClickListener;
156 | }
157 |
158 |
159 | }
160 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/home_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
15 |
24 |
25 |
34 |
42 |
43 |
59 |
60 |
61 |
70 |
71 |
79 |
80 |
90 |
91 |
96 |
105 |
113 |
114 |
115 |
123 |
124 |
125 |
126 |
127 |
128 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
31 |
32 |
38 |
39 |
53 |
54 |
62 |
63 |
64 |
72 |
73 |
74 |
75 |
82 |
89 |
90 |
91 |
98 |
105 |
106 |
111 |
112 |
113 |
120 |
125 |
126 |
127 |
134 |
138 |
139 |
140 |
147 |
151 |
152 |
153 |
154 |
155 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/login_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
22 |
29 |
30 |
31 |
32 |
37 |
38 |
43 |
44 |
54 |
60 |
78 |
79 |
80 |
90 |
96 |
113 |
114 |
115 |
116 |
126 |
127 |
133 |
134 |
140 |
141 |
148 |
149 |
150 |
151 |
152 |
153 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/discover_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
12 |
17 |
25 |
34 |
35 |
36 |
37 |
41 |
50 |
59 |
60 |
65 |
66 |
73 |
74 |
81 |
82 |
83 |
84 |
90 |
91 |
98 |
99 |
105 |
106 |
107 |
108 |
113 |
114 |
121 |
122 |
129 |
130 |
131 |
132 |
138 |
139 |
146 |
147 |
153 |
154 |
155 |
156 |
161 |
162 |
169 |
170 |
177 |
178 |
179 |
180 |
186 |
187 |
194 |
195 |
201 |
202 |
203 |
204 |
205 |
--------------------------------------------------------------------------------