first commit

This commit is contained in:
ocean 2025-12-22 10:40:26 +08:00
commit eea9190172
123 changed files with 171328 additions and 0 deletions

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

3
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

1
.idea/.name generated Normal file
View File

@ -0,0 +1 @@
Photography Wallpapers

6
.idea/AndroidProjectSystem.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

8
.idea/compiler.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17">
<module name="Photography_Wallpapers.app" target="21" />
</bytecodeTargetLevel>
</component>
</project>

435
.idea/dbnavigator.xml generated Normal file
View File

@ -0,0 +1,435 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DDLFileAttachmentManager">
<mappings />
<preferences />
</component>
<component name="DBNavigator.Project.DatabaseAssistantManager">
<assistants />
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
<enable-sticky-paths value="true" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="JAVA_CLASS" enabled="true" />
<object-type name="JAVA_INNER_CLASS" enabled="true" />
<object-type name="JAVA_FIELD" enabled="true" />
<object-type name="JAVA_METHOD" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
<object-type name="CREDENTIAL" enabled="true" />
<object-type name="AI_PROFILE" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="JAVA CLASS" enabled="true" />
<object-type name="INNER CLASS" enabled="true" />
<object-type name="JAVA FIELD" enabled="true" />
<object-type name="JAVA METHOD" enabled="true" />
<object-type name="JAVA PARAMETER" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
<object-type name="CREDENTIAL" enabled="false" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<audit-columns>
<column-names value="" />
<visible value="true" />
<editable value="false" />
</audit-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="Java" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="Groovy" enabled="true" />
<content-type name="AIDL" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Manifest" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
<exit-on-changes value="ASK" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
<mapping file-type-id="JAVA_SOURCE" extensions="sql" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<assistant-settings>
<credential-settings>
<credentials />
</credential-settings>
</assistant-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
</project>

29
.idea/deploymentTargetSelector.xml generated Normal file
View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-12-05T02:51:36.006062Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\Administrator\.android\avd\Pixel_9.avd" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection>
<targets>
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\Administrator\.android\avd\Medium_Phone.avd" />
</handle>
</Target>
</targets>
</DialogSelection>
</SelectionState>
<SelectionState runConfigName="Snap_Wallpaper.app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

13
.idea/deviceManager.xml generated Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="DESCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

6
.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/app/build.gradle.kts" charset="UTF-8" />
</component>
</project>

20
.idea/gradle.xml generated Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-21" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
<option name="parallelModelFetch" value="true" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
<option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,android.content.res.AssetManager,open" />
</inspection_tool>
</profile>
</component>

6
.idea/kotlinc.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.0" />
</component>
</project>

10
.idea/migrations.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

16
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,16 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
<component name="VisualizationToolProject">
<option name="state">
<ProjectState>
<option name="scale" value="0.19048339843749995" />
</ProjectState>
</option>
</component>
</project>

6
.idea/render.experimental.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="showDecorations" value="true" />
</component>
</project>

17
.idea/runConfigurations.xml generated Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

BIN
app/SnapWallpaper.jks Normal file

Binary file not shown.

111
app/build.gradle.kts Normal file
View File

@ -0,0 +1,111 @@
import java.util.Date
import java.text.SimpleDateFormat
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("io.objectbox")
kotlin("kapt")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
}
val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date())
android {
namespace = "com.wall.snap.wallpaper"
compileSdk = 36
defaultConfig {
//com.wall.snap.wallpaper
applicationId = "com.wall.snap.wallpaper"
minSdk = 24
targetSdk = 36
versionCode = 2
versionName = "1.2"
setProperty("archivesBaseName", "Snap Wallpaper_V" + versionName + "(${versionCode})_$timestamp")
testInstrumentationRunner = "androidx.live.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
buildFeatures{
viewBinding = true
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation("com.airbnb.android:lottie:6.0.0")
implementation("jp.wasabeef:blurry:3.0.0")//图片模糊依赖
implementation("androidx.appcompat:appcompat:1.7.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
testImplementation("junit:junit:4.13.2")
implementation ("com.github.bumptech.glide:glide:5.0.5")
implementation ("jp.wasabeef:glide-transformations:4.3.0") // Glide Transformations
implementation("com.squareup.okhttp3:okhttp:5.3.1")
implementation(files("libs/UpLoadLibrary_12_03_15_13-release.aar"))
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("com.google.android.gms:play-services-ads-identifier:18.0.1")
implementation("com.google.android.gms:play-services-location:21.0.1")
implementation("com.google.android.gms:play-services-appset:16.0.1")
// Import the Firebase BoM
implementation(platform("com.google.firebase:firebase-bom:34.6.0"))
implementation("com.google.firebase:firebase-crashlytics-ndk")
implementation("com.google.firebase:firebase-analytics")
// okhttp
implementation ("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
// TradPlus
implementation("com.tradplusad:tradplus:15.1.10.1")
//noinspection GradleCompatible
implementation("androidx.legacy:legacy-support-v4:1.0.0")
implementation("androidx.appcompat:appcompat:1.3.0-alpha02")
// Ironsource
implementation("com.ironsource.sdk:mediationsdk:9.0.0")
implementation("com.tradplusad:tradplus-ironsource:10.15.1.10.1")
// Pangle
implementation("com.tradplusad:tradplus-pangle:19.15.1.10.1")
implementation("com.pangle.global:pag-sdk:7.7.0.2")
// UnityAds
implementation("com.tradplusad:tradplus-unity:5.15.1.10.1")
implementation("com.unity3d.ads:unity-ads:4.16.3")
//optional dependency for better targeting
implementation("androidx.browser:browser:1.8.0")
implementation("com.squareup.picasso:picasso:2.8")
implementation("androidx.viewpager:viewpager:1.0.0")
implementation("androidx.recyclerview:recyclerview:1.2.1")
// Mintegral
implementation("com.tradplusad:tradplus-mintegralx_overseas:18.15.1.10.1")
implementation("androidx.recyclerview:recyclerview:1.1.0")
implementation("com.mbridge.msdk.oversea:mbridge_android_sdk:16.10.11")
// Liftoff
implementation("com.tradplusad:tradplus-vunglex:7.15.1.10.1")
implementation("com.vungle:vungle-ads:7.6.0")
// Cross Promotion
implementation("com.tradplusad:tradplus-crosspromotion:27.15.1.10.1")
// TP Exchange
// 请注意保持与主包版本同步更新
implementation("com.google.code.gson:gson:2.8.6")
implementation("com.tradplusad:tp_exchange:40.15.1.10.1")
}

29
app/google-services.json Normal file
View File

@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "117908128340",
"project_id": "snapwallpaper-f365c",
"storage_bucket": "snapwallpaper-f365c.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:117908128340:android:cf8eb8bab3bab5a72423c1",
"android_client_info": {
"package_name": "com.wall.snap.wallpaper"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAAabILvTyoD2-F-dFdbY6wX0LBK8VeINc"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

Binary file not shown.

View File

@ -0,0 +1,144 @@
{
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
"entities": [
{
"id": "6:3623569355603461837",
"lastPropertyId": "13:8810337262814553136",
"name": "MysnapData",
"properties": [
{
"id": "1:1613390646826194410",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "2:2746560176066496482",
"name": "categoryName",
"type": 9
},
{
"id": "3:4811767528167283054",
"name": "imId",
"type": 9
},
{
"id": "4:6849782696490064180",
"name": "description",
"type": 9
},
{
"id": "5:664074046669081667",
"name": "fullUrl",
"type": 9
},
{
"id": "6:5464820425358793767",
"name": "previewUrl1080",
"type": 9
},
{
"id": "7:8042635151122418298",
"name": "previewUrl400",
"type": 9
},
{
"id": "8:7102422256427576065",
"name": "previewUrl200",
"type": 9
},
{
"id": "9:4658954390816279112",
"name": "authorName",
"type": 9
},
{
"id": "10:3881973967833794942",
"name": "authorHeader",
"type": 9
},
{
"id": "11:9170641481768457174",
"name": "authorHtml",
"type": 9
},
{
"id": "12:6259517656726224835",
"name": "isLike",
"type": 1
},
{
"id": "13:8810337262814553136",
"name": "isDownload",
"type": 1
}
],
"relations": []
}
],
"lastEntityId": "6:3623569355603461837",
"lastIndexId": "0:0",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
"modelVersion": 5,
"modelVersionParserMinimum": 5,
"retiredEntityUids": [
8119453540460508569,
8776066878034520742,
817335537070466014,
5374318059423987080,
685364146796074749
],
"retiredIndexUids": [],
"retiredPropertyUids": [
8848640050018073106,
4870222079156330783,
4966768060561274983,
8892036187720267027,
1670319685727744805,
3855211567189961055,
7567671966987007993,
2590164264280025677,
8912833100894718986,
7138929457594592554,
3957870060050722570,
2943285943884558608,
7262008615134929676,
7105947400861196483,
1954934496493857304,
8582031355111471002,
8410380097928190493,
3380197792593924336,
5750724995960958985,
5907193265594068445,
7643711915014989832,
5454072153734548882,
8866886314389627366,
6647852625511577303,
8481286751506557167,
615207224772228883,
2114128640869665061,
4004858028833616093,
1649948666606108567,
4925649389754620618,
6869613325061909824,
1127054227079914732,
1786583882238143778,
971666463843397477,
210777564050073726,
247374498341298341,
3460009289568145403,
782719652310147870,
7209781481676169606,
2265590433619343350,
7335211322982532851,
742504509190476600,
615514068830412819,
9059558857143345132,
7608954248662311113
],
"retiredRelationUids": [],
"version": 1
}

View File

@ -0,0 +1,130 @@
{
"_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
"_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
"_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
"entities": [
{
"id": "5:685364146796074749",
"lastPropertyId": "13:7608954248662311113",
"name": "MytwoData",
"properties": [
{
"id": "1:1786583882238143778",
"name": "id",
"type": 6,
"flags": 1
},
{
"id": "2:971666463843397477",
"name": "categoryName",
"type": 9
},
{
"id": "3:210777564050073726",
"name": "imId",
"type": 9
},
{
"id": "4:247374498341298341",
"name": "description",
"type": 9
},
{
"id": "5:3460009289568145403",
"name": "fullUrl",
"type": 9
},
{
"id": "6:782719652310147870",
"name": "previewUrl1080",
"type": 9
},
{
"id": "7:7209781481676169606",
"name": "previewUrl400",
"type": 9
},
{
"id": "8:2265590433619343350",
"name": "previewUrl200",
"type": 9
},
{
"id": "9:7335211322982532851",
"name": "authorName",
"type": 9
},
{
"id": "10:742504509190476600",
"name": "authorHeader",
"type": 9
},
{
"id": "11:615514068830412819",
"name": "authorHtml",
"type": 9
},
{
"id": "12:9059558857143345132",
"name": "isLike",
"type": 1
},
{
"id": "13:7608954248662311113",
"name": "isDownload",
"type": 1
}
],
"relations": []
}
],
"lastEntityId": "5:685364146796074749",
"lastIndexId": "0:0",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
"modelVersion": 5,
"modelVersionParserMinimum": 5,
"retiredEntityUids": [
8119453540460508569,
8776066878034520742,
817335537070466014,
5374318059423987080
],
"retiredIndexUids": [],
"retiredPropertyUids": [
8848640050018073106,
4870222079156330783,
4966768060561274983,
8892036187720267027,
1670319685727744805,
3855211567189961055,
7567671966987007993,
2590164264280025677,
8912833100894718986,
7138929457594592554,
3957870060050722570,
2943285943884558608,
7262008615134929676,
7105947400861196483,
1954934496493857304,
8582031355111471002,
8410380097928190493,
3380197792593924336,
5750724995960958985,
5907193265594068445,
7643711915014989832,
5454072153734548882,
8866886314389627366,
6647852625511577303,
8481286751506557167,
615207224772228883,
2114128640869665061,
4004858028833616093,
1649948666606108567,
4925649389754620618,
6869613325061909824,
1127054227079914732
],
"retiredRelationUids": [],
"version": 1
}

29
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,29 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keep class com.wall.snap.wallpaper.mysnapbean.** { *; }
-keep class com.google.gson.** { *; }
-keepattributes Signature
-keepattributes AnnotationDefault,RuntimeVisibleAnnotations
-keep public class com.tradplus.** { *; }
-keep class com.tradplus.ads.** { *; }

View File

@ -0,0 +1,26 @@
package com.free.life.wallpaper;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented live, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under live.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.hd.kwallpapers.wallpapers.live", appContext.getPackageName());
}
}

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.AD_ID" />
<application
android:name="com.wall.snap.wallpaper.MysnapApp"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/logo2"
android:label="SnapWallpaper"
android:roundIcon="@mipmap/logo2"
android:supportsRtl="true"
tools:replace="networkSecurityConfig"
android:networkSecurityConfig="@xml/net"
android:theme="@style/Theme.Wallpaper"
tools:targetApi="31">
<activity
android:name="com.wall.snap.wallpaper.acctivitysnap.SearchsnapActivity"
android:exported="false" />
<activity
android:name="com.wall.snap.wallpaper.acctivitysnap.ListsnapActivity"
android:exported="false" />
<activity
android:name="com.wall.snap.wallpaper.acctivitysnap.SplashsnapActivity"
android:exported="true"
android:theme="@style/Theme.WelWallpaper">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.wall.snap.wallpaper.acctivitysnap.WallpapersnapActivity"
android:exported="false" />
<activity
android:name="com.wall.snap.wallpaper.acctivitysnap.MainsnapActivity"
android:exported="false" />
</application>
</manifest>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

20703
app/src/main/assets/Film.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,86 @@
package com.wall.snap.wallpaper;
import android.app.Application;
import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;
import com.tradplus.ads.open.TradPlusSdk;
import com.up.uploadlibrary.UpLoadManager;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import com.wall.snap.wallpaper.toolsnap.JsonDatasnap;
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MysnapApp extends Application {
public static Context mAppContext;
public static String TAG = "-------MysnapApp---------";
public static Typeface defaultFont;
private String animasName = "Animals.json";
private String exName = "Experimental.json";
private String filmName = "Film.json";
private String natureName = "Nature.json";
private String pattName = "Patterns.json";
private String streetName = "Street.json";
private String travelName = "Travel.json";
private String wallpaperName = "Featured.json";
private ExecutorService executor;
private static List<String> CategoryNames = new ArrayList<>();
private int i = 0;
@Override
public void onCreate() {
super.onCreate();
mAppContext = this;
defaultFont = Typeface.createFromAsset(getAssets(), "custfont.ttf");
// 上传
UpLoadManager.INSTANCE.init(this, "update_load", (s, s2) -> null);
ObectBoxManagersnap.init(this);
executor = Executors.newFixedThreadPool(8);
String[] names = {wallpaperName, animasName, exName, filmName, natureName, pattName, streetName, travelName};
TradPlusSdk.initSdk(this, "0BD6FE6AA41F6DAC752AAFCBBBEDD911");
try {
for (String name : names) {
InputStream open = getAssets().open(name);
String covertStr = ComUtilssnap.getCovertStr(open);
if (!covertStr.isEmpty()) {
String realName = name.substring(0, name.indexOf("."));
CategoryNames.add(realName);
executor.execute(new Runnable() {
@Override
public void run() {
i++;
Log.d(MysnapApp.TAG, "------------111");
List<MysnapData> data = JsonDatasnap.INSTANCE.getData(covertStr, realName);
Collections.shuffle(data);
for (MysnapData data1:data){
ObectBoxManagersnap.addData(data1);
}
}
});
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static List<String> getCategoryNames() {
return CategoryNames;
}
}

View File

@ -0,0 +1,36 @@
package com.wall.snap.wallpaper.acctivitysnap
import android.os.Bundle
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
open class BaseActivity: AppCompatActivity() {
protected var backPressedCallback: OnBackPressedCallback? = null
/** 子类是否需要拦截返回 */
protected open fun shouldInterceptBackPress(): Boolean = false
/** 子类定义拦截后的操作(例如弹窗) */
protected open fun onInterceptBackPressed() {}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupBackPressedCallback()//初始化back事件
}
private fun setupBackPressedCallback() {
backPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (shouldInterceptBackPress()) {
// 由子类处理拦截动作
onInterceptBackPressed()
} else {
// 不拦截:关闭自己
isEnabled = false
onBackPressedDispatcher.onBackPressed()
}
}
}
onBackPressedDispatcher.addCallback(this, backPressedCallback!!)
}
}

View File

@ -0,0 +1,104 @@
package com.wall.snap.wallpaper.acctivitysnap;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import com.tradplus.ads.base.bean.TPAdInfo;
import com.wall.snap.wallpaper.ad.AdsInsUtil;
import com.wall.snap.wallpaper.ad.LoadListener;
import com.wall.snap.wallpaper.ad.ShowListener;
import com.wall.snap.wallpaper.databinding.ActivityListsnapBinding;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap;
import com.wall.snap.wallpaper.toolsnap.ItemHelpersnap;
import com.wall.snap.wallpaper.itemsnap.ItemsnapList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class ListsnapActivity extends BaseActivity implements com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick {
private ActivityListsnapBinding vb;
private String categoryName;
public static final String key_index = "index";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vb = ActivityListsnapBinding.inflate(getLayoutInflater());
setContentView(vb.getRoot());
ComUtilssnap.initFull(this, false);
categoryName = getIntent().getStringExtra(key_index);
vb.name.setText(categoryName);
initList();
vb.imageviewBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onInterceptBackPressed();
}
});
}
private void initList() {
List<MysnapData> data = ObectBoxManagersnap.queryCategoryAll(categoryName);
ItemHelpersnap itemHelpertwo = new ItemHelpersnap(10, 10, 0);
// StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
vb.list.addItemDecoration(itemHelpertwo);
vb.list.setLayoutManager(gridLayoutManager);
int height = ComUtilssnap.dp2Px(200);
ItemsnapList itemList = new ItemsnapList(this, height,false);
itemList.setDataInfo(data);
itemList.setInfoWallpaperListener(this);
vb.list.setAdapter(itemList);
}
@Override
public void onItemClickAction(MysnapData info) {
Intent intent = new Intent(this, WallpapersnapActivity.class);
intent.putExtra(ComUtilssnap.key_info, info);
startActivity(intent);
}
@Override
protected boolean shouldInterceptBackPress() {
return true;
}
@Override
protected void onInterceptBackPressed() {
AdsInsUtil.INSTANCE.showAd(this, AdsInsUtil.Placement.TOP_ON_AD_TOW, new ShowListener() {
@Override
public void onAdShown(@Nullable TPAdInfo ad) {
loadAd();
}
@Override
public void onAdClosed() {
loadAd();
}
});
if (getBackPressedCallback() != null) {
getBackPressedCallback().setEnabled(false);
}
getOnBackPressedDispatcher().onBackPressed();
}
private void loadAd(){
AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_TOW, new LoadListener() {
@Override
public void loadFailed(@NotNull String error) {
}
});
}
}

View File

@ -0,0 +1,167 @@
package com.wall.snap.wallpaper.acctivitysnap;
import android.graphics.Bitmap;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import com.google.android.material.tabs.TabLayout;
import com.tradplus.ads.base.bean.TPAdInfo;
import com.wall.snap.wallpaper.R;
import com.wall.snap.wallpaper.ad.AdsInsUtil;
import com.wall.snap.wallpaper.ad.LoadListener;
import com.wall.snap.wallpaper.databinding.ActivityMainsnapBinding;
import com.wall.snap.wallpaper.databinding.ItemTabsnapBinding;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.blurry.Blurry;
public class MainsnapActivity extends AppCompatActivity {
private ImageView imageView;
private ActivityMainsnapBinding vb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vb = ActivityMainsnapBinding.inflate(getLayoutInflater());
ComUtilssnap.initFull(this, false);
setContentView(vb.getRoot());
loadAd();
List<Fragment> list = new ArrayList<>();
list.add(com.wall.snap.wallpaper.fragmentsnap.FragmentMainsnap.newInstance(0));
// list.add(FragUiSearch.newInstance());
list.add(com.wall.snap.wallpaper.fragmentsnap.FragmentLikesnap.newInstance());
// list.add(FragmentDownload.newInstance());
int[] ints = {R.drawable.selector_home2, R.drawable.selector_tab_like2};
vb.viewpager2.setAdapter(new FragmentStateAdapter(this) {
@NonNull
@Override
public Fragment createFragment(int position) {
return list.get(position);
}
@Override
public int getItemCount() {
return list.size();
}
});
vb.viewpager2.setUserInputEnabled(false);
for (int i = 0; i < list.size(); i++) {
TabLayout.Tab tab = vb.tab.newTab();
ItemTabsnapBinding tabVb = ItemTabsnapBinding.inflate(getLayoutInflater());
tabVb.imageIcon.setImageDrawable(ContextCompat.getDrawable(this, ints[i]));
tab.setCustomView(tabVb.getRoot());
// if (i == 0) {
// tabVb.imageIndicator.setVisibility(View.VISIBLE);
// } else {
// tabVb.imageIndicator.setVisibility(View.GONE);
// }
vb.tab.addTab(tab);
}
vb.tab.setTabTextColors(Color.TRANSPARENT, Color.TRANSPARENT);
vb.tab.setSelectedTabIndicatorHeight(0);
vb.tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
int position = tab.getPosition();
vb.viewpager2.setCurrentItem(position);
View customView = tab.getCustomView();
// View imageIndicator = customView.findViewById(R.id.image_indicator);
// imageIndicator.setVisibility(View.VISIBLE);
if (position == 0) {
vb.textviewWallpaper.setText(getString(R.string.app_name));
} else {
vb.textviewWallpaper.setText(getString(R.string.collections));
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
View customView = tab.getCustomView();
// View imageIndicator = customView.findViewById(R.id.image_indicator);
// imageIndicator.setVisibility(View.INVISIBLE);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
// vb.imSearch.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// Intent intent = new Intent(MainsnapActivity.this, SearchsnapActivity.class);
// startActivity(intent);
// }
// });
//
vb.searchBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainsnapActivity.this, SearchsnapActivity.class);
startActivity(intent);
}
});
imageView = findViewById(R.id.blurred_background);
// 通过加载高清图片来进行模糊处理
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.beijing);
// 使用 Blurry 库模糊图片
Blurry.with(this)
.radius(50) // 模糊半径数值越大模糊越强
.sampling(20) // 图片的采样率越大模糊效果越明显
.from(originalBitmap) // 原始图片
.into(imageView); // 结果显示到 imageView
}
private void loadAd() {
AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_THREE, new LoadListener() {
@Override
public void loaded(@NotNull TPAdInfo ad) {
}
@Override
public void loadFailed(@NotNull String error) {
}
});
AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_TOW, new LoadListener() {
@Override
public void loaded(@NotNull TPAdInfo ad) {
}
@Override
public void loadFailed(@NotNull String error) {
}
});
}
}

View File

@ -0,0 +1,106 @@
package com.wall.snap.wallpaper.acctivitysnap
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.TextView.OnEditorActionListener
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import com.wall.snap.wallpaper.R
//import com.wall.snap.wallpaper.databinding.ActivitySearchBinding
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap
import com.wall.snap.wallpaper.toolsnap.ItemHelpersnap
import com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick
import com.wall.snap.wallpaper.databinding.ActivitySearchsnapBinding
import com.wall.snap.wallpaper.mysnapbean.MysnapData
import com.wall.snap.wallpaper.itemsnap.ItemsnapList
class SearchsnapActivity : AppCompatActivity() ,
OnItemsnapClick {
private lateinit var adapterWallapper: ItemsnapList
private lateinit var binding: ActivitySearchsnapBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySearchsnapBinding.inflate(layoutInflater)
setContentView(binding.root)
ComUtilssnap.initFull(this, false)
initList()
binding.imageviewBack.setOnClickListener {
finish()
}
}
private fun initList() {
val height = ComUtilssnap.dp2Px(180)
adapterWallapper =
ItemsnapList(this, height, true)
adapterWallapper.setInfoWallpaperListener(this)
val recyclerItemHelpertwo = ItemHelpersnap(10, 10, 15)
val gridLayoutManager = GridLayoutManager(this, 2)
binding.resultRecycler.run {
layoutManager = gridLayoutManager
addItemDecoration(recyclerItemHelpertwo)
adapter = adapterWallapper
}
binding.et.setOnEditorActionListener(OnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
startSearch()
return@OnEditorActionListener true
}
false
})
binding.btnSearch.setOnClickListener { startSearch() }
}
private fun closeKeyboard() {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(binding.et.windowToken, 0)
}
private fun startSearch() {
closeKeyboard()
binding.searchPb.visibility = View.VISIBLE
val string: String = binding.et.text.toString()
if (string.isNotEmpty()) {
val search = ObectBoxManagersnap.search(string)
if (search.size > 0) {
showEmpty(false)
adapterWallapper.setDataInfo(search)
binding.searchPb.visibility = View.GONE
} else {
binding.searchPb.visibility = View.GONE
showEmpty(true)
}
} else {
binding.searchPb.visibility = View.GONE
Toast.makeText(
this,
getString(R.string.please_input_keyword),
Toast.LENGTH_SHORT
).show()
}
}
private fun showEmpty(showEmpty: Boolean) {
if (showEmpty) {
binding.emptyLayout.visibility = View.VISIBLE
binding.resultRecycler.visibility = View.GONE
} else {
binding.emptyLayout.visibility = View.GONE
binding.resultRecycler.visibility = View.VISIBLE
}
}
override fun onItemClickAction(info: MysnapData?) {
val intent = Intent(this, WallpapersnapActivity::class.java)
intent.putExtra(ComUtilssnap.key_info, info)
startActivity(intent)
}
}

View File

@ -0,0 +1,175 @@
package com.wall.snap.wallpaper.acctivitysnap
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.widget.Toast
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable
import com.tradplus.ads.base.bean.TPAdInfo
import com.wall.snap.wallpaper.R
import com.wall.snap.wallpaper.ad.AdShowFailed
import com.wall.snap.wallpaper.ad.AdsInsUtil
import com.wall.snap.wallpaper.ad.LoadListener
import com.wall.snap.wallpaper.ad.ShowListener
import com.wall.snap.wallpaper.databinding.ActivitySplashsnapBinding
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap
class SplashsnapActivity : BaseActivity() {
private var countDownTimer: CountDownTimer? = null
private lateinit var vb: ActivitySplashsnapBinding
private val tickInterval = 100L
private val totalTime = 15_000L
/**
* tick 次数 15
*/
private val totalTicks = totalTime / tickInterval
/**
* tick 增加的进度 0.6666~
*/
private val normalStep = 100f / totalTicks
private val fastStep = normalStep * 4 // 加速倍率
private var currentStep = normalStep
// 进度控制
private var progress = 0f
// 广告状态
private var adAvailable = false
private var hasNavigated = false
// Lottie
private lateinit var lottieAnimationView: LottieAnimationView
@SuppressLint("MissingInflatedId")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
vb = ActivitySplashsnapBinding.inflate(layoutInflater)
ComUtilssnap.initFull(this, true)
setContentView(vb.root)
// 1. 进来就 load 广告
loadSplashAd()
// 2. 启动进度条(只启动一次)
startProgressTimer()
// 3. Lottie 动画
lottieAnimationView = findViewById(R.id.lottieAnimationView)
lottieAnimationView.visibility = View.VISIBLE
lottieAnimationView.setAnimation("xingqiu.json")
lottieAnimationView.repeatCount = LottieDrawable.INFINITE
lottieAnimationView.playAnimation()
}
private fun startProgressTimer() {
countDownTimer?.cancel()
countDownTimer = object : CountDownTimer(totalTime, tickInterval) {
override fun onTick(millisUntilFinished: Long) {
progress += currentStep
if (progress >= 100f) {
progress = 100f
vb.progressbar.progress = 100
cancel()
onProgressFinished()
} else {
vb.progressbar.progress = progress.toInt()
}
}
override fun onFinish() {
// 不使用
}
}.start()
}
// 进度走完后的统一出口
private fun onProgressFinished() {
if (hasNavigated) return
if (adAvailable) {
showSplashAd()
} else {
navigateToNext()
}
}
private fun loadSplashAd() {
AdsInsUtil.loadAd(
act = this,
adID = AdsInsUtil.Placement.TOP_ON_AD_ONE,
loadListener = object : LoadListener {
override fun loaded(ad: TPAdInfo) {
adAvailable = true
accelerateProgress()
}
override fun loadFailed(error: String) {
adAvailable = false
accelerateProgress()
}
}
)
}
// 广告 load 完 → 加速
private fun accelerateProgress() {
currentStep = fastStep
}
private fun showSplashAd() {
AdsInsUtil.showAd(
act = this,
adID = AdsInsUtil.Placement.TOP_ON_AD_ONE,
listener = object : ShowListener {
override fun onAdShown(ad: TPAdInfo?) {}
override fun onAdShowFailed(error: AdShowFailed?) {
navigateToNext()
}
override fun onAdClosed() {
navigateToNext()
}
}
)
}
private fun navigateToNext() {
if (hasNavigated) return
hasNavigated = true
navigateToMainActivity()
}
override fun shouldInterceptBackPress(): Boolean = true
override fun onInterceptBackPressed() {}
@SuppressLint("QueryPermissionsNeeded")
private fun navigateToMainActivity() {
try {
startActivity(Intent(this, MainsnapActivity::class.java))
finish()
} catch (e: Exception) {
Toast.makeText(this, "跳转失败", Toast.LENGTH_SHORT).show()
e.printStackTrace()
finish()
}
}
override fun onDestroy() {
super.onDestroy()
countDownTimer?.cancel()
countDownTimer = null
}
}

View File

@ -0,0 +1,440 @@
package com.wall.snap.wallpaper.acctivitysnap;
import android.app.WallpaperManager;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
import com.tradplus.ads.base.bean.TPAdInfo;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.R;
import com.wall.snap.wallpaper.ad.AdsInsUtil;
import com.wall.snap.wallpaper.ad.LoadListener;
import com.wall.snap.wallpaper.ad.ShowListener;
import com.wall.snap.wallpaper.databinding.ActivityWallappersnapBinding;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap;
import com.wall.snap.wallpaper.toolsnap.JsonDatasnap;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import kotlin.Unit;
import kotlin.jvm.functions.Function2;
import okhttp3.Call;
public class WallpapersnapActivity extends AppCompatActivity implements com.wall.snap.wallpaper.connectorsnap.OnSelectsnapType {
private WeakReference<WallpapersnapActivity> weakReference;
private MysnapData data;
private WallpaperManager wallpaperManager;
private int permissionCode = 1;
private String mSavePath;
private String imId;
private String fullUrl;
private com.wall.snap.wallpaper.fragmentsnap.MyDialogsnap dialogType;
private File downloadFile;
private Call call;
private ActivityWallappersnapBinding vb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vb = ActivityWallappersnapBinding.inflate(getLayoutInflater());
ComUtilssnap.initFull(this, true);
setContentView(vb.getRoot());
AdsInsUtil.INSTANCE.showAd(this, AdsInsUtil.Placement.TOP_ON_AD_THREE, new ShowListener() {
@Override
public void onAdShown(@org.jetbrains.annotations.Nullable TPAdInfo ad) {
loadAd();
}
@Override
public void onAdClosed() {
loadAd();
}
});
weakReference = new WeakReference<>(this);
data = (MysnapData) getIntent().getSerializableExtra(ComUtilssnap.key_info);
if (data == null) {
return;
}
imId = data.getImId();
mSavePath = JsonDatasnap.INSTANCE.getSaveFilePath(this, imId);
wallpaperManager = WallpaperManager.getInstance(this);
initClick();
loadDetail();
vb.tvContent.setText(data.getDescription());
}
private void loadDetail() {
String previewUrl400 = data.getPreviewUrl400();
String previewUrl1080 = data.getPreviewUrl1080();
// String previewUrl200 = data.getPreviewUrl200();
// String authorHeader = data.getAuthorHeader();
// String authorName = data.getAuthorName();
// String authorHtml = data.getAuthorHtml();
fullUrl = data.getFullUrl();
File file = new File(mSavePath);
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565);
int[] screenWidthHeight = ComUtilssnap.getScreenWidthHeight(this);
Log.d(MysnapApp.TAG, "--------width=" + screenWidthHeight[0] + "----height=" + screenWidthHeight[1]);
if (file.exists()) {
Glide.with(this)
.load(file)
.apply(options)
.placeholder(R.mipmap.im_placeholder)
// .override(screenWidthHeight[0], screenWidthHeight[1])
.transition(DrawableTransitionOptions.withCrossFade(500))
.into(vb.imageviewPreview);
} else {
Glide.with(this)
.asDrawable()
.load(previewUrl1080)
.apply(options)
.skipMemoryCache(true)
.placeholder(R.mipmap.im_placeholder)
.thumbnail(
Glide.with(WallpapersnapActivity.this)
.asDrawable()
.load(previewUrl400)
.apply(options)
.placeholder(R.mipmap.im_placeholder)
.centerCrop()
)
.transition(DrawableTransitionOptions.withCrossFade(500)) // 500ms 淡入效果
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
Log.d(MysnapApp.TAG, "-----------onLoadFailed e" + e.getMessage());
return false;
}
@Override
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
// fullDrawable = resource;
return false;
}
})
.centerCrop()
.into(vb.imageviewPreview);
}
boolean b = ObectBoxManagersnap.queryIsLike(imId);
vb.imageFavorite.setSelected(b);
}
private void initClick() {
vb.imageviewBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
vb.buttonSet.setOnClickListener(v -> {
if (dialogType == null) {
dialogType = new com.wall.snap.wallpaper.fragmentsnap.MyDialogsnap();
dialogType.setListener(WallpapersnapActivity.this);
}
if (!dialogType.isAdded()) {
dialogType.show(getSupportFragmentManager(), "");
}
});
vb.imageFavorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean selected = vb.imageFavorite.isSelected();
vb.imageFavorite.setSelected(!selected);
boolean selectedNew = vb.imageFavorite.isSelected();
data.setLike(selectedNew);
ObectBoxManagersnap.updateLike(data);
}
});
vb.layoutDownload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean permission = JsonDatasnap.INSTANCE.requestPermission(WallpapersnapActivity.this, permissionCode);
if (!permission) {
return;
}
startSaveToAlbum();
}
});
}
private void startSaveToAlbum() {
showDownloadLoading(true);
// File file = new File(mSavePath);
// if (file.exists()) {
// Log.d(MyWallpaper.TAG, "-----------Download 1");
// startSave(file);
// return;
// }
if (downloadFile != null && downloadFile.exists()) {
Log.d(MysnapApp.TAG, "-----------Download 2");
startSave(downloadFile);
return;
}
Log.d(MysnapApp.TAG, "-----------Download 3");
doDownload(true, true);
}
private void doDownload(boolean showMsg, boolean save) {
call = JsonDatasnap.INSTANCE.downloadFile(fullUrl, mSavePath, new Function2<Boolean, InputStream, Unit>() {
@Override
public Unit invoke(Boolean aBoolean, InputStream inputStream) {
File file = new File(mSavePath);
if (aBoolean && file.exists()) {
downloadFile = file;
if (save) {
startSave(downloadFile);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
WallpapersnapActivity activity = weakReference.get();
if (activity != null && !activity.isDestroyed()) {
Log.d(MysnapApp.TAG, "-------weakReference !=null");
// Glide.with(activity)
// .asDrawable()
// .load(downloadFile)
// .into(vb.imageviewPreview);
} else {
Log.d(MysnapApp.TAG, "-------weakReference null");
}
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
showDownloadLoading(false);
if (showMsg) {
Toast.makeText(WallpapersnapActivity.this, getString(R.string.download_fail), Toast.LENGTH_SHORT).show();
}
}
});
}
return null;
}
});
}
private void showDownloadLoading(boolean show) {
if (show) {
vb.pbDownload.setVisibility(View.VISIBLE);
vb.imageDownload.setVisibility(View.GONE);
} else {
vb.pbDownload.setVisibility(View.GONE);
vb.imageDownload.setVisibility(View.VISIBLE);
}
}
private void showSetWallpaperLoading(boolean show) {
Log.d(MysnapApp.TAG, "-----------showSetWallpaperLoading" + show);
if (show) {
vb.pbSet.setVisibility(View.VISIBLE);
vb.buttonSet.setVisibility(View.GONE);
} else {
vb.pbSet.setVisibility(View.GONE);
vb.buttonSet.setVisibility(View.VISIBLE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == permissionCode && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startSaveToAlbum();
}
}
private void startSave(File file) {
ObectBoxManagersnap.insertOrUpdateDownload(data);
Uri uri = JsonDatasnap.INSTANCE.saveToGallery(WallpapersnapActivity.this, file);
runOnUiThread(new Runnable() {
@Override
public void run() {
showDownloadLoading(false);
if (uri == null) {
Toast.makeText(WallpapersnapActivity.this, getString(R.string.save_fail), Toast.LENGTH_SHORT).show();
} else {
// deleteCacheFile();
Toast.makeText(WallpapersnapActivity.this, getString(R.string.save_success), Toast.LENGTH_LONG).show();
}
Log.d(MysnapApp.TAG, "--------path=" + file.getAbsolutePath() + "---uri=" + uri);
}
});
}
@Override
public void onSelectType(int type) {
showSetWallpaperLoading(true);
if (downloadFile != null && downloadFile.exists()) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d(MysnapApp.TAG, "--------downloadFile=" + downloadFile.exists());
setWallpaper(downloadFile, type);
}
}).start();
}
// else if (fullDrawable != null) {
// new Thread(new Runnable() {
// @Override
// public void run() {
// File file = new File(CommonHelper.saveDrawableToFile(fullDrawable, mSavePath));
// setWallpaper(file, type);
// }
// }).start();
// }
else {
call = JsonDatasnap.INSTANCE.downloadFile(fullUrl, mSavePath, new Function2<Boolean, InputStream, Unit>() {
@Override
public Unit invoke(Boolean aBoolean, InputStream inputStream) {
Log.d(MysnapApp.TAG, "--------downloadFile=" + Thread.currentThread().getName());
File file = new File(mSavePath);
if (aBoolean && file.exists()) {
downloadFile = file;
setWallpaper(downloadFile, type);
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
showSetWallpaperLoading(false);
Toast.makeText(WallpapersnapActivity.this, getString(R.string.set_fail), Toast.LENGTH_SHORT).show();
}
});
}
return null;
}
});
}
}
private void setWallpaper(File file, int type) {
try {
FileInputStream fileInputStream = new FileInputStream(file);
switch (type) {
case com.wall.snap.wallpaper.fragmentsnap.MyDialogsnap.type_home:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
wallpaperManager.setStream(fileInputStream);
} else {
wallpaperManager.setStream(
fileInputStream,
null,
true,
WallpaperManager.FLAG_SYSTEM
);
}
break;
case com.wall.snap.wallpaper.fragmentsnap.MyDialogsnap.type_lock:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
wallpaperManager.setStream(fileInputStream);
} else {
wallpaperManager.setStream(
fileInputStream,
null,
true,
WallpaperManager.FLAG_LOCK
);
}
break;
case com.wall.snap.wallpaper.fragmentsnap.MyDialogsnap.type_both:
wallpaperManager.setStream(fileInputStream);
break;
}
deleteCacheFile();
runOnUiThread(new Runnable() {
@Override
public void run() {
showSetWallpaperLoading(false);
Toast.makeText(WallpapersnapActivity.this, getString(R.string.set_success), Toast.LENGTH_SHORT).show();
}
});
} catch (Exception exception) {
runOnUiThread(new Runnable() {
@Override
public void run() {
showSetWallpaperLoading(false);
Toast.makeText(WallpapersnapActivity.this, getString(R.string.set_fail), Toast.LENGTH_SHORT).show();
}
});
}
}
private void deleteCacheFile() {
if (downloadFile != null && downloadFile.exists()) {
boolean delete = downloadFile.delete();
Log.d(MysnapApp.TAG, "--------delete=" + delete);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (call != null) {
call.cancel();
}
}
private void loadAd(){
AdsInsUtil.INSTANCE.loadAd(this, AdsInsUtil.Placement.TOP_ON_AD_THREE, new LoadListener() {
@Override
public void loadFailed(@NotNull String error) {
}
});
}
}

View File

@ -0,0 +1,81 @@
package com.wall.snap.wallpaper.ad
import android.app.Activity
import android.util.Log
import com.tradplus.ads.base.bean.TPAdError
import com.tradplus.ads.base.bean.TPAdInfo
import com.tradplus.ads.open.interstitial.InterstitialAdListener
import com.tradplus.ads.open.interstitial.TPInterstitial
class AdInstLoad {
private var mPlace: String
private var adLoadListener: LoadListener? = null
private var activity: Activity? = null
constructor(activity: Activity, place: String, listener: LoadListener?) {
this.mPlace = place
this.adLoadListener = listener
this.activity = activity
init()
}
constructor(place: String, listener: LoadListener?) {
this.mPlace = place
this.adLoadListener = listener
init()
}
private fun init() {
val tpInterstitial = TPInterstitial(activity, mPlace)
tpInterstitial.setAdListener(object : InterstitialAdListener {
//广告加载完成 首个广告源加载成功时回调 一次加载流程只会回调一次
override fun onAdLoaded(tpAdInfo: TPAdInfo?) {
if (tpAdInfo != null) {
Log.d("ocean", "$mPlace 广告load成功tpAdInfo有值")
InstAdCacheManager.Companion.instance.setAdCache(mPlace, tpInterstitial)
adLoadListener?.loaded(tpAdInfo)
} else {
adLoadListener?.loadFailed("tpAdInfo没有值")
Log.d("ocean", "$mPlace tpAdInfo没有值")
}
}
// 广告被点击
override fun onAdClicked(tpAdInfo: TPAdInfo?) {
Log.d("ocean", "$mPlace tradplus onAdClicked")
}
// 广告成功展示在页面上
override fun onAdImpression(tpAdInfo: TPAdInfo?) {
Log.d("ocean", "$mPlace tradplus onAdImpression")
}
// 广告加载失败
override fun onAdFailed(error: TPAdError?) {
adLoadListener?.loadFailed("code->${error?.errorCode}message->${error?.errorMsg}")
Log.d("ocean", "$mPlace load ad onError->code->${error?.errorCode}message->${error?.errorMsg}")
}
// 广告被关闭
override fun onAdClosed(tpAdInfo: TPAdInfo?) {
Log.d("ocean", "$mPlace tradplus onAdClosed")
}
// 视频播放开始(部分广告源支持)
override fun onAdVideoStart(tpAdInfo: TPAdInfo?) {
Log.d("ocean", "$mPlace tradplus onAdVideoStart")
}
//视频播放结束(部分广告源支持)
override fun onAdVideoEnd(tpAdInfo: TPAdInfo?) {
Log.d("ocean", "$mPlace tradplus onAdVideoEnd")
}
//视频播放失败(部分广告源支持)
override fun onAdVideoError(tpAdInfo: TPAdInfo?, error: TPAdError?) {
Log.d("ocean", "$mPlace onAdVideoError code->${error?.errorCode}message->${error?.errorMsg}")
}
})
tpInterstitial.loadAd()
}
}

View File

@ -0,0 +1,69 @@
package com.wall.snap.wallpaper.ad
import android.app.Activity
import android.util.Log
import com.tradplus.ads.base.bean.TPAdError
import com.tradplus.ads.base.bean.TPAdInfo
import com.tradplus.ads.open.interstitial.InterstitialAdListener
class AdInstShower {
private var mPlace: String
private var showListener: ShowListener? = null
private var activity: Activity? = null
constructor(activity: Activity, place: String, showListener: ShowListener?) {
this.mPlace = place
this.showListener = showListener
this.activity = activity
init()
}
constructor(place: String, showListener: ShowListener?) {
this.mPlace = place
this.showListener = showListener
init()
}
private fun init() {
val interstitialAd = InstAdCacheManager.Companion.instance.getAdCache(mPlace)
interstitialAd?.setAdListener(object : InterstitialAdListener {
//广告加载完成 首个广告源加载成功时回调 一次加载流程只会回调一次
override fun onAdLoaded(tpAdInfo: TPAdInfo?) {}
// 广告被点击
override fun onAdClicked(tpAdInfo: TPAdInfo?) {
showListener?.onAdClicked()
Log.d("ocean", "AdInstShower 广告点击回调")
}
// 广告成功展示在页面上
override fun onAdImpression(tpAdInfo: TPAdInfo?) {
showListener?.onAdShown(tpAdInfo)
Log.d("ocean", "AdInstShower 广告展示回调")
}
// 广告加载失败
override fun onAdFailed(error: TPAdError?) {}
// 广告被关闭
override fun onAdClosed(tpAdInfo: TPAdInfo?) {
showListener?.onAdClosed()
Log.d("ocean", "AdInstShower 广告关闭回调")
}
// 视频播放开始(部分广告源支持)
override fun onAdVideoStart(tpAdInfo: TPAdInfo?) {}
//视频播放结束(部分广告源支持)
override fun onAdVideoEnd(tpAdInfo: TPAdInfo?) {}
//视频播放失败(部分广告源支持)
override fun onAdVideoError(tpAdInfo: TPAdInfo?, error: TPAdError?) {
Log.d("ocean", "AdInstShower 视频广告播放失败回调->${error}")
showListener?.onAdShowFailed(AdShowFailed(error?.errorMsg.toString()))
}
})
interstitialAd?.showAd(activity!!, mPlace)
}
}

View File

@ -0,0 +1,5 @@
package com.wall.snap.wallpaper.ad
data class AdShowFailed(
val msg: String = "",
)

View File

@ -0,0 +1,28 @@
package com.wall.snap.wallpaper.ad
import android.app.Activity
object AdsInsUtil {
object Placement {
const val TOP_ON_AD_ONE = "944E9EED199812CB77C96BAA6AE7CE12"
const val TOP_ON_AD_TOW = "6BFA08B2637A1B2B9EBAF4BD45480512"
const val TOP_ON_AD_THREE = "C8B99C16E837C5D81A7B6CA5D9891412"
}
fun loadAd(
act: Activity,
adID: String,
loadListener: LoadListener?
): AdInstLoad {
return AdInstLoad(act, adID, loadListener)
}
fun showAd(
act: Activity,
adID: String,
listener: ShowListener?
): AdInstShower {
return AdInstShower(act, adID, listener)
}
}

View File

@ -0,0 +1,35 @@
package com.wall.snap.wallpaper.ad
import com.tradplus.ads.open.interstitial.TPInterstitial
class InstAdCacheManager {
private val mAdCacheDict: MutableMap<String, TPInterstitial> = mutableMapOf()
companion object {
val instance: InstAdCacheManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
InstAdCacheManager()
}
}
fun setAdCache(place: String, adCache: TPInterstitial) {
mAdCacheDict[place] = adCache
}
fun getAdCache(place: String): TPInterstitial? {
return mAdCacheDict[place]
}
fun getLoadedInstCount(): Int {
var count = 0
try {
mAdCacheDict.forEach { (key, value) ->
if (value.isReady) {
count += 1
}
}
} catch (_: Exception) {
}
return count
}
}

View File

@ -0,0 +1,8 @@
package com.wall.snap.wallpaper.ad
import com.tradplus.ads.base.bean.TPAdInfo
interface LoadListener {
fun loadFailed(error: String) {}
fun loaded(ad: TPAdInfo) {}
}

View File

@ -0,0 +1,10 @@
package com.wall.snap.wallpaper.ad
import com.tradplus.ads.base.bean.TPAdInfo
interface ShowListener {
fun onAdShown(ad: TPAdInfo?) {}
fun onAdShowFailed(error: AdShowFailed?) {}
fun onAdClosed() {}
fun onAdClicked() {}
}

View File

@ -0,0 +1,10 @@
package com.wall.snap.wallpaper.connectorsnap;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
public interface OnItemsnapClick {
void onItemClickAction(MysnapData info);
default void onClickMore(String name){}
}

View File

@ -0,0 +1,9 @@
package com.wall.snap.wallpaper.connectorsnap;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import java.util.List;
public interface OnLikesnapList {
void onLikeList(List<MysnapData> dataList);
}

View File

@ -0,0 +1,6 @@
package com.wall.snap.wallpaper.connectorsnap;
public interface OnSelectsnapType {
void onSelectType(int type);
}

View File

@ -0,0 +1,8 @@
package com.wall.snap.wallpaper.connectorsnap;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
public interface OnUpdatesnapLike {
void onAdd(MysnapData data);
void onRemove(MysnapData data);
}

View File

@ -0,0 +1,97 @@
package com.wall.snap.wallpaper.fragmentsnap;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.R;
import com.wall.snap.wallpaper.acctivitysnap.WallpapersnapActivity;
import com.wall.snap.wallpaper.databinding.FragmentLikesnapBinding;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap;
import com.wall.snap.wallpaper.toolsnap.ItemHelpersnap;
import java.util.List;
import io.objectbox.reactive.DataSubscription;
public class FragmentLikesnap extends Fragment implements com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick {
private FragmentLikesnapBinding vb;
private DataSubscription dataSubscription;
public FragmentLikesnap() {
}
public static com.wall.snap.wallpaper.fragmentsnap.FragmentLikesnap newInstance() {
com.wall.snap.wallpaper.fragmentsnap.FragmentLikesnap fragment = new com.wall.snap.wallpaper.fragmentsnap.FragmentLikesnap();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
vb = FragmentLikesnapBinding.inflate(getLayoutInflater());
vb.tvTitle.setText(getString(R.string.no_like_data));
initList();
return vb.getRoot();
}
private void initList() {
com.wall.snap.wallpaper.itemsnap.ItemsnapLike itemtwoLike = new com.wall.snap.wallpaper.itemsnap.ItemsnapLike(requireContext());
dataSubscription = ObectBoxManagersnap.setLikeDataListener(new com.wall.snap.wallpaper.connectorsnap.OnLikesnapList() {
@Override
public void onLikeList(List<MysnapData> dataList) {
Log.d(MysnapApp.TAG, "------size = " + dataList.size());
if(dataList.size()==0){
vb.layoutNoData.setVisibility(View.VISIBLE);
vb.listRecycler.setVisibility(View.GONE);
}else {
vb.layoutNoData.setVisibility(View.GONE);
vb.listRecycler.setVisibility(View.VISIBLE);
itemtwoLike.setDataInfo(dataList);
}
}
});
ItemHelpersnap itemHelpertwo = new ItemHelpersnap(10, 10, 15);
GridLayoutManager gridLayoutManager = new GridLayoutManager(requireContext(), 2);
vb.listRecycler.setLayoutManager(gridLayoutManager);
vb.listRecycler.addItemDecoration(itemHelpertwo);
itemtwoLike.setInfoWallpaperListener(this);
vb.listRecycler.setAdapter(itemtwoLike);
}
@Override
public void onItemClickAction(MysnapData info) {
Intent intent = new Intent(requireContext(), WallpapersnapActivity.class);
intent.putExtra(ComUtilssnap.key_info, info);
startActivity(intent);
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (dataSubscription != null) {
dataSubscription.cancel();
}
Log.d(MysnapApp.TAG,"------favoriteFragment-onDestroyView");
}
}

View File

@ -0,0 +1,84 @@
package com.wall.snap.wallpaper.fragmentsnap;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.acctivitysnap.ListsnapActivity;
import com.wall.snap.wallpaper.acctivitysnap.WallpapersnapActivity;
import com.wall.snap.wallpaper.databinding.FragmentMainsnapBinding;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import com.wall.snap.wallpaper.toolsnap.ItemHelpersnap;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.itemsnap.ItemsnapMain;
import java.util.ArrayList;
import java.util.List;
public class FragmentMainsnap extends Fragment implements com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick {
private FragmentMainsnapBinding vb;
public FragmentMainsnap() {
}
public static com.wall.snap.wallpaper.fragmentsnap.FragmentMainsnap newInstance(int type) {
Bundle bundle = new Bundle();
bundle.putInt(ComUtilssnap.key_index, type);
com.wall.snap.wallpaper.fragmentsnap.FragmentMainsnap fragment = new com.wall.snap.wallpaper.fragmentsnap.FragmentMainsnap();
fragment.setArguments(bundle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
vb = FragmentMainsnapBinding.inflate(getLayoutInflater());
initTabVp();
return vb.getRoot();
}
private void initTabVp() {
List<String> data = new ArrayList<>();
while (data.size() < 8) {
data = MysnapApp.getCategoryNames();
}
vb.loadingPb.setVisibility(View.GONE);
initList(data);
}
private void initList(List<String> data) {
ItemsnapMain adHomeParent = new ItemsnapMain();
adHomeParent.setData(data);
adHomeParent.setInfoWallpaperListener(this);
ItemHelpersnap itemHelpertwo = new ItemHelpersnap(10, 10, 0);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(requireContext());
// vb.classRecycler.addItemDecoration(itemSpace);
vb.classRecycler.setLayoutManager(linearLayoutManager);
vb.classRecycler.setAdapter(adHomeParent);
}
@Override
public void onItemClickAction(MysnapData info) {
Intent intent = new Intent(requireContext(), WallpapersnapActivity.class);
intent.putExtra(ComUtilssnap.key_info, info);
startActivity(intent);
}
@Override
public void onClickMore(String name) {
Intent intent = new Intent(requireContext(), ListsnapActivity.class);
intent.putExtra(ListsnapActivity.key_index, name);
startActivity(intent);
}
}

View File

@ -0,0 +1,89 @@
package com.wall.snap.wallpaper.fragmentsnap;
import android.app.Dialog;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.wall.snap.wallpaper.databinding.MyDialogsnapBinding;
import com.wall.snap.wallpaper.acctivitysnap.WallpapersnapActivity;
public class MyDialogsnap extends DialogFragment {
private MyDialogsnapBinding vb;
private com.wall.snap.wallpaper.connectorsnap.OnSelectsnapType listener;
public static final int type_home =0;
public static final int type_lock =1;
public static final int type_both =2;
public void setListener(WallpapersnapActivity listener) {
this.listener = listener;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
vb = MyDialogsnapBinding.inflate(getLayoutInflater());
init();
return vb.getRoot();
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.setCanceledOnTouchOutside(true);
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
}
private void init(){
vb.layoutHome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener!= null){
listener.onSelectType(type_home);
dismiss();
}
}
});
vb.layoutLock.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener!= null){
listener.onSelectType(type_lock);
dismiss();
}
}
});
vb.layoutBoth.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener!= null){
listener.onSelectType(type_both);
dismiss();
}
}
});
}
}

View File

@ -0,0 +1,139 @@
package com.wall.snap.wallpaper.itemsnap;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.MultiTransformation;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.R;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
public class ItemsnapLike extends RecyclerView.Adapter<com.wall.snap.wallpaper.itemsnap.ItemsnapLike.LikeVh> {
private List<MysnapData> dataInfo = new ArrayList<>();
private Context myContext;
private com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick onItemtwoClick;
public void setInfoWallpaperListener(com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick onItemtwoClick) {
this.onItemtwoClick = onItemtwoClick;
}
public ItemsnapLike(Context myCon) {
myContext = myCon;
}
public void setDataInfo(List<MysnapData> dataInfo) {
this.dataInfo = dataInfo;
notifyDataSetChanged();
}
@NonNull
@Override
public LikeVh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(myContext).inflate(R.layout.item_likesnap, parent, false);
return new LikeVh(itemView);
}
@Override
public void onBindViewHolder(@NonNull LikeVh holder, int position) {
MysnapData info = dataInfo.get(position);
ImageView imageView = holder.getImageView();
ImageView imFavorite = holder.getImFavorite();
String previewUrl400 = info.getPreviewUrl400();
String imId = info.getImId();
View spaceView = holder.getSpaceView();
if (position == dataInfo.size() - 1) {
spaceView.setVisibility(View.VISIBLE);
} else {
spaceView.setVisibility(View.GONE);
}
MultiTransformation<Bitmap> multiTransformation = new MultiTransformation<>(
new CenterCrop(),
new RoundedCornersTransformation(ComUtilssnap.dp2Px(12), 0) // 圆角效果
);
Glide.with(myContext)
.load(previewUrl400)
.placeholder(R.mipmap.im_placeholder)
.transform(multiTransformation)
.into(imageView);
imFavorite.setSelected(true);
imFavorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imFavorite.setSelected(false);
info.setLike(false);
ObectBoxManagersnap.updateLike(info);
int adapterPosition = holder.getAdapterPosition();
notifyItemRemoved(adapterPosition);
Log.d(MysnapApp.TAG, "----------notifyItemRemoved-adapterPosition=" + adapterPosition);
}
});
holder.getLayout().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemtwoClick != null) {
onItemtwoClick.onItemClickAction(info);
}
}
});
}
@Override
public int getItemCount() {
return dataInfo.size();
}
public class LikeVh extends RecyclerView.ViewHolder {
private ImageView imageView;
private RelativeLayout layout;
private ImageView imFavorite;
private View spaceView;
public LikeVh(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.wallpaper);
layout = itemView.findViewById(R.id.layout);
imFavorite = itemView.findViewById(R.id.image_favorite);
spaceView = itemView.findViewById(R.id.space_view);
}
public View getSpaceView() {
return spaceView;
}
public ImageView getImFavorite() {
return imFavorite;
}
public RelativeLayout getLayout() {
return layout;
}
public ImageView getImageView() {
return imageView;
}
}
}

View File

@ -0,0 +1,228 @@
package com.wall.snap.wallpaper.itemsnap;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.MultiTransformation;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
import com.wall.snap.wallpaper.R;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
public class ItemsnapList extends RecyclerView.Adapter<ItemsnapList.MyViewHolder> {
private List<MysnapData> dataInfo = new ArrayList<>();
private com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick onItemtwoClick;
private WeakReference<Context> weakReference;
private int itemHeight;
private boolean showSpace = false;
public void setInfoWallpaperListener(com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick onItemtwoClick) {
this.onItemtwoClick = onItemtwoClick;
}
public ItemsnapList(Context myCon, int itemHeight, boolean show) {
weakReference = new WeakReference<>(myCon);
this.itemHeight = itemHeight;
showSpace = show;
}
public void setDataInfo(List<MysnapData> dataInfo) {
this.dataInfo = dataInfo;
notifyDataSetChanged();
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = weakReference.get();
if (context != null) {
View itemView = LayoutInflater.from(context).inflate(R.layout.item_listsnap, parent, false);
ImageView imageView = itemView.findViewById(R.id.wallpaper);
ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
layoutParams.height = itemHeight;
imageView.setLayoutParams(layoutParams);
return new MyViewHolder(itemView);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
MysnapData info = dataInfo.get(position);
ImageView imageView = holder.getImageView();
String previewUrl400 = info.getPreviewUrl400();
String previewUrl200 = info.getPreviewUrl200();
RelativeLayout item = holder.getLayout();
String imId = info.getImId();
int curheight;
View spaceView = holder.getSpaceView();
if (showSpace && position == dataInfo.size() - 1) {
spaceView.setVisibility(View.VISIBLE);
} else {
spaceView.setVisibility(View.GONE);
}
MultiTransformation<Bitmap> multiTransformation = new MultiTransformation<>(
new CenterCrop(),
new RoundedCornersTransformation(ComUtilssnap.dp2Px(12), 0) // 圆角效果
);
RequestOptions options = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565);
Context context = weakReference.get();
if (context != null) {
Glide.with(context)
.asDrawable()
.skipMemoryCache(true)
.apply(options)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.load(previewUrl400)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
return false;
}
})
.placeholder(R.mipmap.im_placeholder)
.transform(multiTransformation)
.into(imageView);
}
item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemtwoClick != null) {
onItemtwoClick.onItemClickAction(info);
}
}
});
}
@Override
public int getItemCount() {
return dataInfo.size();
}
@Override
public void onViewRecycled(@NonNull MyViewHolder holder) {
super.onViewRecycled(holder);
}
private static DiffUtil.ItemCallback<MysnapData> diff = new DiffUtil.ItemCallback<MysnapData>() {
@Override
public boolean areItemsTheSame(@NonNull MysnapData oldItem, @NonNull MysnapData newItem) {
return oldItem.getImId().equals(newItem.getImId());
}
@Override
public boolean areContentsTheSame(@NonNull MysnapData oldItem, @NonNull MysnapData newItem) {
return oldItem.getImId().equals(newItem.getImId());
}
};
private static class MyCallback extends DiffUtil.Callback {
private List<MysnapData> mOldList;
private List<MysnapData> mNewList;
public MyCallback(List<MysnapData> oldList, List<MysnapData> newList) {
mOldList = oldList;
mNewList = newList;
}
@Override
public int getOldListSize() {
return mOldList.size();
}
@Override
public int getNewListSize() {
return mNewList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return mOldList.get(oldItemPosition).getImId().equals(mNewList.get(newItemPosition).getImId());
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return mOldList.get(oldItemPosition).getImId().equals(mNewList.get(newItemPosition).getImId());
}
}
static class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private RelativeLayout layout;
private View spaceView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.wallpaper);
layout = itemView.findViewById(R.id.layout);
spaceView = itemView.findViewById(R.id.space_view);
}
// public ImageView getImFavorite() {
// return imFavorite;
// }
public RelativeLayout getLayout() {
return layout;
}
public ImageView getImageView() {
return imageView;
}
public View getSpaceView() {
return spaceView;
}
}
}

View File

@ -0,0 +1,122 @@
package com.wall.snap.wallpaper.itemsnap;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.MultiTransformation;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.R;
import com.wall.snap.wallpaper.databinding.ItemMainsnapBinding;
import com.wall.snap.wallpaper.toolsnap.ComUtilssnap;
import com.wall.snap.wallpaper.toolsnap.ObectBoxManagersnap;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
public class ItemsnapMain extends RecyclerView.Adapter<ItemsnapMain.HomeParentHolder> {
private List<String> data = new ArrayList<>();
private Context mContext;
private com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick listener;
private MultiTransformation<Bitmap> multiTransformation = new MultiTransformation<>(
new CenterCrop(),
new RoundedCornersTransformation(ComUtilssnap.dp2Px(12), 0) // 圆角效果
);
public void setData(List<String> data) {
this.data = data;
notifyDataSetChanged();
}
public void setInfoWallpaperListener(com.wall.snap.wallpaper.connectorsnap.OnItemsnapClick onItemtwoClick) {
this.listener = onItemtwoClick;
}
@NonNull
@Override
public HomeParentHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mContext = parent.getContext();
ItemMainsnapBinding inflate = ItemMainsnapBinding.inflate(LayoutInflater.from(mContext), parent, false);
return new HomeParentHolder(inflate);
}
@Override
public void onBindViewHolder(@NonNull HomeParentHolder holder, int position) {
String name = data.get(position);
List<MysnapData> data1 = ObectBoxManagersnap.queryHome(name);
String previewUrl400 = data1.get(0).getPreviewUrl1080();
holder.itemBing.tvClassName.setText(name);
if(position == data.size()-1){
holder.itemBing.spaceView.setVisibility(View.VISIBLE);
}else {
holder.itemBing.spaceView.setVisibility(View.GONE);
}
Glide.with(mContext)
.asDrawable()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.load(previewUrl400)
// .centerCrop()
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
Log.d(MysnapApp.TAG, "------------e="+e.getMessage()+"---previewUrl400="+previewUrl400);
return false;
}
@Override
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
return false;
}
})
.placeholder(R.mipmap.im_placeholder)
// .transform(multiTransformation)
.into(holder.itemBing.preview);
// initChild(holder,data1);
holder.itemBing.preview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickMore(name);
}
});
}
@Override
public int getItemCount() {
return data.size();
}
static class HomeParentHolder extends RecyclerView.ViewHolder {
private ItemMainsnapBinding itemBing;
public HomeParentHolder(@NonNull ItemMainsnapBinding itemView) {
super(itemView.getRoot());
itemBing = itemView;
}
}
}

View File

@ -0,0 +1,159 @@
package com.wall.snap.wallpaper.mysnapbean;
import androidx.annotation.Nullable;
import java.io.Serializable;
import io.objectbox.annotation.Entity;
import io.objectbox.annotation.Id;
@Entity
public class MysnapData implements Serializable {
@Id
private long id;
private String categoryName;
private String imId;
private String description;
private String fullUrl;
private String previewUrl1080;
private String previewUrl400;
private String previewUrl200;
private String authorName;
private String authorHeader;
private String authorHtml;
private boolean isLike;
private boolean isDownload;
public boolean isLike() {
return isLike;
}
public void setLike(boolean like) {
isLike = like;
}
public boolean isDownload() {
return isDownload;
}
public void setDownload(boolean download) {
isDownload = download;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getImId() {
return imId;
}
public void setImId(String imId) {
this.imId = imId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getFullUrl() {
return fullUrl;
}
public void setFullUrl(String fullUrl) {
this.fullUrl = fullUrl;
}
public String getPreviewUrl1080() {
return previewUrl1080;
}
public void setPreviewUrl1080(String previewUrl1080) {
this.previewUrl1080 = previewUrl1080;
}
public String getPreviewUrl400() {
return previewUrl400;
}
public void setPreviewUrl400(String previewUrl400) {
this.previewUrl400 = previewUrl400;
}
public String getPreviewUrl200() {
return previewUrl200;
}
public void setPreviewUrl200(String previewUrl200) {
this.previewUrl200 = previewUrl200;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getAuthorHeader() {
return authorHeader;
}
public void setAuthorHeader(String authorHeader) {
this.authorHeader = authorHeader;
}
public String getAuthorHtml() {
return authorHtml;
}
public void setAuthorHtml(String authorHtml) {
this.authorHtml = authorHtml;
}
@Override
public boolean equals(@Nullable Object obj) {
MysnapData obj1 = (MysnapData) obj;
if (obj1 != null) {
if (obj1.getImId().equals(imId)) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,144 @@
package com.wall.snap.wallpaper.toolsnap;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Debug;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.wall.snap.wallpaper.MysnapApp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
public class ComUtilssnap {
public static final String key_info = "key_info";
public static final String key_index = "key_index";
public static String getCovertStr(InputStream stream) {
String covertStr = "";
try {
StringWriter writer = new StringWriter();
char[] buffer = new char[stream.available()];
Reader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
int a = 0;
while ((a = reader.read(buffer)) != -1) {
writer.write(buffer, 0, a);
}
covertStr = writer.toString();
} catch (IOException e) {
return covertStr;
}
return covertStr;
}
public static int dp2Px(int dp) {
float scale = MysnapApp.mAppContext.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
public static void initFull(Activity activity, boolean light) {
Window window = activity.getWindow();
View decorView = window.getDecorView();
View rootView = decorView.getRootView();
if (light) {
} else {
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
private static Bitmap getBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
// 创建一个空白的 Bitmap
Bitmap bitmap = Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
Bitmap.Config.ARGB_8888);
// Canvas 上绘制 Drawable
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
public static String saveDrawableToFile( Drawable drawable,String saveFilePath) {
// Drawable 转换为 Bitmap
Bitmap bitmap = getBitmap(drawable);
// 创建要保存的文件
File file = new File(saveFilePath);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
// Bitmap 写入文件 (使用 PNG 格式可改为 JPEG)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file.getAbsolutePath();
}
public static void printUsedMemory(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(new int[]{android.os.Process.myPid()});
for (Debug.MemoryInfo memoryInfo : memoryInfoArray) {
int totalPss = memoryInfo.getTotalPss();
int totalPrivateDirty = memoryInfo.getTotalPrivateDirty();
int totalSharedDirty = memoryInfo.getTotalSharedDirty();
Log.d("MemoryInfo", "Total PSS: " + totalPss + " KB");
Log.d("MemoryInfo", "Total Private Dirty: " + totalPrivateDirty + " KB");
Log.d("MemoryInfo", "Total Shared Dirty: " + totalSharedDirty + " KB");
}
}
public static int[] getScreenWidthHeight(Context context) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
return new int[]{width, height};
}
}

View File

@ -0,0 +1,56 @@
package com.wall.snap.wallpaper.toolsnap;
import android.graphics.Rect;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class ItemHelpersnap extends RecyclerView.ItemDecoration {
private int ex_space = 0;
private int v_space = 0;
private int h_space = 0;
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
int spanSize = 1;
int spanIndex = 0;
int spanCount = 1;
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
GridLayoutManager layoutManager1 = (GridLayoutManager) layoutManager;
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
spanCount = layoutManager1.getSpanCount();
spanSize = layoutManager1.getSpanSizeLookup().getSpanSize(position);
spanIndex = layoutParams.getSpanIndex();
}
if (spanSize == spanCount) {
outRect.left = v_space + ex_space;
outRect.right = v_space + ex_space;
outRect.bottom = h_space;
} else {
int itemAllSpacing = (v_space * (spanCount + 1) + ex_space * 2) / spanCount;
int left = v_space * (spanIndex + 1) - itemAllSpacing * spanIndex + ex_space;
int right = itemAllSpacing - left;
outRect.left = left;
outRect.right = right;
outRect.bottom = h_space;
}
}
public ItemHelpersnap(int v_space, int h_space, int ex_space) {
this.ex_space = ex_space;
this.h_space = h_space;
this.v_space = v_space;
}
}

View File

@ -0,0 +1,228 @@
package com.wall.snap.wallpaper.toolsnap
import android.Manifest
import android.app.Activity
import android.content.ContentValues
import android.content.Context
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.util.Log
import androidx.core.app.ActivityCompat
import com.wall.snap.wallpaper.MysnapApp
import com.wall.snap.wallpaper.mysnapbean.MysnapData
import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import org.json.JSONArray
import org.json.JSONObject
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
object JsonDatasnap {
fun getData(jsonStr: String, category: String): MutableList<MysnapData> {
val jsonArray = JSONArray(jsonStr)
var data = mutableListOf<MysnapData>()
var get: JSONObject
var text_description: String
var links: JSONObject
var download: String
var urls: JSONObject
var regular: String
var small: String
var thumb: String
var users: JSONObject
var name: String
var header_large: String
var user_html: String
val host = "https://unsplash.com/photos/"
var bean: MysnapData
var indexOf: Int
var substring: String
for (i in 0 until 300) {
get = jsonArray.getJSONObject(i)
text_description = get.getString("alt_description")
links = get.getJSONObject("links")
download = links.getString("download")
// val downloadLocation = links.getString("download_location")
// val html = links.getString("html")
urls = get.getJSONObject("urls")
// val full = urls.getString("full")
// val raw = urls.getString("raw")
regular = urls.getString("regular")
small = urls.getString("small")
thumb = urls.getString("thumb")
users = get.getJSONObject("user")
// val portfolio_url = users.getString("portfolio_url")
name = users.getString("name")
header_large = users.getString("header_large")
// val header_medium = users.getString("header_medium")
// val header_small = users.getString("header_small")
user_html = users.getString("authorHtml")
indexOf = download.indexOf("/download")
substring = download.substring(host.length, indexOf)
// Log.d(MysnapApp.TAG, "i=$i----------substring=$substring")
bean = MysnapData().apply {
imId = substring
categoryName = category
description = text_description
fullUrl = download
previewUrl1080 = regular
previewUrl400 = small
previewUrl200 = thumb
authorName = name
authorHeader = header_large
authorHtml = user_html
}
data.add(bean)
}
return data
}
fun downloadFile(
url: String,
savePath: String,
result: (Boolean, input: InputStream?) -> Unit
): Call {
var client = OkHttpClient()
var request = Request.Builder().url(url).build()
var call = client.newCall(request)
call.enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
result.invoke(false, null)
}
override fun onResponse(call: Call, response: Response) {
response.body?.run {
val byteStream = byteStream()
val writeFile = writeFile(byteStream, savePath)
result.invoke(writeFile, byteStream)
} ?: run {
result.invoke(false, null)
}
}
})
return call
}
fun writeFile(input: InputStream, filePath: String): Boolean {
try {
val byte = ByteArray(4096)
val output = ByteArrayOutputStream()
var l: Int
while (input.read(byte).also { l = it } != -1) {
output.write(byte, 0, l)
}
val fileDe = File(filePath)
if (!fileDe.exists()) {
fileDe.createNewFile()
}
val fileOutputStream = FileOutputStream(filePath)
fileOutputStream.write(output.toByteArray())
output.close()
fileOutputStream.close()
return true
} catch (ex: Exception) {
Log.d("-----------", "---------ex=" + ex.message)
return false
}
}
fun saveToGallery(context: Context, photoFile: File): Uri? {
val displayName = "${System.currentTimeMillis()}.jpg"
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, displayName)
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
put(MediaStore.Images.Media.IS_PENDING, 1)
}
}
val contentResolver = context.contentResolver
val collectionUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else {
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}
val imageUri = contentResolver.insert(collectionUri, contentValues)
imageUri?.let { uri ->
try {
contentResolver.openOutputStream(uri)?.use { outputStream ->
val inputStream = FileInputStream(photoFile)
inputStream.copyTo(outputStream)
inputStream.close()
outputStream.close()
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
contentValues.clear()
contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver.update(uri, contentValues, null, null)
} else {
}
return uri
} catch (e: IOException) {
Log.d(MysnapApp.TAG, "-----------------e=${e.printStackTrace()}")
return null
}
} ?: run {
Log.d(MysnapApp.TAG, "----------------false")
return null
}
}
fun requestPermission(context: Activity, requestCode: Int): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return true
}
return if (context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
context,
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
requestCode
)
false
} else {
true
}
}
fun getSaveFilePath(context: Context, imId: String): String {
return "${context.cacheDir}/${imId}.jpg"
}
}

View File

@ -0,0 +1,34 @@
package com.wall.snap.wallpaper.toolsnap;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.R;
public class MyTextsnap extends androidx.appcompat.widget.AppCompatTextView {
public MyTextsnap(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initAttrs(context,attrs);
}
private void initAttrs(Context context, AttributeSet attrs){
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomeTv);
boolean aBoolean = typedArray.getBoolean(R.styleable.CustomeTv_apply_font,false);
if(aBoolean){
setTypeface(MysnapApp.defaultFont);
}
typedArray.recycle();
}
}

View File

@ -0,0 +1,157 @@
package com.wall.snap.wallpaper.toolsnap;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import com.wall.snap.wallpaper.MysnapApp;
import com.wall.snap.wallpaper.mysnapbean.MysnapData;
import com.wall.snap.wallpaper.mysnapbean.MysnapData_;
import com.wall.snap.wallpaper.mysnapbean.MyObjectBox;
import java.util.ArrayList;
import java.util.List;
import io.objectbox.Box;
import io.objectbox.BoxStore;
import io.objectbox.android.AndroidScheduler;
import io.objectbox.query.Query;
import io.objectbox.query.QueryBuilder;
import io.objectbox.reactive.DataObserver;
import io.objectbox.reactive.DataSubscription;
import io.objectbox.reactive.DataSubscriptionList;
public class ObectBoxManagersnap {
private static BoxStore boxStore;
private static Box<MysnapData> LikeBox;
private static List<com.wall.snap.wallpaper.connectorsnap.OnUpdatesnapLike> list = new ArrayList<>();
public static void init(Context context) {
boxStore = MyObjectBox.builder().androidContext(context).build();
}
public static Box<MysnapData> getObjectBoxLike() {
if (LikeBox == null) {
LikeBox = boxStore.boxFor(MysnapData.class);
}
return LikeBox;
}
public static void addData(MysnapData data) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
String imId = data.getImId();
MysnapData first = objectBoxLike.query()
.equal(MysnapData_.imId, imId, QueryBuilder.StringOrder.CASE_SENSITIVE)
.build()
.findFirst();
if (first == null) {
Log.d(MysnapApp.TAG, "-----------addData " + imId);
objectBoxLike.put(data);
}else {
Log.d(MysnapApp.TAG, "-----------忽略添加 ");
}
}
public static DataSubscription setLikeDataListener(com.wall.snap.wallpaper.connectorsnap.OnLikesnapList listener) {
Query<MysnapData> build = getObjectBoxLike().query()
.equal(MysnapData_.isLike, true)
.build();
return build.subscribe(new DataSubscriptionList())
.on(AndroidScheduler.mainThread())
.observer(new DataObserver<List<MysnapData>>() {
@Override
public void onData(@NonNull List<MysnapData> data) {
Log.d(MysnapApp.TAG, "------data=" + data.size());
listener.onLikeList(data);
}
});
}
public static void updateLike(MysnapData boxLike) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
String imId = boxLike.getImId();
objectBoxLike.put(boxLike);
for (com.wall.snap.wallpaper.connectorsnap.OnUpdatesnapLike listener : list) {
listener.onAdd(boxLike);
}
}
public static void insertOrUpdateDownload(MysnapData boxLike) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
String imId = boxLike.getImId();
MysnapData first = objectBoxLike.query()
.equal(MysnapData_.imId, imId, QueryBuilder.StringOrder.CASE_SENSITIVE)
.build()
.findFirst();
if (first == null) {
Log.d(MysnapApp.TAG, "-----------添加11 Download=" + imId);
boxLike.setDownload(true);
objectBoxLike.put(boxLike);
} else {
first.setDownload(true);
objectBoxLike.put(first);
Log.d(MysnapApp.TAG, "-----------已经存在添加22 Download=" + imId);
}
}
public static List<MysnapData> search(String name) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
List<MysnapData> data = objectBoxLike.query()
.contains(MysnapData_.description, name, QueryBuilder.StringOrder.CASE_SENSITIVE)
.build()
.find();
return data;
}
public static List<MysnapData> queryHome(String name) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
List<MysnapData> data = objectBoxLike.query()
.equal(MysnapData_.categoryName, name, QueryBuilder.StringOrder.CASE_SENSITIVE)
.build()
.find(10, 1);
return data;
}
public static List<MysnapData> queryCategoryAll(String name) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
List<MysnapData> data = objectBoxLike.query()
.equal(MysnapData_.categoryName, name, QueryBuilder.StringOrder.CASE_SENSITIVE)
.build()
.find(0, 200);
return data;
}
public static boolean queryIsLike(String imId) {
Box<MysnapData> objectBoxLike = getObjectBoxLike();
MysnapData first = objectBoxLike.query()
.equal(MysnapData_.imId, imId, QueryBuilder.StringOrder.CASE_SENSITIVE)
.build()
.findFirst();
if (first != null && first.isLike()) {
return true;
} else {
return false;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M947.4,864C893.2,697.7 736.2,578.9 551,575.5c-23.1,-0.4 -44.9,0.1 -65.6,1.5v164.3c0.1,0.5 0.2,1 0.2,1.5 0,4 -3.3,7.3 -7.3,7.3 -2.7,0 -5,-1.4 -6.2,-3.5v0.7L68.8,465.4h2.1c-4,0 -7.3,-3.3 -7.3,-7.3 0,-2.9 1.7,-5.4 4.1,-6.6L472,169v0.7c1.3,-2.1 3.6,-3.5 6.2,-3.5 4,0 7.3,3.3 7.3,7.3 0,0.5 -0.1,1 -0.2,1.5v159.4c18.5,-0.9 37.9,-1.2 58.3,-0.8 230.1,3.9 416.7,196.9 416.7,427.1 0.1,35.5 -4.5,70.2 -12.9,103.3zM485.4,159.6v0.2h-0.4l0.4,-0.2zM485.4,756.5l-0.3,-0.2h0.3v0.2z"
android:fillColor="@color/black"/>
</vector>

View File

@ -0,0 +1,4 @@
<gradient xmlns:android="http://schemas.android.com/apk/res/android"
android:startColor="#2B73AF"
android:endColor="#2EC9D9"
android:angle="45" />

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M747.2,283.2L54.5,283.2v692.7h692.7v-692.7zM656.8,373.6v512h-512v-512h512z"
android:fillColor="@color/white"/>
<path
android:pathData="M993.3,12.4v692.7h-287.2v-90.4h196.8v-512h-512v224.4h-90.4V12.4z"
android:fillColor="@color/white"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="@color/white"
android:pathData="M776.7,1010.1h-479.9c-28.3,0 -51.3,-23 -51.3,-51.3v-891.1c0,-28.3 23,-51.3 51.3,-51.3h479.9c28.3,0 51.3,23 51.3,51.3v891.1c0,28.3 -23,51.3 -51.3,51.3v0zM536.6,958.8c19.1,0 34.2,-15.4 34.2,-34.2s-15.4,-34.2 -34.2,-34.2 -34.2,15.4 -34.2,34.2 15.4,34.2 34.2,34.2v0zM776.7,119h-479.9v719.7h479.6v-719.7h0.3z"/>
</vector>

View File

@ -0,0 +1,19 @@
<!--<vector xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- android:width="64dp"-->
<!-- android:height="64dp"-->
<!-- android:viewportWidth="1024"-->
<!-- android:viewportHeight="1024">-->
<!-- <path-->
<!-- android:pathData="M878.6,337.2a57.8,57.8 0,0 0,-81.7 0L574.6,559.5V173a57.8,57.8 0,0 0,-115.6 0v386.5L236.8,337.2a57.8,57.8 0,0 0,-81.7 0,57.8 57.8,0 0,0 0,81.8l318.7,318.7a57.6,57.6 0,0 0,40.9 16.9c0.7,0 1.5,-0.1 2.2,-0.1 0.7,0 1.5,0.1 2.2,0.1a57.6,57.6 0,0 0,40.9 -16.9L878.6,419a57.8,57.8 0,0 0,0 -81.8zM861,908.4H165.4a57.8,57.8 0,0 1,0 -115.6h695.6a57.8,57.8 0,0 1,0 115.6z"-->
<!-- android:fillColor="@color/white"/>-->
<!--</vector>-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M85.3,691.2V640a42.7,42.7 0,1 1,85.3 0v51.2c0,36.5 0,61.4 1.6,80.6 1.5,18.7 4.3,28.3 7.7,34.9a85.4,85.4 0,0 0,37.3 37.3c6.7,3.4 16.2,6.2 34.9,7.7 19.2,1.6 44.1,1.6 80.6,1.6h358.4c36.5,0 61.4,-0 80.6,-1.6 18.7,-1.5 28.3,-4.3 34.9,-7.7a85.4,85.4 0,0 0,37.3 -37.3c3.4,-6.7 6.2,-16.2 7.7,-34.9 1.6,-19.2 1.6,-44.1 1.6,-80.6V640a42.7,42.7 0,1 1,85.3 0v51.2c0,35.1 0,64.1 -1.9,87.6 -2,24 -6.1,46 -16.7,66.7a170.7,170.7 0,0 1,-74.6 74.6c-20.7,10.6 -42.8,14.7 -66.7,16.7 -23.5,1.9 -52.4,1.9 -87.6,1.9H332.8c-35.1,0 -64.1,0 -87.6,-1.9 -24,-2 -46,-6.1 -66.7,-16.7a170.7,170.7 0,0 1,-74.6 -74.6c-10.5,-20.7 -14.7,-42.8 -16.7,-66.7C85.3,755.3 85.3,726.3 85.3,691.2zM469.3,128a42.7,42.7 0,1 1,85.3 0v409l140.5,-140.5a42.7,42.7 0,1 1,60.3 60.3l-213.3,213.3a42.7,42.7 0,0 1,-60.3 0l-213.3,-213.3a42.7,42.7 0,1 1,60.3 -60.3L469.3,537V128z"
android:fillColor="@color/white"
android:fillAlpha="0.88"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M667.8,117.3C832.9,117.3 938.7,249.7 938.7,427.9c0,138.3 -125.1,290.5 -371.6,461.6a96.8,96.8 0,0 1,-110.2 0C210.4,718.4 85.3,566.1 85.3,427.9 85.3,249.7 191.1,117.3 356.2,117.3c59.6,0 100.1,20.8 155.8,68.1C567.7,138.2 608.2,117.3 667.8,117.3z"
android:fillColor="#3876F2"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--<vector xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- android:width="32dp"-->
<!-- android:height="32dp"-->
<!-- android:viewportWidth="1024"-->
<!-- android:viewportHeight="1024">-->
<!-- &lt;!&ndash; 图形整体向上移动 56 单位,再上下留 112 空白 &ndash;&gt;-->
<!-- <group android:translateY="56">-->
<!-- <path-->
<!-- android:pathData="M555.5,118l312.9,224.6A117.3,117.3 0,0 1,917.3 437.9V800c0,64.8 -52.5,117.3 -117.3,117.3H640V746.7c0,-70.7 -57.3,-128 -128,-128s-128,57.3 -128,128v170.7H224c-64.8,0 -117.3,-52.5 -117.3,-117.3V437.9a117.3,117.3 0,0 1,48.9 -95.3l312.9,-224.6a74.7,74.7 0,0 1,87.1 0z"-->
<!-- android:fillColor="#4A6B9C"/>-->
<!-- </group>-->
<!--</vector>-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M511,511m-429,0a429,429 0,1 0,858 0,429 429,0 1,0 -858,0Z"
android:fillColor="#3876F2"/>
<path
android:pathData="M832.7,443.1l-290,-207.4c-18,-12.9 -43.6,-12.9 -61.3,0l-290,207.4c-12,8.8 -15,26.1 -6.5,38.7 10.5,11 29.1,12.7 41.2,3.8L494.8,289a28.9,28.9 0,0 1,34.3 0l273,199.6c12,8.8 28.6,5.7 37,-6.8 8.4,-12.6 5.5,-29.9 -6.6,-38.7z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M528.7,341a28.6,28.6 0,0 0,-33.3 0L262.3,508.3h-0.1v226.6a45.1,45.1 0,0 0,45.1 45.1h124.2V666.4a36.2,36.2 0,0 1,36.2 -36.2h88.6a36.2,36.2 0,0 1,36.2 36.2v113.5h124.2a45.1,45.1 0,0 0,45.1 -45.1V508.3h-0.1z"
android:fillColor="#FFFFFF"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--<vector xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- android:width="32dp"-->
<!-- android:height="32dp"-->
<!-- android:viewportWidth="1024"-->
<!-- android:viewportHeight="1024">-->
<!-- &lt;!&ndash; 图形整体向上移动 56 单位,再上下留 112 空白 &ndash;&gt;-->
<!-- <group android:translateY="56">-->
<!-- <path-->
<!-- android:pathData="M555.5,118l312.9,224.6A117.3,117.3 0,0 1,917.3 437.9V800c0,64.8 -52.5,117.3 -117.3,117.3H640V746.7c0,-70.7 -57.3,-128 -128,-128s-128,57.3 -128,128v170.7H224c-64.8,0 -117.3,-52.5 -117.3,-117.3V437.9a117.3,117.3 0,0 1,48.9 -95.3l312.9,-224.6a74.7,74.7 0,0 1,87.1 0z"-->
<!-- android:fillColor="#605D66"/>-->
<!-- </group>-->
<!--</vector>-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M511,511m-429,0a429,429 0,1 0,858 0,429 429,0 1,0 -858,0Z"
android:fillColor="#F5F5F5"/>
<path
android:pathData="M832.7,443.1l-290,-207.4c-18,-12.9 -43.6,-12.9 -61.3,0l-290,207.4c-12,8.8 -15,26.1 -6.5,38.7 10.5,11 29.1,12.7 41.2,3.8L494.8,289a28.9,28.9 0,0 1,34.3 0l273,199.6c12,8.8 28.6,5.7 37,-6.8 8.4,-12.6 5.5,-29.9 -6.6,-38.7z"
android:fillColor="@color/sub_color"/>
<path
android:pathData="M528.7,341a28.6,28.6 0,0 0,-33.3 0L262.3,508.3h-0.1v226.6a45.1,45.1 0,0 0,45.1 45.1h124.2V666.4a36.2,36.2 0,0 1,36.2 -36.2h88.6a36.2,36.2 0,0 1,36.2 36.2v113.5h124.2a45.1,45.1 0,0 0,45.1 -45.1V508.3h-0.1z"
android:fillColor="@color/sub_color"/>
</vector>

View File

@ -0,0 +1,24 @@
<!--<vector xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- android:width="32dp"-->
<!-- android:height="32dp"-->
<!-- android:viewportWidth="1024"-->
<!-- android:viewportHeight="1024">-->
<!-- &lt;!&ndash; 图形整体向上移动 56 单位,再上下留 112 空白 &ndash;&gt;-->
<!-- <group android:translateY="56">-->
<!-- <path-->
<!-- android:pathData="M667.8,117.3C832.9,117.3 938.7,249.7 938.7,427.9c0,138.3 -125.1,290.5 -371.6,461.6a96.8,96.8 0,0 1,-110.2 0C210.4,718.4 85.3,566.1 85.3,427.9 85.3,249.7 191.1,117.3 356.2,117.3c59.6,0 100.1,20.8 155.8,68.1C567.7,138.2 608.2,117.3 667.8,117.3z"-->
<!-- android:fillColor="@color/color_FEA7F5"/>-->
<!-- </group>-->
<!--</vector>-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M513,512m-429,0a429,429 0,1 0,858 0,429 429,0 1,0 -858,0Z"
android:fillColor="#3876F2"/>
<path
android:pathData="M813,439a178.3,178.3 0,0 0,-14.9 -67.7,176 176,0 0,0 -41.4,-58.5C724,282 681.1,266.2 635.7,268.4c-44.5,2.2 -86.5,21.2 -118.2,53.7l-6.1,6.2 -5.6,-6.3c-65.8,-67.5 -170.8,-71.7 -238.9,-9.5l-0.2,0.2a175.8,175.8 0,0 0,-41.4 58.6,178.4 178.4,0 0,0 -14.9,67.7c-0.5,23.4 1.7,48.9 9.9,70.6 8.6,22.5 13.4,35.7 35.6,62.4 59.7,72.7 111.7,121.1 182.3,180.8 23.5,20.4 49.3,30.7 74.3,30.8 28.4,0.2 46,-3.4 75.1,-22.7 60.7,-46.7 108.3,-98.6 176.3,-189.8 21.8,-29.4 28.7,-41.7 37.3,-64.2A178.6,178.6 0,0 0,813 439zM726.4,458.1a26.6,26.6 0,0 1,-4.8 0.4A27,27 0,0 1,695 436.3a91.8,91.8 0,0 0,-4.6 -17l-0.7,-1.6a38.2,38.2 0,0 0,-7.7 -14.3c-6.3,-7.4 -15.5,-12.4 -27.4,-14.8a94.3,94.3 0,0 0,-16.7 -1.8,27 27,0 0,1 -26.1,-22.7 25.4,25.4 0,0 1,-0.3 -4.8,27 27,0 0,1 27.6,-26.4c48,1 73.9,22 87.1,39.4A94,94 0,0 1,740.7 400a141.5,141.5 0,0 1,7.3 26.8,27 27,0 0,1 -21.7,31.3z"
android:fillColor="#FFFFFF"/>
</vector>

View File

@ -0,0 +1,24 @@
<!--<vector xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- android:width="32dp"-->
<!-- android:height="32dp"-->
<!-- android:viewportWidth="1024"-->
<!-- android:viewportHeight="1024">-->
<!-- &lt;!&ndash; 图形整体向上移动 56 单位,再上下留 112 空白 &ndash;&gt;-->
<!-- <group android:translateY="56">-->
<!-- <path-->
<!-- android:pathData="M667.8,117.3C832.9,117.3 938.7,249.7 938.7,427.9c0,138.3 -125.1,290.5 -371.6,461.6a96.8,96.8 0,0 1,-110.2 0C210.4,718.4 85.3,566.1 85.3,427.9 85.3,249.7 191.1,117.3 356.2,117.3c59.6,0 100.1,20.8 155.8,68.1C567.7,138.2 608.2,117.3 667.8,117.3z"-->
<!-- android:fillColor="@color/sub_color"/>-->
<!-- </group>-->
<!--</vector>-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M513,512m-429,0a429,429 0,1 0,858 0,429 429,0 1,0 -858,0Z"
android:fillColor="#F5F5F5"/>
<path
android:pathData="M813,439a178.3,178.3 0,0 0,-14.9 -67.7,176 176,0 0,0 -41.4,-58.5C724,282 681.1,266.2 635.7,268.4c-44.5,2.2 -86.5,21.2 -118.2,53.7l-6.1,6.2 -5.6,-6.3c-65.8,-67.5 -170.8,-71.7 -238.9,-9.5l-0.2,0.2a175.8,175.8 0,0 0,-41.4 58.6,178.4 178.4,0 0,0 -14.9,67.7c-0.5,23.4 1.7,48.9 9.9,70.6 8.6,22.5 13.4,35.7 35.6,62.4 59.7,72.7 111.7,121.1 182.3,180.8 23.5,20.4 49.3,30.7 74.3,30.8 28.4,0.2 46,-3.4 75.1,-22.7 60.7,-46.7 108.3,-98.6 176.3,-189.8 21.8,-29.4 28.7,-41.7 37.3,-64.2A178.6,178.6 0,0 0,813 439zM726.4,458.1a26.6,26.6 0,0 1,-4.8 0.4A27,27 0,0 1,695 436.3a91.8,91.8 0,0 0,-4.6 -17l-0.7,-1.6a38.2,38.2 0,0 0,-7.7 -14.3c-6.3,-7.4 -15.5,-12.4 -27.4,-14.8a94.3,94.3 0,0 0,-16.7 -1.8,27 27,0 0,1 -26.1,-22.7 25.4,25.4 0,0 1,-0.3 -4.8,27 27,0 0,1 27.6,-26.4c48,1 73.9,22 87.1,39.4A94,94 0,0 1,740.7 400a141.5,141.5 0,0 1,7.3 26.8,27 27,0 0,1 -21.7,31.3z"
android:fillColor="@color/sub_color"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M667.8,117.3C832.9,117.3 938.7,249.7 938.7,427.9c0,138.3 -125.1,290.5 -371.6,461.6a96.8,96.8 0,0 1,-110.2 0C210.4,718.4 85.3,566.1 85.3,427.9 85.3,249.7 191.1,117.3 356.2,117.3c59.6,0 100.1,20.8 155.8,68.1C567.7,138.2 608.2,117.3 667.8,117.3zM667.8,180.5c-41.4,0 -70.3,15.2 -117,55 -2.2,1.8 -14.4,12.4 -17.9,15.4a32.3,32.3 0,0 1,-41.8 0c-3.5,-3 -15.8,-13.5 -17.9,-15.4 -46.7,-39.9 -75.5,-55 -117,-55C230.2,180.5 149.3,281.3 149.3,426.7 149.3,537.6 262.9,675.2 493.6,834.8a32.4,32.4 0,0 0,36.7 0C761.1,675.3 874.7,537.6 874.7,426.7c0,-145.4 -80.9,-246.2 -206.9,-246.2z"
android:fillColor="@color/white"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="@color/white"
android:pathData="M426.9,683l170.8,0c25.6,0 42.7,-17.1 42.7,-42.7L640.3,512.3c0,-25.6 -17.1,-42.7 -42.7,-42.7l0,-42.7c0,-47 -38.4,-85.4 -85.4,-85.4s-85.4,38.4 -85.4,85.4l0,42.7c-25.6,0 -42.7,17.1 -42.7,42.7l0,128.1C384.2,666 401.3,683 426.9,683zM461,426.9c0,-29.9 21.3,-51.2 51.2,-51.2s51.2,21.3 51.2,51.2l0,42.7 -102.5,0L461,426.9 461,426.9zM725.7,42.7 L298.8,42.7c-47,0 -85.4,38.4 -85.4,85.4l0,768.4c0,47 38.4,85.4 85.4,85.4l426.9,0c47,0 85.4,-38.4 85.4,-85.4L811.1,128.1C811.1,81.1 772.7,42.7 725.7,42.7zM725.7,811.1 L298.8,811.1 298.8,213.4l426.9,0L725.7,811.1z"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M271.9,728.1v-412.2c0,-30.7 18.9,-53.8 39.9,-53.8h412.2c21,0 39.9,23.6 39.9,54.3v220.2c0,2 0.5,4.1 1,5.6l14.8,-5.6v-220.2c0,-38.9 -25.1,-70.1 -56.3,-70.1h-412.2c-31.2,0 -56.3,31.2 -56.3,70.1v418.3l16.9,-6.7zM271.9,728.1v-412.2c0,-30.7 18.9,-53.8 39.9,-53.8h412.2c21,0 39.9,23.6 39.9,54.3v220.2c0,2 0.5,4.1 1,5.6l14.8,-5.6v-220.2c0,-38.9 -25.1,-70.1 -56.3,-70.1h-412.2c-31.2,0 -56.3,31.2 -56.3,70.1v418.3l16.9,-6.7zM958.5,800.8c-21.5,-16.9 -45.6,-29.7 -71.7,-38.4 -4.1,-1 -8.7,1.5 -9.7,5.6 -1,4.1 1,8.2 4.6,9.7 24.1,8.2 46.6,20.5 67.1,35.8 3.6,2.6 8.7,1.5 11.3,-2 2,-3.1 1.5,-7.7 -1.5,-10.8zM517.6,817.2c-37.9,0 -75.3,10.2 -108,30.2 -45.6,-61.4 -117.2,-97.3 -194,-97.3 -54.3,0 -107.5,18.4 -150,52.2 -3.1,3.1 -3.6,8.2 -0.5,11.3 2.6,3.1 7.2,3.6 10.2,1 39.9,-31.7 89.1,-48.6 140.3,-48.6 74.8,0 143.4,36.4 185.3,96.8 2.6,3.6 7.2,4.6 11.3,2 31.2,-21 68.1,-31.7 105.5,-31.7 35.8,0 69.6,9.7 99.8,27.6 3.6,2 8.2,1 10.8,-2 13.3,-17.9 29.2,-34.3 47.1,-47.6 3.6,-3.1 4.1,-8.2 1,-11.3 -2.6,-3.1 -7.2,-3.6 -10.8,-1.5 -17.4,12.8 -32.8,28.2 -46.1,45.1 -31.7,-16.9 -66.6,-26.1 -101.9,-26.1zM855.6,846.8c-41,-27.6 -96.3,-16.9 -123.9,23.6l-3.1,4.6c-2,3.6 -1,8.7 3.1,11.3 3.6,2 8.7,1 11.3,-3.1 8.2,-14.3 21.5,-25.1 36.9,-31.2 22.5,-8.7 47.6,-5.6 67.6,7.7 3.6,2.6 8.7,1.5 11.3,-2 1.5,-3.1 0.5,-8.2 -3.1,-10.8zM185.3,248.8c2,1.5 2,4.6 0.5,6.1m-45.1,205.3l-18.9,21c-1,1 -2.6,1 -3.6,0 -1,-1 -1,-2.6 0,-3.6l18.9,-21c1,-1 2.6,-1 3.6,0 1,1 1,2.6 0,3.6zM165.4,460.3l-18.9,21c-1,1 -2.6,1 -3.6,0 -1,-1 -1,-2.6 0,-3.6l18.9,-21c1,-1 2.6,-1 3.6,0 0.5,1 1,2.6 0,3.6zM813.1,146.4l-38.4,43c-2,2.6 -6.1,2.6 -8.2,0.5 -2.6,-2 -2.6,-6.1 -0.5,-8.2l38.4,-43c2,-2.6 6.1,-2.6 8.2,-0.5 2.6,2 2.6,5.6 0.5,8.2zM863.7,146.4l-38.4,43c-2,2.6 -6.1,2.6 -8.2,0.5 -2.6,-2 -2.6,-6.1 -0.5,-8.2l38.4,-43c2,-2.6 6.1,-2.6 8.2,-0.5 2.6,2 3.1,5.6 0.5,8.2z"
android:fillColor="@color/sub_title_color"/>
<path
android:pathData="M390.1,451.6c-17.9,0.5 -32.8,-13.8 -33.3,-31.2 -0.5,-17.9 13.8,-32.8 31.2,-33.3h1.5c17.9,0.5 31.7,15.4 31.2,33.3 0.5,16.9 -13.3,30.7 -30.7,31.2zM382.5,419.3c6.1,0 10.8,-4.6 10.8,-10.8 0,-6.1 -4.6,-10.8 -10.8,-10.8 -6.1,0 -10.8,4.6 -10.8,10.8 0,6.1 4.6,10.8 10.8,10.8zM656.4,451.6c-17.9,0.5 -32.8,-13.8 -33.3,-31.2 -0.5,-17.9 13.8,-32.8 31.2,-33.3h1.5c17.9,0.5 31.7,15.4 31.2,33.3 0.5,16.9 -13.3,30.7 -30.7,31.2zM648.2,419.3c6.1,0 10.8,-4.6 10.8,-10.8 0,-6.1 -4.6,-10.8 -10.8,-10.8s-10.8,4.6 -10.8,10.8c0,6.1 5.1,10.8 10.8,10.8zM596,515.1c-2,0 -4.1,-1 -5.6,-2.6 -11.8,-12.3 -23.6,-17.9 -35.3,-17.4 -11.3,0.5 -21,7.7 -26.1,14.3 -2.6,3.6 -7.7,4.1 -11.3,1.5 -0.5,-0.5 -1,-0.5 -1,-1 -14.3,-16.4 -26.6,-15.9 -36.4,-13.8 -8.2,2 -16.4,6.7 -24.6,14.3 -3.1,3.1 -8.2,2.6 -11.3,-0.5 -3.1,-3.1 -2.6,-8.2 0.5,-11.3 10.2,-9.2 21,-15.4 31.7,-17.9 17.4,-4.6 32.8,-0.5 46.6,12.3 6.7,-6.1 17.4,-12.8 31.7,-13.8 16.4,-1 32.3,6.7 47.6,22.5 3.1,3.1 3.1,8.2 0,11.3 -2.6,1 -4.6,2 -6.7,2zM765.4,798.2c-64.5,0 -116.7,-52.2 -116.7,-116.7 0,-64.5 52.2,-116.7 116.7,-116.7 64.5,0 116.7,52.2 116.7,116.7 0,64.5 -52.2,116.7 -116.7,116.7zM707.6,666.6c-8.7,0 -16.4,7.2 -15.9,16.4 0,8.7 7.2,15.9 15.9,15.9h118.3c8.7,0 16.4,-7.2 15.9,-16.4 0,-8.7 -7.2,-15.9 -15.9,-15.9h-118.3z"
android:fillColor="@color/sub_title_color"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="256dp"
android:height="256dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M222.1,580.4a356.2,356.2 0,0 0,34.1 152.9,357.6 357.6,0 0,0 477.7,-477.7A357.6,357.6 0,0 0,222.1 580.4z"
android:fillColor="@color/color_0"/>
<path
android:pathData="M1009,936.6l-276.1,-276.1a409.5,409.5 0,1 0,-72.3 72.3l276.1,276.1a51.2,51.2 0,0 0,72.3 -72.3zM409.8,716.9a307.1,307.1 0,1 1,307.1 -307.1,307.1 307.1,0 0,1 -307.1,307.1z"
android:fillColor="@color/black"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="256dp"
android:height="256dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M222.1,580.4a356.2,356.2 0,0 0,34.1 152.9,357.6 357.6,0 0,0 477.7,-477.7A357.6,357.6 0,0 0,222.1 580.4z"
android:fillColor="@color/color_0"/>
<path
android:pathData="M1009,936.6l-276.1,-276.1a409.5,409.5 0,1 0,-72.3 72.3l276.1,276.1a51.2,51.2 0,0 0,72.3 -72.3zM409.8,716.9a307.1,307.1 0,1 1,307.1 -307.1,307.1 307.1,0 0,1 -307.1,307.1z"
android:fillColor="@color/black"/>
</vector>

View File

@ -0,0 +1,22 @@
<!--<vector xmlns:android="http://schemas.android.com/apk/res/android"-->
<!-- android:width="256dp"-->
<!-- android:height="256dp"-->
<!-- android:viewportWidth="1024"-->
<!-- android:viewportHeight="1024">-->
<!-- <path-->
<!-- android:fillColor="@color/white"-->
<!-- android:pathData="M261.9,492.9c20.6,11.9 46,11.9 66.6,0 20.6,-11.9 33.3,-33.9 33.3,-57.6 0,-36.8 -29.8,-66.5 -66.6,-66.5s-66.5,29.8 -66.5,66.5c0,23.8 12.7,45.7 33.2,57.6z"/>-->
<!-- <path-->
<!-- android:fillColor="@color/white"-->
<!-- android:pathData="M804,153.4L221.4,153.4c-78.3,0 -142,63.7 -142,142v436.9c0,78.3 63.7,142 142,142L804,874.3c78.3,0 142,-63.7 142,-142L946,295.4c-0.1,-78.3 -63.7,-142 -142,-142zM144.9,295.4c0,-42.2 34.3,-76.5 76.4,-76.5L804,218.9c42.1,0 76.4,34.3 76.4,76.5v331.1l-95.3,-86.2 -13.6,-9.7c-71.9,-46.1 -164.2,-45.1 -233.9,1.3l-385,232.6c-4.7,-9.9 -7.7,-20.6 -7.7,-32.2L144.9,295.4zM804,808.8L221.4,808.8c-4.1,0 -7.6,-1.7 -11.4,-2.3l362.8,-219.2c49.5,-32.9 113.6,-33.4 162.8,-1.9l143.7,128.5 1.2,-1.3v19.8c-0.1,42.1 -34.4,76.4 -76.5,76.4z"/>-->
<!--</vector>-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M896,657.7l-109.9,-109.9c-9,-9 -13.9,-13.8 -17.7,-17.1 -0.2,-0.1 -0.3,-0.2 -0.4,-0.3l-0.4,0.4c-3.8,3.2 -8.7,8.1 -17.7,17L657.7,640l199.5,199.5a85.3,85.3 0,0 0,29.6 -32.7c3.4,-6.7 6.1,-16.2 7.7,-34.9 1.6,-19.2 1.6,-44.1 1.6,-80.6v-33.5zM511.6,616.1c-3.8,3.2 -8.7,8.1 -17.7,17L273.7,853.3 290.1,853.3h443.7l16.4,-0L530.1,633.1c-9,-9 -13.9,-13.8 -17.7,-17.1l-0.4,-0.3 -0.4,0.4zM384,384a42.7,42.7 0,1 0,-85.3 0,42.7 42.7,0 0,0 85.3,0zM896,332.8c0,-36.5 -0,-61.4 -1.6,-80.6 -1.5,-18.7 -4.3,-28.3 -7.7,-34.9a85.4,85.4 0,0 0,-37.3 -37.3c-6.7,-3.4 -16.2,-6.2 -34.9,-7.7C795.3,170.7 770.4,170.7 733.9,170.7L290.1,170.7c-36.5,0 -61.4,0 -80.6,1.6 -18.7,1.5 -28.3,4.3 -34.9,7.7a85.4,85.4 0,0 0,-37.3 37.3c-3.4,6.7 -6.2,16.2 -7.7,34.9 -1.6,19.2 -1.6,44.1 -1.6,80.6v358.4c0,36.5 0,61.4 1.6,80.6 1.5,18.7 4.3,28.3 7.7,34.9 6.8,13.4 17.1,24.6 29.5,32.7l266.7,-266.7c8,-8 15.7,-15.8 22.8,-21.8 7.5,-6.4 16.9,-13.1 29.3,-17.2a85.4,85.4 0,0 1,46.3 -1.8l6.5,1.8 4.5,1.6c10.2,4.1 18.3,10 24.8,15.5 7.1,6 14.8,13.8 22.8,21.8l6.9,6.9 92.2,-92.2c8,-8 15.7,-15.8 22.8,-21.8 7.5,-6.4 16.9,-13.1 29.3,-17.2a85.4,85.4 0,0 1,46.3 -1.8l6.5,1.8 4.5,1.6c10.2,4.1 18.3,10 24.8,15.5 7.1,6 14.8,13.8 22.8,21.8L896,537L896,332.8zM469.3,384a128,128 0,1 1,-256 0,128 128,0 0,1 256,0zM981.3,691.2c0,35.1 0,64.1 -1.9,87.6 -2,24 -6.1,46 -16.7,66.7a170.7,170.7 0,0 1,-74.6 74.6c-20.7,10.6 -42.8,14.7 -66.7,16.7 -23.5,1.9 -52.4,1.9 -87.6,1.9L290.1,938.7c-35.1,0 -64.1,0 -87.6,-1.9 -24,-2 -46,-6.1 -66.7,-16.7a170.7,170.7 0,0 1,-74.6 -74.6c-10.5,-20.7 -14.7,-42.8 -16.7,-66.7C42.6,755.3 42.7,726.3 42.7,691.2L42.7,332.8c0,-35.1 -0,-64.1 1.9,-87.6 2,-24 6.2,-46 16.7,-66.7a170.7,170.7 0,0 1,74.6 -74.6c20.7,-10.5 42.8,-14.7 66.7,-16.7C226,85.3 255,85.3 290.1,85.3h443.7c35.1,0 64.1,-0 87.6,1.9 24,2 46,6.2 66.7,16.7a170.7,170.7 0,0 1,74.6 74.6c10.6,20.7 14.7,42.8 16.7,66.7 1.9,23.5 1.9,52.4 1.9,87.6v358.4z"
android:fillColor="@color/white"
android:fillAlpha="0.88"/>
</vector>

View File

@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="256dp"
android:height="256dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M219.8,71c-12.3,0 -21.8,-9.6 -21.8,-21.8S208.9,27.3 219.8,27.3c12.3,0 21.8,9.6 21.8,21.8 0,12.3 -9.6,21.8 -21.8,21.8zM219.8,34.1c-8.2,0 -15,6.8 -15,15s6.8,15 15,15c8.2,0 15,-6.8 15,-15 0,-8.2 -6.8,-15 -15,-15z"
android:strokeAlpha="0.3"
android:fillColor="@color/sub_title_color"
android:fillAlpha="0.3"/>
<path
android:pathData="M935.3,1009L112,1009c-4.1,0 -6.8,2.7 -6.8,6.8s2.7,6.8 6.8,6.8h823.3c4.1,0 6.8,-2.7 6.8,-6.8s-2.7,-6.8 -6.8,-6.8zM84.7,1009h-54.6c-4.1,0 -6.8,2.7 -6.8,6.8s2.7,6.8 6.8,6.8h54.6c4.1,0 6.8,-2.7 6.8,-6.8s-4.1,-6.8 -6.8,-6.8zM994,1009h-27.3c-4.1,0 -6.8,2.7 -6.8,6.8s2.7,6.8 6.8,6.8h27.3c4.1,0 6.8,-2.7 6.8,-6.8s-2.7,-6.8 -6.8,-6.8zM244.4,428.7c4.1,0 6.8,-2.7 6.8,-6.8L251.2,210.3h400v109.2L764.6,319.5l4.1,4.1v379.6c0,4.1 2.7,6.8 6.8,6.8s6.8,-2.7 6.8,-6.8L782.3,318.1l-8.2,-8.2c0,-1.4 -2.7,-4.1 -4.1,-4.1l-107.9,-107.9 -1.4,-1.4h-423.3v225.3c0,4.1 2.7,6.8 6.8,6.8zM663.6,305.8v-86l86,86h-86zM244.4,518.8c4.1,0 6.8,-2.7 6.8,-6.8v-64.2c0,-4.1 -2.7,-6.8 -6.8,-6.8s-6.8,2.7 -6.8,6.8v64.2c0,4.1 2.7,6.8 6.8,6.8zM244.4,558.4c4.1,0 6.8,-2.7 6.8,-6.8L251.2,532.5c0,-4.1 -2.7,-6.8 -6.8,-6.8s-6.8,2.7 -6.8,6.8v19.1c0,4.1 2.7,6.8 6.8,6.8zM782.3,740c0,-4.1 -2.7,-6.8 -6.8,-6.8s-6.8,2.7 -6.8,6.8v84.7L251.2,824.7L251.2,570.7c0,-4.1 -2.7,-6.8 -6.8,-6.8s-6.8,2.7 -6.8,6.8v267.6h544.8v-98.3z"
android:fillColor="@color/sub_title_color"/>
<path
android:pathData="M460.1,434.2c-4.1,-1.4 -6.8,1.4 -8.2,5.5 -2.7,15 -12.3,27.3 -24.6,32.8 -24.6,9.6 -58.7,-8.2 -58.7,-9.6 -2.7,-1.4 -6.8,-1.4 -9.6,2.7 -1.4,2.7 -1.4,6.8 2.7,9.6 15,8.2 31.4,13.7 49.2,13.7 6.8,0 15,-1.4 21.8,-4.1 17.7,-8.2 30,-23.2 32.8,-42.3 0,-4.1 -1.4,-8.2 -5.5,-8.2zM584.4,490.2c5.5,2.7 10.9,2.7 17.7,2.7 16.4,-1.4 31.4,-6.8 45.1,-16.4 2.7,-2.7 4.1,-6.8 1.4,-9.6 -2.7,-2.7 -5.5,-4.1 -9.6,-1.4 -19.1,12.3 -35.5,16.4 -49.2,10.9 -21.8,-8.2 -31.4,-39.6 -31.4,-39.6 -1.4,-4.1 -5.5,-5.5 -8.2,-4.1 -4.1,1.4 -5.5,4.1 -4.1,8.2 0,2.7 9.6,38.2 38.2,49.2zM462.8,617.1c1.4,-1.4 36.9,-34.1 81.9,4.1 1.4,1.4 2.7,1.4 4.1,1.4 4.1,0 6.8,-2.7 6.8,-6.8 0,-2.7 -1.4,-4.1 -2.7,-5.5 -56,-45.1 -99.7,-2.7 -101,-2.7 -2.7,2.7 -2.7,6.8 0,9.6s8.2,2.7 10.9,0zM909.3,148.8c12.3,0 21.8,-9.6 21.8,-21.8s-9.6,-21.8 -21.8,-21.8c-12.3,0 -21.8,9.6 -21.8,21.8 1.4,12.3 10.9,21.8 21.8,21.8zM909.3,113.3c8.2,0 15,6.8 15,15s-6.8,15 -15,15c-8.2,0 -15,-6.8 -15,-15 1.4,-8.2 8.2,-15 15,-15zM73.7,296.3l13.7,8.2 -6.8,13.7c-1.4,2.7 0,5.5 2.7,6.8 2.7,1.4 5.5,0 6.8,-2.7l5.5,-12.3 12.3,8.2c1.4,0 1.4,1.4 2.7,1.4 2.7,0 5.5,-2.7 5.5,-5.5 0,-1.4 -1.4,-4.1 -2.7,-4.1l-13.7,-8.2 6.8,-13.7c1.4,-2.7 0,-5.5 -2.7,-6.8 -2.7,-1.4 -5.5,0 -6.8,2.7l-6.8,12.3 -10.9,-9.6c-2.7,-1.4 -5.5,-1.4 -6.8,1.4 -2.7,2.7 -1.4,6.8 1.4,8.2zM957.1,475.1l-19.1,-10.9 8.2,-20.5c1.4,-4.1 0,-6.8 -4.1,-9.6s-6.8,0 -9.6,4.1l-8.2,19.1 -17.7,-9.6c-2.7,-1.4 -6.8,0 -9.6,2.7 -1.4,2.7 0,6.8 2.7,9.6l19.1,10.9 -8.2,20.5c-1.4,4.1 0,6.8 4.1,9.6s6.8,0 9.6,-4.1l8.2,-19.1 17.7,9.6c2.7,1.4 6.8,0 9.6,-2.7s0,-8.2 -2.7,-9.6z"
android:fillColor="@color/sub_title_color"/>
</vector>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/color_main_view"/>
</shape>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp" />
<solid android:color="@color/color_main_view" />
</shape>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="19dp"/>
<gradient
android:angle="45"
android:endColor="#F2F2F7"
android:startColor="#F2F2F7" />
</shape>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp"/>
<stroke android:width="1dp" android:color="@color/black"/>
</shape>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_like_selected3" android:state_selected="true" />
<item android:drawable="@drawable/image_like_stoke_white3" />
</selector>

View File

@ -0,0 +1,4 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_tab1_selected3" android:state_selected="true"/>
<item android:drawable="@drawable/ic_tab1_unselected3"/>
</selector>

View File

@ -0,0 +1,4 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_tab3_selected3" android:state_selected="true"/>
<item android:drawable="@drawable/ic_tab3_unselected3"/>
</selector>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="10dp" />
<solid android:color="@color/sub_color" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="10dp" />
<gradient
android:angle="0"
android:endColor="#8DADF2"
android:centerColor="#31C9E3"
android:startColor="#5EF8DB" />
</shape>
</clip>
</item>
</layer-list>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/beijing"
android:paddingTop="10dp"
tools:context="com.wall.snap.wallpaper.acctivitysnap.ListsnapActivity">
<ImageView
android:id="@+id/imageview_back"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:background="@drawable/oval3"
android:padding="13dp"
android:src="@drawable/fanhui_copy"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.wall.snap.wallpaper.toolsnap.MyTextsnap
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/imageview_back"
android:layout_alignBottom="@id/imageview_back"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="17sp"
app:apply_font="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/imageview_back"
android:layout_marginTop="15dp" />
</RelativeLayout>

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/beijing"
android:orientation="vertical"
tools:context="com.wall.snap.wallpaper.acctivitysnap.MainsnapActivity">
<!-- 模糊背景图片 -->
<ImageView
android:id="@+id/blurred_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_marginTop="0dp"
android:scaleType="centerCrop" />
<com.wall.snap.wallpaper.toolsnap.MyTextsnap
android:id="@+id/textview_wallpaper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:padding="12dp"
android:layout_marginTop="29dp"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="25sp"
app:apply_font="true" />
<!-- <ImageView-->
<!-- android:id="@+id/im_search"-->
<!-- android:layout_width="65dp"-->
<!-- android:layout_height="65dp"-->
<!-- android:paddingEnd="15dp"-->
<!-- android:paddingTop="25dp"-->
<!-- android:paddingBottom="15dp"-->
<!-- android:paddingStart="12dp"-->
<!-- android:layout_marginEnd="10dp"-->
<!-- android:layout_alignTop="@id/textview_wallpaper"-->
<!-- android:layout_alignBottom="@id/textview_wallpaper"-->
<!-- android:layout_alignParentEnd="true"-->
<!-- android:src="@drawable/image_search_black3"/>-->
<!-- 搜索栏LinearLayout -->
<LinearLayout
android:id="@+id/search_bar"
android:layout_width="380dp"
android:layout_height="50dp"
android:layout_below="@id/textview_wallpaper"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:background="@drawable/rect_30"
android:layout_marginTop="-10dp"
android:layout_centerHorizontal="true">
<!-- 搜索图标 -->
<ImageView
android:id="@+id/search_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/image_search_black3" /> <!-- 你的搜索图标资源 -->
<!-- 搜索框 -->
<TextView
android:id="@+id/search_edit_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="Search for wallpapers"
android:textColorHint="@color/gray"
android:textSize="16sp"
android:background="@android:color/transparent"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:gravity="center_vertical|start"
/>
</LinearLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2"
android:layout_marginTop="6dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/search_bar" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="0dp"
android:background="#F5F5F5"
app:tabBackground="@color/color_0"
app:tabIndicator="@null"
app:tabIndicatorHeight="0dp"
/>
</RelativeLayout>

View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/beijing"
android:paddingTop="30dp">
<ImageView
android:id="@+id/imageview_back"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_gravity="center"
android:background="@drawable/oval3"
android:padding="13dp"
android:layout_marginStart="7dp"
android:layout_alignTop="@id/title"
android:src="@drawable/fanhui_copy"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.wall.snap.wallpaper.toolsnap.MyTextsnap
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:padding="10dp"
android:layout_marginTop="12dp"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="17sp"
app:apply_font="true" />
<RelativeLayout
android:id="@+id/et_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginStart="15dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_toStartOf="@id/btn_search"
android:background="@drawable/rect_stoke_16">
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="41dp"
android:background="@color/color_0"
android:hint="@string/please_input_keyword"
android:imeOptions="actionSearch"
android:inputType="text"
android:maxLines="1"
android:paddingStart="11dp"
android:paddingEnd="10dp"
android:textColorHint="@color/sub_title_color"
android:textSize="16sp" />
</RelativeLayout>
<ImageView
android:id="@+id/btn_search"
android:layout_width="55dp"
android:layout_height="wrap_content"
android:layout_alignTop="@id/et_parent"
android:layout_alignBottom="@id/et_parent"
android:layout_alignParentEnd="true"
android:layout_marginEnd="10dp"
android:paddingStart="15dp"
android:paddingTop="6dp"
android:paddingEnd="15dp"
android:paddingBottom="6dp"
android:src="@drawable/image_search_white3" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/result_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/et_parent"
android:layout_marginTop="10dp" />
<LinearLayout
android:id="@+id/empty_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/img_empty_result3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/no_search_result"
android:textColor="@color/sub_title_color" />
</LinearLayout>
<ProgressBar
android:id="@+id/search_pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateTint="@color/color_FEA7F5"
android:visibility="gone" />
</RelativeLayout>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wall.snap.wallpaper.acctivitysnap.SplashsnapActivity">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/beijing"/>
<com.wall.snap.wallpaper.toolsnap.MyTextsnap
android:id="@+id/textview_appname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="210dp"
android:layout_marginBottom="15dp"
android:text="@string/app_name"
android:textColor="#3876F2"
android:textSize="22sp"
app:apply_font="true" />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottieAnimationView"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_centerInParent="true" />
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="250dp"
android:layout_height="6dp"
android:layout_below="@id/textview_appname"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp"
android:max="100"
android:progress="1"
android:progressDrawable="@drawable/splash_pb3" />
</RelativeLayout>

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wall.snap.wallpaper.acctivitysnap.WallpapersnapActivity">
<ImageView
android:id="@+id/imageview_preview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/imageview_back"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_gravity="center"
android:layout_marginStart="15dp"
android:layout_marginTop="42dp"
android:background="@drawable/oval3"
android:padding="13dp"
android:src="@drawable/fanhui_copy"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.wall.snap.wallpaper.toolsnap.MyTextsnap
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:background="@drawable/rect_16"
android:gravity="center"
android:minHeight="40dp"
android:padding="10dp"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="13sp"
app:apply_font="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<RelativeLayout
android:id="@+id/layout_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:background="@drawable/oval3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/tv_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<ImageView
android:id="@+id/button_set"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_centerInParent="true"
android:padding="13dp"
android:src="@drawable/image_wallpaper3" />
<ProgressBar
android:id="@+id/pb_set"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_centerInParent="true"
android:indeterminateTint="@color/white"
android:padding="13dp"
android:visibility="gone" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/layout_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="26dp"
android:background="@drawable/oval3"
app:layout_constraintBottom_toBottomOf="@id/layout_set"
app:layout_constraintRight_toLeftOf="@id/layout_set"
app:layout_constraintTop_toTopOf="@id/layout_set">
<ImageView
android:id="@+id/image_download"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_centerInParent="true"
android:padding="13dp"
android:src="@drawable/ic_download3" />
<ProgressBar
android:id="@+id/pb_download"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_centerInParent="true"
android:indeterminateTint="@color/white"
android:padding="13dp"
android:visibility="gone" />
</RelativeLayout>
<ImageView
android:id="@+id/image_favorite"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_alignParentEnd="true"
android:layout_centerInParent="true"
android:layout_marginStart="26dp"
android:background="@drawable/oval3"
android:padding="13dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:src="@drawable/selector_favorite3"
app:layout_constraintBottom_toBottomOf="@id/layout_set"
app:layout_constraintLeft_toRightOf="@id/layout_set"
app:layout_constraintTop_toTopOf="@id/layout_set" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/layout_no_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/image_no_ata3" />
<TextView
android:id="@+id/tv_title"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:text="@string/no_like_data"
android:textColor="@color/sub_title_color"
android:textSize="14sp" />
</LinearLayout>
</RelativeLayout>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wall.snap.wallpaper.fragmentsnap.FragmentMainsnap">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/class_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/loading_pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateTint="@color/white" />
</RelativeLayout>

Some files were not shown because too many files have changed in this diff Show More