Compare commits
26
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a85b3a4f0 | ||
|
|
413701d28e | ||
|
|
016bd342c4 | ||
|
|
d04b2249f0 | ||
|
|
8eb7ded6ba | ||
|
|
1f9c6fd80c | ||
|
|
4ec84e3754 | ||
|
|
ad3f70f4ac | ||
|
|
611f4d3159 | ||
|
|
7319714140 | ||
|
|
857db4879a | ||
|
|
b5db820733 | ||
|
|
c668105003 | ||
|
|
dd6bbcbc2c | ||
|
|
4ed0749027 | ||
|
|
3b834c2688 | ||
|
|
0c5a40bedc | ||
|
|
8146b863b1 | ||
|
|
c64f8a1b2d | ||
|
|
dd6916c08a | ||
|
|
58c14fbd4f | ||
|
|
3b830f5e2e | ||
|
|
c304313be9 | ||
|
|
3068ff76c1 | ||
|
|
a6b56e0e87 | ||
|
|
5360ca6c5e |
@@ -0,0 +1,28 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="RClass Regeneration" type="ShConfigurationType">
|
||||||
|
<option name="SCRIPT_TEXT" value="" />
|
||||||
|
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
||||||
|
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/scripts/rclass_regenerator.sh" />
|
||||||
|
<option name="SCRIPT_OPTIONS" value="" />
|
||||||
|
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
||||||
|
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
||||||
|
<option name="INTERPRETER_PATH" value="/bin/zsh" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
||||||
|
<option name="EXECUTE_SCRIPT_FILE" value="true" />
|
||||||
|
<envs />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="false" name="RClass Regeneration" type="BatchConfigurationType" factoryName="Batch">
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<module name="" />
|
||||||
|
<option name="SCRIPT_NAME" value="./scripts/rclass_regenerator.bat" />
|
||||||
|
<option name="PARAMETERS" value="" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Make" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Update APKs Jars (MacOS)" type="ShConfigurationType">
|
||||||
|
<option name="SCRIPT_TEXT" value="" />
|
||||||
|
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
||||||
|
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/scripts/update_jars_brew.sh" />
|
||||||
|
<option name="SCRIPT_OPTIONS" value="" />
|
||||||
|
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
||||||
|
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
||||||
|
<option name="INTERPRETER_PATH" value="/bin/zsh" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
||||||
|
<option name="EXECUTE_SCRIPT_FILE" value="true" />
|
||||||
|
<envs />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Update APKs Jars" type="ShConfigurationType">
|
||||||
|
<option name="SCRIPT_TEXT" value="" />
|
||||||
|
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
||||||
|
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/scripts/update_jars.sh" />
|
||||||
|
<option name="SCRIPT_OPTIONS" value="" />
|
||||||
|
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
||||||
|
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
||||||
|
<option name="INTERPRETER_PATH" value="/bin/zsh" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
||||||
|
<option name="EXECUTE_SCRIPT_FILE" value="true" />
|
||||||
|
<envs />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildAndInstallVTLBeta]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildAndInstallVTLBeta" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildAndInstallVTLDev]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildAndInstallVTLDev" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildAndInstallVTLRelease]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildAndInstallVTLRelease" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildAndLaunchVTLBeta]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildAndLaunchVTLBeta" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildAndLaunchVTLDev]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildAndLaunchVTLDev" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildAndLaunchVTLRelease]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildAndLaunchVTLRelease" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildVTLBeta]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildVTLBeta" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildVTLDev]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildVTLDev" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:buildVTLRelease]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:buildVTLRelease" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:exportDexBeta]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:exportDexBeta" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:exportDexDev]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:exportDexDev" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:exportDexRelease]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:exportDexRelease" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:prepareDexForMergeDev]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:prepareDexForMergeDev" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="lite [app:prepareDexForMergeRelease]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" value="" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="app:prepareDexForMergeRelease" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" value="-Xms4g -Xmx4g" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
+35
-38
@@ -20,9 +20,9 @@ cargo {
|
|||||||
def smaliFolder = projectDir.toPath().resolve("../smali").normalize()
|
def smaliFolder = projectDir.toPath().resolve("../smali").normalize()
|
||||||
def scriptsFolder = projectDir.toPath().resolve("../scripts").normalize()
|
def scriptsFolder = projectDir.toPath().resolve("../scripts").normalize()
|
||||||
//you can add own folders with decompiled smali code
|
//you can add own folders with decompiled smali code
|
||||||
def dexes=smaliFolder.toFile()
|
def dexes = smaliFolder.toFile()
|
||||||
.listFiles( { f -> f.isDirectory() && f.name.startsWith("smali") } as FileFilter)
|
.listFiles({ f -> f.isDirectory() && f.name.startsWith("smali") } as FileFilter)
|
||||||
.size()
|
.size()
|
||||||
|
|
||||||
versionFile {
|
versionFile {
|
||||||
file = projectDir.toPath().resolve("src/main/assets/version.properties").toFile()
|
file = projectDir.toPath().resolve("src/main/assets/version.properties").toFile()
|
||||||
@@ -78,7 +78,7 @@ android {
|
|||||||
targetCompatibility JavaVersion.VERSION_14
|
targetCompatibility JavaVersion.VERSION_14
|
||||||
}
|
}
|
||||||
namespace 'ru.vtosters.lite'
|
namespace 'ru.vtosters.lite'
|
||||||
ndkVersion '25.2.9519653'
|
ndkVersion '26.1.10909125'
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
aidl true
|
aidl true
|
||||||
}
|
}
|
||||||
@@ -91,11 +91,11 @@ task testClasses {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.microsoft.appcenter:appcenter-analytics:5.0.2'
|
implementation 'com.microsoft.appcenter:appcenter-analytics:5.0.4'
|
||||||
implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.2'
|
implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.4'
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
|
||||||
implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4'
|
implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4'
|
||||||
implementation 'com.google.guava:guava:23.3-android'
|
implementation 'com.google.guava:guava:32.0.0-android'
|
||||||
|
|
||||||
implementation fileTree(dir: 'libs', include: ['*.aar'])
|
implementation fileTree(dir: 'libs', include: ['*.aar'])
|
||||||
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
|
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
@@ -105,38 +105,35 @@ task generateBuildTasks() {
|
|||||||
android.applicationVariants.all { variant ->
|
android.applicationVariants.all { variant ->
|
||||||
variant.outputs.each { output ->
|
variant.outputs.each { output ->
|
||||||
def buildType = output.name.toString().capitalize()
|
def buildType = output.name.toString().capitalize()
|
||||||
if(buildType=="Base")return
|
if (buildType == "Base") return
|
||||||
task "exportDex$buildType"() {
|
task "exportDex$buildType"() {
|
||||||
dependsOn('assemble' + buildType)
|
dependsOn('assemble' + buildType)
|
||||||
doLast {
|
doLast {
|
||||||
try {
|
try {
|
||||||
def suffix=buildType.toLowerCase()
|
def suffix = buildType.toLowerCase()
|
||||||
String apkPath=projectDir.getAbsolutePath()+"/build/outputs/apk/$suffix/app-$suffix"
|
String apkPath = projectDir.getAbsolutePath() + "/build/outputs/apk/$suffix/app-$suffix"
|
||||||
def apk=new File(apkPath+"-unsigned.apk")
|
def apk = new File(apkPath + "-unsigned.apk")
|
||||||
if(!apk.exists())apk=new File(apkPath+".apk")
|
if (!apk.exists()) apk = new File(apkPath + ".apk")
|
||||||
def zip=new ZipFile(apk)
|
def zip = new ZipFile(apk)
|
||||||
def entries=zip.entries()
|
def dexCounter = dexes
|
||||||
def dexCounter=dexes
|
zip.stream()
|
||||||
while(entries.hasMoreElements())
|
.filter(entry -> entry.name.matches("^classes(?:(?=\\d)2|)\\.dex\$") || entry.name == "assets/version.properties")
|
||||||
{
|
.forEach(entry -> {
|
||||||
def entry=entries.nextElement()
|
String filename
|
||||||
String filename
|
if (entry.name.matches("^classes(?:(?=\\d)2|)\\.dex\$")) filename = "classes${++dexCounter}.dex"
|
||||||
if(entry.name.matches("^classes(?:(?=\\d)2|)\\.dex\$"))filename="classes${++dexCounter}.dex"
|
else filename = "version.properties"
|
||||||
else if(entry.name=="assets/version.properties")filename="version.properties"
|
println("Exporting " + entry.name)
|
||||||
else continue
|
def tmpFile = new File(projectDir, filename)
|
||||||
println("Exporting "+entry.name)
|
try (def is = zip.getInputStream(entry); def fos = new FileOutputStream(tmpFile)) {
|
||||||
def tmpFile=new File(projectDir,filename)
|
def buff = new byte[0x800]
|
||||||
def is=zip.getInputStream(entry)
|
int len
|
||||||
def fos=new FileOutputStream(tmpFile)
|
while ((len = is.read(buff)) > 0) fos.write(buff, 0, len)
|
||||||
def buff=new byte[0x800]
|
}
|
||||||
int len
|
});
|
||||||
while((len=is.read(buff))>0)fos.write(buff,0,len)
|
|
||||||
is.close()
|
|
||||||
fos.close()
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
task "prepareDexForMerge$buildType"(type: Copy) {
|
task "prepareDexForMerge$buildType"(type: Copy) {
|
||||||
@@ -152,19 +149,19 @@ task generateBuildTasks() {
|
|||||||
include 'version.properties'
|
include 'version.properties'
|
||||||
into 'assets'
|
into 'assets'
|
||||||
}
|
}
|
||||||
from('../native-effects/target/aarch64-linux-android/release'){
|
from('../native-effects/target/aarch64-linux-android/release') {
|
||||||
include 'libnative_effects.so'
|
include 'libnative_effects.so'
|
||||||
into 'lib/arm64-v8a'
|
into 'lib/arm64-v8a'
|
||||||
}
|
}
|
||||||
from('../native-effects/target/armv7-linux-androideabi/release'){
|
from('../native-effects/target/armv7-linux-androideabi/release') {
|
||||||
include 'libnative_effects.so'
|
include 'libnative_effects.so'
|
||||||
into 'lib/armeabi-v7a'
|
into 'lib/armeabi-v7a'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
task "cleanTemporaryFiles$buildType"(type:Delete)
|
task "cleanTemporaryFiles$buildType"(type: Delete)
|
||||||
{
|
{
|
||||||
delete fileTree(dir:projectDir,include:["*.dex","version.properties"])
|
delete fileTree(dir: projectDir, include: ["*.dex", "version.properties"])
|
||||||
delete fileTree(dir:smaliFolder,include:['*.dex',"assets/version.properties"])
|
delete fileTree(dir: smaliFolder, include: ['*.dex', "assets/version.properties"])
|
||||||
}
|
}
|
||||||
task "buildVTL$buildType"(type: Exec) {
|
task "buildVTL$buildType"(type: Exec) {
|
||||||
dependsOn('prepareDexForMerge' + buildType)
|
dependsOn('prepareDexForMerge' + buildType)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.os.RemoteException;
|
|||||||
import bruhcollective.itaysonlab.libvkx.ILibVkxService;
|
import bruhcollective.itaysonlab.libvkx.ILibVkxService;
|
||||||
import com.vk.dto.music.MusicTrack;
|
import com.vk.dto.music.MusicTrack;
|
||||||
import com.vk.music.common.MusicPlaybackLaunchContext;
|
import com.vk.music.common.MusicPlaybackLaunchContext;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -33,7 +34,7 @@ public class LibVKXClient {
|
|||||||
public static boolean isVkxInstalled() {
|
public static boolean isVkxInstalled() {
|
||||||
try {
|
try {
|
||||||
getGlobalContext().getPackageManager().getPackageInfo("ua.itaysonlab.vkx", 0);
|
getGlobalContext().getPackageManager().getPackageInfo("ua.itaysonlab.vkx", 0);
|
||||||
return isValidSignature();
|
return isValidSignature() && !Preferences.serverFeaturesDisable();
|
||||||
} catch (Exception unused) {
|
} catch (Exception unused) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -80,6 +81,7 @@ public class LibVKXClient {
|
|||||||
lambdaplay(list, musicTrack, iLibVkxService, null);
|
lambdaplay(list, musicTrack, iLibVkxService, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String asId(MusicTrack musicTrack)
|
public static String asId(MusicTrack musicTrack) {
|
||||||
{ return musicTrack.y1(); }
|
return musicTrack.y1();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -59,26 +59,22 @@ public class ArscBlamer {
|
|||||||
* Maps type chunk entries to blamed resources.
|
* Maps type chunk entries to blamed resources.
|
||||||
*/
|
*/
|
||||||
private final Multimap<TypeChunk.Entry, ResourceEntry> typeEntryToBlame = HashMultimap.create();
|
private final Multimap<TypeChunk.Entry, ResourceEntry> typeEntryToBlame = HashMultimap.create();
|
||||||
|
|
||||||
/**
|
|
||||||
* Maps resources to the type chunk entries they reference.
|
|
||||||
*/
|
|
||||||
private Multimap<ResourceEntry, TypeChunk.Entry> resourceEntries;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maps resources which have no base config to the type chunk entries they reference.
|
|
||||||
*/
|
|
||||||
private Multimap<ResourceEntry, TypeChunk.Entry> baselessKeys;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains all of the type chunks in {@link #resourceTable}.
|
|
||||||
*/
|
|
||||||
private List<TypeChunk> typeChunks;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the {@link ResourceTableChunk} inside of the resources.arsc file in the APK.
|
* This is the {@link ResourceTableChunk} inside of the resources.arsc file in the APK.
|
||||||
*/
|
*/
|
||||||
private final ResourceTableChunk resourceTable;
|
private final ResourceTableChunk resourceTable;
|
||||||
|
/**
|
||||||
|
* Maps resources to the type chunk entries they reference.
|
||||||
|
*/
|
||||||
|
private Multimap<ResourceEntry, TypeChunk.Entry> resourceEntries;
|
||||||
|
/**
|
||||||
|
* Maps resources which have no base config to the type chunk entries they reference.
|
||||||
|
*/
|
||||||
|
private Multimap<ResourceEntry, TypeChunk.Entry> baselessKeys;
|
||||||
|
/**
|
||||||
|
* Contains all of the type chunks in {@link #resourceTable}.
|
||||||
|
*/
|
||||||
|
private List<TypeChunk> typeChunks;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ArscBlamer}.
|
* Creates a new {@link ArscBlamer}.
|
||||||
@@ -90,6 +86,14 @@ public class ArscBlamer {
|
|||||||
this.stringToBlame = createEntryListArray(resourceTable.getStringPool().getStringCount());
|
this.stringToBlame = createEntryListArray(resourceTable.getStringPool().getStringCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static List<ResourceEntry>[] createEntryListArray(int size) {
|
||||||
|
ArrayListResourceEntry[] result = new ArrayListResourceEntry[size];
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
result[i] = new ArrayListResourceEntry();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates blame mappings.
|
* Generates blame mappings.
|
||||||
*/
|
*/
|
||||||
@@ -257,14 +261,6 @@ public class ArscBlamer {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<ResourceEntry>[] createEntryListArray(int size) {
|
|
||||||
ArrayListResourceEntry[] result = new ArrayListResourceEntry[size];
|
|
||||||
for (int i = 0; i < size; ++i) {
|
|
||||||
result[i] = new ArrayListResourceEntry();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows creation of concrete parameterized type arr {@link ArscBlamer#createEntryListArray}.
|
* Allows creation of concrete parameterized type arr {@link ArscBlamer#createEntryListArray}.
|
||||||
*/
|
*/
|
||||||
@@ -283,6 +279,12 @@ public class ArscBlamer {
|
|||||||
private final String typeName;
|
private final String typeName;
|
||||||
private final String entryName;
|
private final String entryName;
|
||||||
|
|
||||||
|
private ResourceEntry(String packageName, String typeName, String entryName) {
|
||||||
|
this.packageName = packageName;
|
||||||
|
this.typeName = typeName;
|
||||||
|
this.entryName = entryName;
|
||||||
|
}
|
||||||
|
|
||||||
static ResourceEntry create(TypeChunk.Entry entry) {
|
static ResourceEntry create(TypeChunk.Entry entry) {
|
||||||
PackageChunk packageChunk = Preconditions.checkNotNull(entry.parent().getPackageChunk());
|
PackageChunk packageChunk = Preconditions.checkNotNull(entry.parent().getPackageChunk());
|
||||||
String packageName = packageChunk.getPackageName();
|
String packageName = packageChunk.getPackageName();
|
||||||
@@ -291,12 +293,6 @@ public class ArscBlamer {
|
|||||||
return new ResourceEntry(packageName, typeName, entryName);
|
return new ResourceEntry(packageName, typeName, entryName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResourceEntry(String packageName, String typeName, String entryName) {
|
|
||||||
this.packageName = packageName;
|
|
||||||
this.typeName = typeName;
|
|
||||||
this.entryName = entryName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String packageName() {
|
public String packageName() {
|
||||||
return packageName;
|
return packageName;
|
||||||
}
|
}
|
||||||
|
|||||||
+221
-240
@@ -31,6 +31,148 @@ import static java.nio.charset.StandardCharsets.US_ASCII;
|
|||||||
* Describes a particular resource configuration.
|
* Describes a particular resource configuration.
|
||||||
*/
|
*/
|
||||||
public class BinaryResourceConfiguration implements SerializableResource {
|
public class BinaryResourceConfiguration implements SerializableResource {
|
||||||
|
/**
|
||||||
|
* The below constants are from android.content.res.Configuration.
|
||||||
|
*/
|
||||||
|
private static final int DENSITY_DPI_UNDEFINED = 0;
|
||||||
|
private static final int DENSITY_DPI_LDPI = 120;
|
||||||
|
private static final int DENSITY_DPI_MDPI = 160;
|
||||||
|
private static final int DENSITY_DPI_TVDPI = 213;
|
||||||
|
private static final int DENSITY_DPI_HDPI = 240;
|
||||||
|
private static final int DENSITY_DPI_XHDPI = 320;
|
||||||
|
private static final int DENSITY_DPI_XXHDPI = 480;
|
||||||
|
private static final int DENSITY_DPI_XXXHDPI = 640;
|
||||||
|
private static final int DENSITY_DPI_ANY = 0xFFFE;
|
||||||
|
private static final int DENSITY_DPI_NONE = 0xFFFF;
|
||||||
|
private static final Map<Integer, String> DENSITY_DPI_VALUES =
|
||||||
|
ImmutableMap.<Integer, String>builder()
|
||||||
|
.put(DENSITY_DPI_UNDEFINED, "")
|
||||||
|
.put(DENSITY_DPI_LDPI, "ldpi")
|
||||||
|
.put(DENSITY_DPI_MDPI, "mdpi")
|
||||||
|
.put(DENSITY_DPI_TVDPI, "tvdpi")
|
||||||
|
.put(DENSITY_DPI_HDPI, "hdpi")
|
||||||
|
.put(DENSITY_DPI_XHDPI, "xhdpi")
|
||||||
|
.put(DENSITY_DPI_XXHDPI, "xxhdpi")
|
||||||
|
.put(DENSITY_DPI_XXXHDPI, "xxxhdpi")
|
||||||
|
.put(DENSITY_DPI_ANY, "anydpi")
|
||||||
|
.put(DENSITY_DPI_NONE, "nodpi")
|
||||||
|
.build();
|
||||||
|
private static final int KEYBOARD_NOKEYS = 1;
|
||||||
|
private static final int KEYBOARD_QWERTY = 2;
|
||||||
|
private static final int KEYBOARD_12KEY = 3;
|
||||||
|
private static final Map<Integer, String> KEYBOARD_VALUES = ImmutableMap.of(
|
||||||
|
KEYBOARD_NOKEYS, "nokeys",
|
||||||
|
KEYBOARD_QWERTY, "qwerty",
|
||||||
|
KEYBOARD_12KEY, "12key");
|
||||||
|
private static final int KEYBOARDHIDDEN_MASK = 0x03;
|
||||||
|
private static final int KEYBOARDHIDDEN_NO = 1;
|
||||||
|
private static final int KEYBOARDHIDDEN_YES = 2;
|
||||||
|
private static final int KEYBOARDHIDDEN_SOFT = 3;
|
||||||
|
private static final Map<Integer, String> KEYBOARDHIDDEN_VALUES = ImmutableMap.of(
|
||||||
|
KEYBOARDHIDDEN_NO, "keysexposed",
|
||||||
|
KEYBOARDHIDDEN_YES, "keyshidden",
|
||||||
|
KEYBOARDHIDDEN_SOFT, "keyssoft");
|
||||||
|
private static final int NAVIGATION_NONAV = 1;
|
||||||
|
private static final int NAVIGATION_DPAD = 2;
|
||||||
|
private static final int NAVIGATION_TRACKBALL = 3;
|
||||||
|
private static final int NAVIGATION_WHEEL = 4;
|
||||||
|
private static final Map<Integer, String> NAVIGATION_VALUES = ImmutableMap.of(
|
||||||
|
NAVIGATION_NONAV, "nonav",
|
||||||
|
NAVIGATION_DPAD, "dpad",
|
||||||
|
NAVIGATION_TRACKBALL, "trackball",
|
||||||
|
NAVIGATION_WHEEL, "wheel");
|
||||||
|
private static final int NAVIGATIONHIDDEN_MASK = 0x0C;
|
||||||
|
private static final int NAVIGATIONHIDDEN_NO = 0x04;
|
||||||
|
private static final int NAVIGATIONHIDDEN_YES = 0x08;
|
||||||
|
private static final Map<Integer, String> NAVIGATIONHIDDEN_VALUES = ImmutableMap.of(
|
||||||
|
NAVIGATIONHIDDEN_NO, "navexposed",
|
||||||
|
NAVIGATIONHIDDEN_YES, "navhidden");
|
||||||
|
private static final int ORIENTATION_PORTRAIT = 0x01;
|
||||||
|
private static final int ORIENTATION_LANDSCAPE = 0x02;
|
||||||
|
private static final Map<Integer, String> ORIENTATION_VALUES = ImmutableMap.of(
|
||||||
|
ORIENTATION_PORTRAIT, "port",
|
||||||
|
ORIENTATION_LANDSCAPE, "land");
|
||||||
|
private static final int SCREENLAYOUT_LAYOUTDIR_MASK = 0xC0;
|
||||||
|
private static final int SCREENLAYOUT_LAYOUTDIR_LTR = 0x40;
|
||||||
|
private static final int SCREENLAYOUT_LAYOUTDIR_RTL = 0x80;
|
||||||
|
private static final Map<Integer, String> SCREENLAYOUT_LAYOUTDIR_VALUES = ImmutableMap.of(
|
||||||
|
SCREENLAYOUT_LAYOUTDIR_LTR, "ldltr",
|
||||||
|
SCREENLAYOUT_LAYOUTDIR_RTL, "ldrtl");
|
||||||
|
private static final int SCREENLAYOUT_LONG_MASK = 0x30;
|
||||||
|
private static final int SCREENLAYOUT_LONG_NO = 0x10;
|
||||||
|
private static final int SCREENLAYOUT_LONG_YES = 0x20;
|
||||||
|
private static final Map<Integer, String> SCREENLAYOUT_LONG_VALUES = ImmutableMap.of(
|
||||||
|
SCREENLAYOUT_LONG_NO, "notlong",
|
||||||
|
SCREENLAYOUT_LONG_YES, "long");
|
||||||
|
private static final int SCREENLAYOUT_ROUND_MASK = 0x03;
|
||||||
|
private static final int SCREENLAYOUT_ROUND_NO = 0x01;
|
||||||
|
private static final int SCREENLAYOUT_ROUND_YES = 0x02;
|
||||||
|
private static final Map<Integer, String> SCREENLAYOUT_ROUND_VALUES = ImmutableMap.of(
|
||||||
|
SCREENLAYOUT_ROUND_NO, "notround",
|
||||||
|
SCREENLAYOUT_ROUND_YES, "round");
|
||||||
|
private static final int SCREENLAYOUT_SIZE_MASK = 0x0F;
|
||||||
|
private static final int SCREENLAYOUT_SIZE_SMALL = 0x01;
|
||||||
|
private static final int SCREENLAYOUT_SIZE_NORMAL = 0x02;
|
||||||
|
private static final int SCREENLAYOUT_SIZE_LARGE = 0x03;
|
||||||
|
private static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;
|
||||||
|
private static final Map<Integer, String> SCREENLAYOUT_SIZE_VALUES = ImmutableMap.of(
|
||||||
|
SCREENLAYOUT_SIZE_SMALL, "small",
|
||||||
|
SCREENLAYOUT_SIZE_NORMAL, "normal",
|
||||||
|
SCREENLAYOUT_SIZE_LARGE, "large",
|
||||||
|
SCREENLAYOUT_SIZE_XLARGE, "xlarge");
|
||||||
|
private static final int TOUCHSCREEN_NOTOUCH = 1;
|
||||||
|
private static final int TOUCHSCREEN_FINGER = 3;
|
||||||
|
private static final Map<Integer, String> TOUCHSCREEN_VALUES = ImmutableMap.of(
|
||||||
|
TOUCHSCREEN_NOTOUCH, "notouch",
|
||||||
|
TOUCHSCREEN_FINGER, "finger");
|
||||||
|
private static final int UI_MODE_NIGHT_MASK = 0x30;
|
||||||
|
private static final int UI_MODE_NIGHT_NO = 0x10;
|
||||||
|
private static final int UI_MODE_NIGHT_YES = 0x20;
|
||||||
|
private static final Map<Integer, String> UI_MODE_NIGHT_VALUES = ImmutableMap.of(
|
||||||
|
UI_MODE_NIGHT_NO, "notnight",
|
||||||
|
UI_MODE_NIGHT_YES, "night");
|
||||||
|
private static final int UI_MODE_TYPE_MASK = 0x0F;
|
||||||
|
private static final int UI_MODE_TYPE_DESK = 0x02;
|
||||||
|
private static final int UI_MODE_TYPE_CAR = 0x03;
|
||||||
|
private static final int UI_MODE_TYPE_TELEVISION = 0x04;
|
||||||
|
private static final int UI_MODE_TYPE_APPLIANCE = 0x05;
|
||||||
|
private static final int UI_MODE_TYPE_WATCH = 0x06;
|
||||||
|
private static final int UI_MODE_TYPE_VR_HEADSET = 0x07;
|
||||||
|
// start - miui
|
||||||
|
private static final int UI_MODE_TYPE_GODZILLAUI = 0x0b;
|
||||||
|
private static final int UI_MODE_TYPE_SMALLUI = 0x0c;
|
||||||
|
private static final int UI_MODE_TYPE_MEDIUMUI = 0x0d;
|
||||||
|
private static final int UI_MODE_TYPE_LARGEUI = 0x0e;
|
||||||
|
private static final int UI_MODE_TYPE_HUGEUI = 0x0f;
|
||||||
|
private static final Map<Integer, String> UI_MODE_TYPE_VALUES =
|
||||||
|
ImmutableMap.<Integer, String>builder()
|
||||||
|
.put(UI_MODE_TYPE_DESK, "desk")
|
||||||
|
.put(UI_MODE_TYPE_CAR, "car")
|
||||||
|
.put(UI_MODE_TYPE_TELEVISION, "television")
|
||||||
|
.put(UI_MODE_TYPE_APPLIANCE, "appliance")
|
||||||
|
.put(UI_MODE_TYPE_WATCH, "watch")
|
||||||
|
.put(UI_MODE_TYPE_VR_HEADSET, "vrheadset")
|
||||||
|
.put(UI_MODE_TYPE_GODZILLAUI, "godzillaui")
|
||||||
|
.put(UI_MODE_TYPE_SMALLUI, "smallui")
|
||||||
|
.put(UI_MODE_TYPE_MEDIUMUI, "mediumui")
|
||||||
|
.put(UI_MODE_TYPE_LARGEUI, "largeui")
|
||||||
|
.put(UI_MODE_TYPE_HUGEUI, "hugeui").build();
|
||||||
|
/**
|
||||||
|
* The minimum size in bytes that this configuration must be to contain screen config info.
|
||||||
|
*/
|
||||||
|
private static final int SCREEN_CONFIG_MIN_SIZE = 32;
|
||||||
|
/**
|
||||||
|
* The minimum size in bytes that this configuration must be to contain screen dp info.
|
||||||
|
*/
|
||||||
|
private static final int SCREEN_DP_MIN_SIZE = 36;
|
||||||
|
/**
|
||||||
|
* The minimum size in bytes that this configuration must be to contain locale info.
|
||||||
|
*/
|
||||||
|
private static final int LOCALE_MIN_SIZE = 48;
|
||||||
|
/**
|
||||||
|
* The minimum size in bytes that this config must be to contain the screenConfig extension.
|
||||||
|
*/
|
||||||
|
private static final int SCREEN_CONFIG_EXTENSION_MIN_SIZE = 52;
|
||||||
private final int size;
|
private final int size;
|
||||||
private final int mcc;
|
private final int mcc;
|
||||||
private final int mnc;
|
private final int mnc;
|
||||||
@@ -53,9 +195,60 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
|||||||
private final int screenHeightDp;
|
private final int screenHeightDp;
|
||||||
private final byte[] localeScript;
|
private final byte[] localeScript;
|
||||||
private final byte[] localeVariant;
|
private final byte[] localeVariant;
|
||||||
|
// end - miui
|
||||||
private final int screenLayout2;
|
private final int screenLayout2;
|
||||||
private final byte[] unknown;
|
private final byte[] unknown;
|
||||||
|
|
||||||
|
private BinaryResourceConfiguration(int size,
|
||||||
|
int mcc,
|
||||||
|
int mnc,
|
||||||
|
byte[] language,
|
||||||
|
byte[] region,
|
||||||
|
int orientation,
|
||||||
|
int touchscreen,
|
||||||
|
int density,
|
||||||
|
int keyboard,
|
||||||
|
int navigation,
|
||||||
|
int inputFlags,
|
||||||
|
int screenWidth,
|
||||||
|
int screenHeight,
|
||||||
|
int sdkVersion,
|
||||||
|
int minorVersion,
|
||||||
|
int screenLayout,
|
||||||
|
int uiMode,
|
||||||
|
int smallestScreenWidthDp,
|
||||||
|
int screenWidthDp,
|
||||||
|
int screenHeightDp,
|
||||||
|
byte[] localeScript,
|
||||||
|
byte[] localeVariant,
|
||||||
|
int screenLayout2,
|
||||||
|
byte[] unknown) {
|
||||||
|
this.size = size;
|
||||||
|
this.mcc = mcc;
|
||||||
|
this.mnc = mnc;
|
||||||
|
this.language = language;
|
||||||
|
this.region = region;
|
||||||
|
this.orientation = orientation;
|
||||||
|
this.touchscreen = touchscreen;
|
||||||
|
this.density = density;
|
||||||
|
this.keyboard = keyboard;
|
||||||
|
this.navigation = navigation;
|
||||||
|
this.inputFlags = inputFlags;
|
||||||
|
this.screenWidth = screenWidth;
|
||||||
|
this.screenHeight = screenHeight;
|
||||||
|
this.sdkVersion = sdkVersion;
|
||||||
|
this.minorVersion = minorVersion;
|
||||||
|
this.screenLayout = screenLayout;
|
||||||
|
this.uiMode = uiMode;
|
||||||
|
this.smallestScreenWidthDp = smallestScreenWidthDp;
|
||||||
|
this.screenWidthDp = screenWidthDp;
|
||||||
|
this.screenHeightDp = screenHeightDp;
|
||||||
|
this.localeScript = localeScript;
|
||||||
|
this.localeVariant = localeVariant;
|
||||||
|
this.screenLayout2 = screenLayout2;
|
||||||
|
this.unknown = unknown;
|
||||||
|
}
|
||||||
|
|
||||||
static BinaryResourceConfiguration create(ByteBuffer buffer) {
|
static BinaryResourceConfiguration create(ByteBuffer buffer) {
|
||||||
int startPosition = buffer.position(); // The starting buffer position to calculate bytes read.
|
int startPosition = buffer.position(); // The starting buffer position to calculate bytes read.
|
||||||
int size = buffer.getInt();
|
int size = buffer.getInt();
|
||||||
@@ -121,245 +314,6 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
|||||||
screenHeightDp, localeScript, localeVariant, screenLayout2, unknown);
|
screenHeightDp, localeScript, localeVariant, screenLayout2, unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BinaryResourceConfiguration(int size,
|
|
||||||
int mcc,
|
|
||||||
int mnc,
|
|
||||||
byte[] language,
|
|
||||||
byte[] region,
|
|
||||||
int orientation,
|
|
||||||
int touchscreen,
|
|
||||||
int density,
|
|
||||||
int keyboard,
|
|
||||||
int navigation,
|
|
||||||
int inputFlags,
|
|
||||||
int screenWidth,
|
|
||||||
int screenHeight,
|
|
||||||
int sdkVersion,
|
|
||||||
int minorVersion,
|
|
||||||
int screenLayout,
|
|
||||||
int uiMode,
|
|
||||||
int smallestScreenWidthDp,
|
|
||||||
int screenWidthDp,
|
|
||||||
int screenHeightDp,
|
|
||||||
byte[] localeScript,
|
|
||||||
byte[] localeVariant,
|
|
||||||
int screenLayout2,
|
|
||||||
byte[] unknown) {
|
|
||||||
this.size = size;
|
|
||||||
this.mcc = mcc;
|
|
||||||
this.mnc = mnc;
|
|
||||||
this.language = language;
|
|
||||||
this.region = region;
|
|
||||||
this.orientation = orientation;
|
|
||||||
this.touchscreen = touchscreen;
|
|
||||||
this.density = density;
|
|
||||||
this.keyboard = keyboard;
|
|
||||||
this.navigation = navigation;
|
|
||||||
this.inputFlags = inputFlags;
|
|
||||||
this.screenWidth = screenWidth;
|
|
||||||
this.screenHeight = screenHeight;
|
|
||||||
this.sdkVersion = sdkVersion;
|
|
||||||
this.minorVersion = minorVersion;
|
|
||||||
this.screenLayout = screenLayout;
|
|
||||||
this.uiMode = uiMode;
|
|
||||||
this.smallestScreenWidthDp = smallestScreenWidthDp;
|
|
||||||
this.screenWidthDp = screenWidthDp;
|
|
||||||
this.screenHeightDp = screenHeightDp;
|
|
||||||
this.localeScript = localeScript;
|
|
||||||
this.localeVariant = localeVariant;
|
|
||||||
this.screenLayout2 = screenLayout2;
|
|
||||||
this.unknown = unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The different types of configs that can be present in a {@link BinaryResourceConfiguration}.
|
|
||||||
*/
|
|
||||||
public enum Type {
|
|
||||||
MCC,
|
|
||||||
MNC,
|
|
||||||
LANGUAGE_STRING,
|
|
||||||
REGION_STRING,
|
|
||||||
SCREEN_LAYOUT_DIRECTION,
|
|
||||||
SMALLEST_SCREEN_WIDTH_DP,
|
|
||||||
SCREEN_WIDTH_DP,
|
|
||||||
SCREEN_HEIGHT_DP,
|
|
||||||
SCREEN_LAYOUT_SIZE,
|
|
||||||
SCREEN_LAYOUT_LONG,
|
|
||||||
SCREEN_LAYOUT_ROUND,
|
|
||||||
ORIENTATION,
|
|
||||||
UI_MODE_TYPE,
|
|
||||||
UI_MODE_NIGHT,
|
|
||||||
DENSITY_DPI,
|
|
||||||
TOUCHSCREEN,
|
|
||||||
KEYBOARD_HIDDEN,
|
|
||||||
KEYBOARD,
|
|
||||||
NAVIGATION_HIDDEN,
|
|
||||||
NAVIGATION,
|
|
||||||
SDK_VERSION
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The below constants are from android.content.res.Configuration.
|
|
||||||
*/
|
|
||||||
private static final int DENSITY_DPI_UNDEFINED = 0;
|
|
||||||
private static final int DENSITY_DPI_LDPI = 120;
|
|
||||||
private static final int DENSITY_DPI_MDPI = 160;
|
|
||||||
private static final int DENSITY_DPI_TVDPI = 213;
|
|
||||||
private static final int DENSITY_DPI_HDPI = 240;
|
|
||||||
private static final int DENSITY_DPI_XHDPI = 320;
|
|
||||||
private static final int DENSITY_DPI_XXHDPI = 480;
|
|
||||||
private static final int DENSITY_DPI_XXXHDPI = 640;
|
|
||||||
private static final int DENSITY_DPI_ANY = 0xFFFE;
|
|
||||||
private static final int DENSITY_DPI_NONE = 0xFFFF;
|
|
||||||
private static final Map<Integer, String> DENSITY_DPI_VALUES =
|
|
||||||
ImmutableMap.<Integer, String>builder()
|
|
||||||
.put(DENSITY_DPI_UNDEFINED, "")
|
|
||||||
.put(DENSITY_DPI_LDPI, "ldpi")
|
|
||||||
.put(DENSITY_DPI_MDPI, "mdpi")
|
|
||||||
.put(DENSITY_DPI_TVDPI, "tvdpi")
|
|
||||||
.put(DENSITY_DPI_HDPI, "hdpi")
|
|
||||||
.put(DENSITY_DPI_XHDPI, "xhdpi")
|
|
||||||
.put(DENSITY_DPI_XXHDPI, "xxhdpi")
|
|
||||||
.put(DENSITY_DPI_XXXHDPI, "xxxhdpi")
|
|
||||||
.put(DENSITY_DPI_ANY, "anydpi")
|
|
||||||
.put(DENSITY_DPI_NONE, "nodpi")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
private static final int KEYBOARD_NOKEYS = 1;
|
|
||||||
private static final int KEYBOARD_QWERTY = 2;
|
|
||||||
private static final int KEYBOARD_12KEY = 3;
|
|
||||||
private static final Map<Integer, String> KEYBOARD_VALUES = ImmutableMap.of(
|
|
||||||
KEYBOARD_NOKEYS, "nokeys",
|
|
||||||
KEYBOARD_QWERTY, "qwerty",
|
|
||||||
KEYBOARD_12KEY, "12key");
|
|
||||||
|
|
||||||
private static final int KEYBOARDHIDDEN_MASK = 0x03;
|
|
||||||
private static final int KEYBOARDHIDDEN_NO = 1;
|
|
||||||
private static final int KEYBOARDHIDDEN_YES = 2;
|
|
||||||
private static final int KEYBOARDHIDDEN_SOFT = 3;
|
|
||||||
private static final Map<Integer, String> KEYBOARDHIDDEN_VALUES = ImmutableMap.of(
|
|
||||||
KEYBOARDHIDDEN_NO, "keysexposed",
|
|
||||||
KEYBOARDHIDDEN_YES, "keyshidden",
|
|
||||||
KEYBOARDHIDDEN_SOFT, "keyssoft");
|
|
||||||
|
|
||||||
private static final int NAVIGATION_NONAV = 1;
|
|
||||||
private static final int NAVIGATION_DPAD = 2;
|
|
||||||
private static final int NAVIGATION_TRACKBALL = 3;
|
|
||||||
private static final int NAVIGATION_WHEEL = 4;
|
|
||||||
private static final Map<Integer, String> NAVIGATION_VALUES = ImmutableMap.of(
|
|
||||||
NAVIGATION_NONAV, "nonav",
|
|
||||||
NAVIGATION_DPAD, "dpad",
|
|
||||||
NAVIGATION_TRACKBALL, "trackball",
|
|
||||||
NAVIGATION_WHEEL, "wheel");
|
|
||||||
|
|
||||||
private static final int NAVIGATIONHIDDEN_MASK = 0x0C;
|
|
||||||
private static final int NAVIGATIONHIDDEN_NO = 0x04;
|
|
||||||
private static final int NAVIGATIONHIDDEN_YES = 0x08;
|
|
||||||
private static final Map<Integer, String> NAVIGATIONHIDDEN_VALUES = ImmutableMap.of(
|
|
||||||
NAVIGATIONHIDDEN_NO, "navexposed",
|
|
||||||
NAVIGATIONHIDDEN_YES, "navhidden");
|
|
||||||
|
|
||||||
private static final int ORIENTATION_PORTRAIT = 0x01;
|
|
||||||
private static final int ORIENTATION_LANDSCAPE = 0x02;
|
|
||||||
private static final Map<Integer, String> ORIENTATION_VALUES = ImmutableMap.of(
|
|
||||||
ORIENTATION_PORTRAIT, "port",
|
|
||||||
ORIENTATION_LANDSCAPE, "land");
|
|
||||||
|
|
||||||
private static final int SCREENLAYOUT_LAYOUTDIR_MASK = 0xC0;
|
|
||||||
private static final int SCREENLAYOUT_LAYOUTDIR_LTR = 0x40;
|
|
||||||
private static final int SCREENLAYOUT_LAYOUTDIR_RTL = 0x80;
|
|
||||||
private static final Map<Integer, String> SCREENLAYOUT_LAYOUTDIR_VALUES = ImmutableMap.of(
|
|
||||||
SCREENLAYOUT_LAYOUTDIR_LTR, "ldltr",
|
|
||||||
SCREENLAYOUT_LAYOUTDIR_RTL, "ldrtl");
|
|
||||||
|
|
||||||
private static final int SCREENLAYOUT_LONG_MASK = 0x30;
|
|
||||||
private static final int SCREENLAYOUT_LONG_NO = 0x10;
|
|
||||||
private static final int SCREENLAYOUT_LONG_YES = 0x20;
|
|
||||||
private static final Map<Integer, String> SCREENLAYOUT_LONG_VALUES = ImmutableMap.of(
|
|
||||||
SCREENLAYOUT_LONG_NO, "notlong",
|
|
||||||
SCREENLAYOUT_LONG_YES, "long");
|
|
||||||
|
|
||||||
private static final int SCREENLAYOUT_ROUND_MASK = 0x03;
|
|
||||||
private static final int SCREENLAYOUT_ROUND_NO = 0x01;
|
|
||||||
private static final int SCREENLAYOUT_ROUND_YES = 0x02;
|
|
||||||
private static final Map<Integer, String> SCREENLAYOUT_ROUND_VALUES = ImmutableMap.of(
|
|
||||||
SCREENLAYOUT_ROUND_NO, "notround",
|
|
||||||
SCREENLAYOUT_ROUND_YES, "round");
|
|
||||||
|
|
||||||
private static final int SCREENLAYOUT_SIZE_MASK = 0x0F;
|
|
||||||
private static final int SCREENLAYOUT_SIZE_SMALL = 0x01;
|
|
||||||
private static final int SCREENLAYOUT_SIZE_NORMAL = 0x02;
|
|
||||||
private static final int SCREENLAYOUT_SIZE_LARGE = 0x03;
|
|
||||||
private static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;
|
|
||||||
private static final Map<Integer, String> SCREENLAYOUT_SIZE_VALUES = ImmutableMap.of(
|
|
||||||
SCREENLAYOUT_SIZE_SMALL, "small",
|
|
||||||
SCREENLAYOUT_SIZE_NORMAL, "normal",
|
|
||||||
SCREENLAYOUT_SIZE_LARGE, "large",
|
|
||||||
SCREENLAYOUT_SIZE_XLARGE, "xlarge");
|
|
||||||
|
|
||||||
private static final int TOUCHSCREEN_NOTOUCH = 1;
|
|
||||||
private static final int TOUCHSCREEN_FINGER = 3;
|
|
||||||
private static final Map<Integer, String> TOUCHSCREEN_VALUES = ImmutableMap.of(
|
|
||||||
TOUCHSCREEN_NOTOUCH, "notouch",
|
|
||||||
TOUCHSCREEN_FINGER, "finger");
|
|
||||||
|
|
||||||
private static final int UI_MODE_NIGHT_MASK = 0x30;
|
|
||||||
private static final int UI_MODE_NIGHT_NO = 0x10;
|
|
||||||
private static final int UI_MODE_NIGHT_YES = 0x20;
|
|
||||||
private static final Map<Integer, String> UI_MODE_NIGHT_VALUES = ImmutableMap.of(
|
|
||||||
UI_MODE_NIGHT_NO, "notnight",
|
|
||||||
UI_MODE_NIGHT_YES, "night");
|
|
||||||
|
|
||||||
private static final int UI_MODE_TYPE_MASK = 0x0F;
|
|
||||||
private static final int UI_MODE_TYPE_DESK = 0x02;
|
|
||||||
private static final int UI_MODE_TYPE_CAR = 0x03;
|
|
||||||
private static final int UI_MODE_TYPE_TELEVISION = 0x04;
|
|
||||||
private static final int UI_MODE_TYPE_APPLIANCE = 0x05;
|
|
||||||
private static final int UI_MODE_TYPE_WATCH = 0x06;
|
|
||||||
private static final int UI_MODE_TYPE_VR_HEADSET = 0x07;
|
|
||||||
|
|
||||||
// start - miui
|
|
||||||
private static final int UI_MODE_TYPE_GODZILLAUI = 0x0b;
|
|
||||||
private static final int UI_MODE_TYPE_SMALLUI = 0x0c;
|
|
||||||
private static final int UI_MODE_TYPE_MEDIUMUI = 0x0d;
|
|
||||||
private static final int UI_MODE_TYPE_LARGEUI = 0x0e;
|
|
||||||
private static final int UI_MODE_TYPE_HUGEUI = 0x0f;
|
|
||||||
// end - miui
|
|
||||||
|
|
||||||
private static final Map<Integer, String> UI_MODE_TYPE_VALUES =
|
|
||||||
ImmutableMap.<Integer, String>builder()
|
|
||||||
.put(UI_MODE_TYPE_DESK, "desk")
|
|
||||||
.put(UI_MODE_TYPE_CAR, "car")
|
|
||||||
.put(UI_MODE_TYPE_TELEVISION, "television")
|
|
||||||
.put(UI_MODE_TYPE_APPLIANCE, "appliance")
|
|
||||||
.put(UI_MODE_TYPE_WATCH, "watch")
|
|
||||||
.put(UI_MODE_TYPE_VR_HEADSET, "vrheadset")
|
|
||||||
.put(UI_MODE_TYPE_GODZILLAUI, "godzillaui")
|
|
||||||
.put(UI_MODE_TYPE_SMALLUI, "smallui")
|
|
||||||
.put(UI_MODE_TYPE_MEDIUMUI, "mediumui")
|
|
||||||
.put(UI_MODE_TYPE_LARGEUI, "largeui")
|
|
||||||
.put(UI_MODE_TYPE_HUGEUI, "hugeui").build();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum size in bytes that this configuration must be to contain screen config info.
|
|
||||||
*/
|
|
||||||
private static final int SCREEN_CONFIG_MIN_SIZE = 32;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum size in bytes that this configuration must be to contain screen dp info.
|
|
||||||
*/
|
|
||||||
private static final int SCREEN_DP_MIN_SIZE = 36;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum size in bytes that this configuration must be to contain locale info.
|
|
||||||
*/
|
|
||||||
private static final int LOCALE_MIN_SIZE = 48;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum size in bytes that this config must be to contain the screenConfig extension.
|
|
||||||
*/
|
|
||||||
private static final int SCREEN_CONFIG_EXTENSION_MIN_SIZE = 52;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The number of bytes that this resource configuration takes up.
|
* The number of bytes that this resource configuration takes up.
|
||||||
*/
|
*/
|
||||||
@@ -708,7 +662,7 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
|||||||
Map<Type, String> result = new LinkedHashMap<>(); // Preserve order for #toString().
|
Map<Type, String> result = new LinkedHashMap<>(); // Preserve order for #toString().
|
||||||
result.put(Type.MCC, mcc() != 0 ? "mcc" + mcc() : "");
|
result.put(Type.MCC, mcc() != 0 ? "mcc" + mcc() : "");
|
||||||
result.put(Type.MNC, mnc() != 0 ? "mnc" + mnc() : "");
|
result.put(Type.MNC, mnc() != 0 ? "mnc" + mnc() : "");
|
||||||
result.put(Type.LANGUAGE_STRING, !languageString().isEmpty() ? "" + languageString() : "");
|
result.put(Type.LANGUAGE_STRING, !languageString().isEmpty() ? languageString() : "");
|
||||||
result.put(Type.REGION_STRING, !regionString().isEmpty() ? "r" + regionString() : "");
|
result.put(Type.REGION_STRING, !regionString().isEmpty() ? "r" + regionString() : "");
|
||||||
result.put(Type.SCREEN_LAYOUT_DIRECTION,
|
result.put(Type.SCREEN_LAYOUT_DIRECTION,
|
||||||
getOrDefault(SCREENLAYOUT_LAYOUTDIR_VALUES, screenLayoutDirection(), ""));
|
getOrDefault(SCREENLAYOUT_LAYOUTDIR_VALUES, screenLayoutDirection(), ""));
|
||||||
@@ -742,4 +696,31 @@ public class BinaryResourceConfiguration implements SerializableResource {
|
|||||||
V value = map.get(key);
|
V value = map.get(key);
|
||||||
return value != null ? value : defaultValue;
|
return value != null ? value : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The different types of configs that can be present in a {@link BinaryResourceConfiguration}.
|
||||||
|
*/
|
||||||
|
public enum Type {
|
||||||
|
MCC,
|
||||||
|
MNC,
|
||||||
|
LANGUAGE_STRING,
|
||||||
|
REGION_STRING,
|
||||||
|
SCREEN_LAYOUT_DIRECTION,
|
||||||
|
SMALLEST_SCREEN_WIDTH_DP,
|
||||||
|
SCREEN_WIDTH_DP,
|
||||||
|
SCREEN_HEIGHT_DP,
|
||||||
|
SCREEN_LAYOUT_SIZE,
|
||||||
|
SCREEN_LAYOUT_LONG,
|
||||||
|
SCREEN_LAYOUT_ROUND,
|
||||||
|
ORIENTATION,
|
||||||
|
UI_MODE_TYPE,
|
||||||
|
UI_MODE_NIGHT,
|
||||||
|
DENSITY_DPI,
|
||||||
|
TOUCHSCREEN,
|
||||||
|
KEYBOARD_HIDDEN,
|
||||||
|
KEYBOARD,
|
||||||
|
NAVIGATION_HIDDEN,
|
||||||
|
NAVIGATION,
|
||||||
|
SDK_VERSION
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -49,6 +49,12 @@ public class BinaryResourceIdentifier {
|
|||||||
private final int typeId;
|
private final int typeId;
|
||||||
private final int entryId;
|
private final int entryId;
|
||||||
|
|
||||||
|
private BinaryResourceIdentifier(int packageId, int typeId, int entryId) {
|
||||||
|
this.packageId = packageId;
|
||||||
|
this.typeId = typeId;
|
||||||
|
this.entryId = entryId;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a {@link BinaryResourceIdentifier} from a {@code resourceId} of the form 0xpptteeee.
|
* Returns a {@link BinaryResourceIdentifier} from a {@code resourceId} of the form 0xpptteeee.
|
||||||
*/
|
*/
|
||||||
@@ -69,12 +75,6 @@ public class BinaryResourceIdentifier {
|
|||||||
return new BinaryResourceIdentifier(packageId, typeId, entryId);
|
return new BinaryResourceIdentifier(packageId, typeId, entryId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BinaryResourceIdentifier(int packageId, int typeId, int entryId) {
|
|
||||||
this.packageId = packageId;
|
|
||||||
this.typeId = typeId;
|
|
||||||
this.entryId = entryId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The (1-based) id of the {@link PackageChunk} containing this resource.
|
* The (1-based) id of the {@link PackageChunk} containing this resource.
|
||||||
*/
|
*/
|
||||||
|
|||||||
+18
-18
@@ -31,24 +31,6 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
|||||||
*/
|
*/
|
||||||
public final class BinaryResourceString {
|
public final class BinaryResourceString {
|
||||||
|
|
||||||
/**
|
|
||||||
* Type of {@link BinaryResourceString} to encode / decode.
|
|
||||||
*/
|
|
||||||
public enum Type {
|
|
||||||
UTF8(UTF_8),
|
|
||||||
UTF16(UTF_16LE);
|
|
||||||
|
|
||||||
private final Charset charset;
|
|
||||||
|
|
||||||
Type(Charset charset) {
|
|
||||||
this.charset = charset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Charset charset() {
|
|
||||||
return charset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private BinaryResourceString() {
|
private BinaryResourceString() {
|
||||||
} // Private constructor
|
} // Private constructor
|
||||||
|
|
||||||
@@ -166,4 +148,22 @@ public final class BinaryResourceString {
|
|||||||
}
|
}
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of {@link BinaryResourceString} to encode / decode.
|
||||||
|
*/
|
||||||
|
public enum Type {
|
||||||
|
UTF8(UTF_8),
|
||||||
|
UTF16(UTF_16LE);
|
||||||
|
|
||||||
|
private final Charset charset;
|
||||||
|
|
||||||
|
Type(Charset charset) {
|
||||||
|
this.charset = charset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Charset charset() {
|
||||||
|
return charset;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+77
-79
@@ -31,6 +31,78 @@ import java.util.Objects;
|
|||||||
*/
|
*/
|
||||||
public class BinaryResourceValue implements SerializableResource {
|
public class BinaryResourceValue implements SerializableResource {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The serialized size in bytes of a {@link BinaryResourceValue}.
|
||||||
|
*/
|
||||||
|
public static final int SIZE = 8;
|
||||||
|
public int size;
|
||||||
|
public Type type;
|
||||||
|
public int data;
|
||||||
|
public BinaryResourceValue(int size, Type type, int data) {
|
||||||
|
this.size = size;
|
||||||
|
this.type = type;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BinaryResourceValue create(ByteBuffer buffer) {
|
||||||
|
int size = (buffer.getShort() & 0xFFFF);
|
||||||
|
buffer.get(); // Unused
|
||||||
|
Type type = Type.fromCode(buffer.get());
|
||||||
|
int data = buffer.getInt();
|
||||||
|
return new BinaryResourceValue(size, type, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The length in bytes of this value.
|
||||||
|
*/
|
||||||
|
public int size() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The raw data type of this value.
|
||||||
|
*/
|
||||||
|
public Type type() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The actual 4-byte value; interpretation of the value depends on {@code dataType}.
|
||||||
|
*/
|
||||||
|
public int data() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
return toByteArray(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] toByteArray(boolean shrink) {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
buffer.putShort((short) size());
|
||||||
|
buffer.put((byte) 0); // Unused
|
||||||
|
buffer.put(type().code());
|
||||||
|
buffer.putInt(data());
|
||||||
|
return buffer.array();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
BinaryResourceValue that = (BinaryResourceValue) o;
|
||||||
|
return size == that.size &&
|
||||||
|
data == that.data &&
|
||||||
|
type == that.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(size, type, data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resource type codes.
|
* Resource type codes.
|
||||||
*/
|
*/
|
||||||
@@ -100,8 +172,6 @@ public class BinaryResourceValue implements SerializableResource {
|
|||||||
*/
|
*/
|
||||||
INT_COLOR_RGB4(0x1f);
|
INT_COLOR_RGB4(0x1f);
|
||||||
|
|
||||||
private final byte code;
|
|
||||||
|
|
||||||
private static final Map<Byte, Type> FROM_BYTE;
|
private static final Map<Byte, Type> FROM_BYTE;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@@ -112,90 +182,18 @@ public class BinaryResourceValue implements SerializableResource {
|
|||||||
FROM_BYTE = builder.build();
|
FROM_BYTE = builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final byte code;
|
||||||
|
|
||||||
Type(int code) {
|
Type(int code) {
|
||||||
this.code = UnsignedBytes.checkedCast(code);
|
this.code = UnsignedBytes.checkedCast(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte code() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Type fromCode(byte code) {
|
public static Type fromCode(byte code) {
|
||||||
return Preconditions.checkNotNull(FROM_BYTE.get(code), "Unknown resource type: %s", code);
|
return Preconditions.checkNotNull(FROM_BYTE.get(code), "Unknown resource type: %s", code);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
public byte code() {
|
||||||
* The serialized size in bytes of a {@link BinaryResourceValue}.
|
return code;
|
||||||
*/
|
}
|
||||||
public static final int SIZE = 8;
|
|
||||||
|
|
||||||
public int size;
|
|
||||||
public Type type;
|
|
||||||
public int data;
|
|
||||||
|
|
||||||
public static BinaryResourceValue create(ByteBuffer buffer) {
|
|
||||||
int size = (buffer.getShort() & 0xFFFF);
|
|
||||||
buffer.get(); // Unused
|
|
||||||
Type type = Type.fromCode(buffer.get());
|
|
||||||
int data = buffer.getInt();
|
|
||||||
return new BinaryResourceValue(size, type, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BinaryResourceValue(int size, Type type, int data) {
|
|
||||||
this.size = size;
|
|
||||||
this.type = type;
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The length in bytes of this value.
|
|
||||||
*/
|
|
||||||
public int size() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The raw data type of this value.
|
|
||||||
*/
|
|
||||||
public Type type() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The actual 4-byte value; interpretation of the value depends on {@code dataType}.
|
|
||||||
*/
|
|
||||||
public int data() {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] toByteArray() {
|
|
||||||
return toByteArray(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] toByteArray(boolean shrink) {
|
|
||||||
ByteBuffer buffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN);
|
|
||||||
buffer.putShort((short) size());
|
|
||||||
buffer.put((byte) 0); // Unused
|
|
||||||
buffer.put(type().code());
|
|
||||||
buffer.putInt(data());
|
|
||||||
return buffer.array();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
BinaryResourceValue that = (BinaryResourceValue) o;
|
|
||||||
return size == that.size &&
|
|
||||||
data == that.data &&
|
|
||||||
type == that.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(size, type, data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,86 +35,36 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public abstract class Chunk implements SerializableResource {
|
public abstract class Chunk implements SerializableResource {
|
||||||
|
|
||||||
/**
|
|
||||||
* Types of chunks that can exist.
|
|
||||||
*/
|
|
||||||
public enum Type {
|
|
||||||
NULL(0x0000),
|
|
||||||
STRING_POOL(0x0001),
|
|
||||||
TABLE(0x0002),
|
|
||||||
XML(0x0003),
|
|
||||||
XML_START_NAMESPACE(0x0100),
|
|
||||||
XML_END_NAMESPACE(0x0101),
|
|
||||||
XML_START_ELEMENT(0x0102),
|
|
||||||
XML_END_ELEMENT(0x0103),
|
|
||||||
XML_CDATA(0x0104),
|
|
||||||
XML_RESOURCE_MAP(0x0180),
|
|
||||||
TABLE_PACKAGE(0x0200),
|
|
||||||
TABLE_TYPE(0x0201),
|
|
||||||
TABLE_TYPE_SPEC(0x0202),
|
|
||||||
TABLE_LIBRARY(0x0203);
|
|
||||||
|
|
||||||
private final short code;
|
|
||||||
|
|
||||||
private static final Map<Short, Type> FROM_SHORT;
|
|
||||||
|
|
||||||
static {
|
|
||||||
Builder<Short, Type> builder = ImmutableMap.builder();
|
|
||||||
for (Type type : values()) {
|
|
||||||
builder.put(type.code(), type);
|
|
||||||
}
|
|
||||||
FROM_SHORT = builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
Type(int code) {
|
|
||||||
this.code = Shorts.checkedCast(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
public short code() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Type fromCode(short code) {
|
|
||||||
return Preconditions.checkNotNull(FROM_SHORT.get(code), "Unknown chunk type: %s", code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The byte boundary to pad chunks on.
|
* The byte boundary to pad chunks on.
|
||||||
*/
|
*/
|
||||||
public static final int PAD_BOUNDARY = 4;
|
public static final int PAD_BOUNDARY = 4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The number of bytes in every chunk that describes chunk type, header size, and chunk size.
|
* The number of bytes in every chunk that describes chunk type, header size, and chunk size.
|
||||||
*/
|
*/
|
||||||
public static final int METADATA_SIZE = 8;
|
public static final int METADATA_SIZE = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The offset in bytes, from the start of the chunk, where the chunk size can be found.
|
* The offset in bytes, from the start of the chunk, where the chunk size can be found.
|
||||||
*/
|
*/
|
||||||
private static final int CHUNK_SIZE_OFFSET = 4;
|
private static final int CHUNK_SIZE_OFFSET = 4;
|
||||||
|
/**
|
||||||
|
* Size of the chunk header in bytes.
|
||||||
|
*/
|
||||||
|
protected final int headerSize;
|
||||||
|
/**
|
||||||
|
* headerSize + dataSize. The total size of this chunk.
|
||||||
|
*/
|
||||||
|
protected final int chunkSize;
|
||||||
|
/**
|
||||||
|
* Offset of this chunk from the start of the file.
|
||||||
|
*/
|
||||||
|
protected final int offset;
|
||||||
/**
|
/**
|
||||||
* The parent to this chunk, if any.
|
* The parent to this chunk, if any.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
private final Chunk parent;
|
private final Chunk parent;
|
||||||
|
|
||||||
/**
|
|
||||||
* Size of the chunk header in bytes.
|
|
||||||
*/
|
|
||||||
protected final int headerSize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* headerSize + dataSize. The total size of this chunk.
|
|
||||||
*/
|
|
||||||
protected final int chunkSize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Offset of this chunk from the start of the file.
|
|
||||||
*/
|
|
||||||
protected final int offset;
|
|
||||||
|
|
||||||
protected Chunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
protected Chunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
offset = buffer.position() - 2;
|
offset = buffer.position() - 2;
|
||||||
@@ -122,6 +72,74 @@ public abstract class Chunk implements SerializableResource {
|
|||||||
chunkSize = buffer.getInt();
|
chunkSize = buffer.getInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
||||||
|
*
|
||||||
|
* @param buffer A buffer positioned at the start of a chunk.
|
||||||
|
* @return new chunk
|
||||||
|
*/
|
||||||
|
public static Chunk newInstance(ByteBuffer buffer) {
|
||||||
|
return newInstance(buffer, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
||||||
|
*
|
||||||
|
* @param buffer A buffer positioned at the start of a chunk.
|
||||||
|
* @param parent The parent to this chunk (or null if there's no parent).
|
||||||
|
* @return new chunk
|
||||||
|
*/
|
||||||
|
public static Chunk newInstance(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
|
Chunk result;
|
||||||
|
Type type = Type.fromCode(buffer.getShort());
|
||||||
|
switch (type) {
|
||||||
|
case STRING_POOL:
|
||||||
|
result = new StringPoolChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case TABLE:
|
||||||
|
result = new ResourceTableChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML:
|
||||||
|
result = new XmlChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML_START_NAMESPACE:
|
||||||
|
result = new XmlNamespaceStartChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML_END_NAMESPACE:
|
||||||
|
result = new XmlNamespaceEndChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML_START_ELEMENT:
|
||||||
|
result = new XmlStartElementChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML_END_ELEMENT:
|
||||||
|
result = new XmlEndElementChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML_CDATA:
|
||||||
|
result = new XmlCdataChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case XML_RESOURCE_MAP:
|
||||||
|
result = new XmlResourceMapChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case TABLE_PACKAGE:
|
||||||
|
result = new PackageChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case TABLE_TYPE:
|
||||||
|
result = new TypeChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case TABLE_TYPE_SPEC:
|
||||||
|
result = new TypeSpecChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
case TABLE_LIBRARY:
|
||||||
|
result = new LibraryChunk(buffer, parent);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
result = new UnknownChunk(buffer, parent);
|
||||||
|
}
|
||||||
|
result.init(buffer);
|
||||||
|
result.seekToEndOfChunk(buffer);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finishes initialization of a chunk. This should be called immediately after the constructor.
|
* Finishes initialization of a chunk. This should be called immediately after the constructor.
|
||||||
* This is separate from the constructor so that the header of a chunk can be fully initialized
|
* This is separate from the constructor so that the header of a chunk can be fully initialized
|
||||||
@@ -256,70 +274,46 @@ public abstract class Chunk implements SerializableResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
* Types of chunks that can exist.
|
||||||
*
|
|
||||||
* @param buffer A buffer positioned at the start of a chunk.
|
|
||||||
* @return new chunk
|
|
||||||
*/
|
*/
|
||||||
public static Chunk newInstance(ByteBuffer buffer) {
|
public enum Type {
|
||||||
return newInstance(buffer, null);
|
NULL(0x0000),
|
||||||
}
|
STRING_POOL(0x0001),
|
||||||
|
TABLE(0x0002),
|
||||||
|
XML(0x0003),
|
||||||
|
XML_START_NAMESPACE(0x0100),
|
||||||
|
XML_END_NAMESPACE(0x0101),
|
||||||
|
XML_START_ELEMENT(0x0102),
|
||||||
|
XML_END_ELEMENT(0x0103),
|
||||||
|
XML_CDATA(0x0104),
|
||||||
|
XML_RESOURCE_MAP(0x0180),
|
||||||
|
TABLE_PACKAGE(0x0200),
|
||||||
|
TABLE_TYPE(0x0201),
|
||||||
|
TABLE_TYPE_SPEC(0x0202),
|
||||||
|
TABLE_LIBRARY(0x0203);
|
||||||
|
|
||||||
/**
|
private static final Map<Short, Type> FROM_SHORT;
|
||||||
* Creates a new chunk whose contents start at {@code buffer}'s current position.
|
|
||||||
*
|
static {
|
||||||
* @param buffer A buffer positioned at the start of a chunk.
|
Builder<Short, Type> builder = ImmutableMap.builder();
|
||||||
* @param parent The parent to this chunk (or null if there's no parent).
|
for (Type type : values()) {
|
||||||
* @return new chunk
|
builder.put(type.code(), type);
|
||||||
*/
|
}
|
||||||
public static Chunk newInstance(ByteBuffer buffer, @Nullable Chunk parent) {
|
FROM_SHORT = builder.build();
|
||||||
Chunk result;
|
}
|
||||||
Type type = Type.fromCode(buffer.getShort());
|
|
||||||
switch (type) {
|
private final short code;
|
||||||
case STRING_POOL:
|
|
||||||
result = new StringPoolChunk(buffer, parent);
|
Type(int code) {
|
||||||
break;
|
this.code = Shorts.checkedCast(code);
|
||||||
case TABLE:
|
}
|
||||||
result = new ResourceTableChunk(buffer, parent);
|
|
||||||
break;
|
public static Type fromCode(short code) {
|
||||||
case XML:
|
return Preconditions.checkNotNull(FROM_SHORT.get(code), "Unknown chunk type: %s", code);
|
||||||
result = new XmlChunk(buffer, parent);
|
}
|
||||||
break;
|
|
||||||
case XML_START_NAMESPACE:
|
public short code() {
|
||||||
result = new XmlNamespaceStartChunk(buffer, parent);
|
return code;
|
||||||
break;
|
|
||||||
case XML_END_NAMESPACE:
|
|
||||||
result = new XmlNamespaceEndChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case XML_START_ELEMENT:
|
|
||||||
result = new XmlStartElementChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case XML_END_ELEMENT:
|
|
||||||
result = new XmlEndElementChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case XML_CDATA:
|
|
||||||
result = new XmlCdataChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case XML_RESOURCE_MAP:
|
|
||||||
result = new XmlResourceMapChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case TABLE_PACKAGE:
|
|
||||||
result = new PackageChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case TABLE_TYPE:
|
|
||||||
result = new TypeChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case TABLE_TYPE_SPEC:
|
|
||||||
result = new TypeSpecChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
case TABLE_LIBRARY:
|
|
||||||
result = new LibraryChunk(buffer, parent);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
result = new UnknownChunk(buffer, parent);
|
|
||||||
}
|
}
|
||||||
result.init(buffer);
|
|
||||||
result.seekToEndOfChunk(buffer);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public final class LibraryChunk extends Chunk {
|
|||||||
*/
|
*/
|
||||||
private final List<Entry> entries = new ArrayList<>();
|
private final List<Entry> entries = new ArrayList<>();
|
||||||
|
|
||||||
protected LibraryChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
LibraryChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
entryCount = buffer.getInt();
|
entryCount = buffer.getInt();
|
||||||
}
|
}
|
||||||
@@ -98,17 +98,17 @@ public final class LibraryChunk extends Chunk {
|
|||||||
private final int packageId;
|
private final int packageId;
|
||||||
private final String packageName;
|
private final String packageName;
|
||||||
|
|
||||||
|
private Entry(int packageId, String packageName) {
|
||||||
|
this.packageId = packageId;
|
||||||
|
this.packageName = packageName;
|
||||||
|
}
|
||||||
|
|
||||||
static Entry create(ByteBuffer buffer, int offset) {
|
static Entry create(ByteBuffer buffer, int offset) {
|
||||||
int packageId = buffer.getInt(offset);
|
int packageId = buffer.getInt(offset);
|
||||||
String packageName = PackageUtils.readPackageName(buffer, offset + 4);
|
String packageName = PackageUtils.readPackageName(buffer, offset + 4);
|
||||||
return new Entry(packageId, packageName);
|
return new Entry(packageId, packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Entry(int packageId, String packageName) {
|
|
||||||
this.packageId = packageId;
|
|
||||||
this.packageName = packageName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The id assigned to the shared library at build time.
|
* The id assigned to the shared library at build time.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -43,58 +43,48 @@ public final class PackageChunk extends ChunkWithChunks {
|
|||||||
* Offset in bytes, from the start of the chunk, where {@code keyStringsOffset} can be found.
|
* Offset in bytes, from the start of the chunk, where {@code keyStringsOffset} can be found.
|
||||||
*/
|
*/
|
||||||
private static final int KEY_OFFSET_OFFSET = 276;
|
private static final int KEY_OFFSET_OFFSET = 276;
|
||||||
|
|
||||||
/**
|
|
||||||
* The package id if this is a base package, or 0 if not a base package.
|
|
||||||
*/
|
|
||||||
private int id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the package.
|
|
||||||
*/
|
|
||||||
private String packageName;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The offset (from {@code offset}) in the original buffer where type strings start.
|
* The offset (from {@code offset}) in the original buffer where type strings start.
|
||||||
*/
|
*/
|
||||||
private final int typeStringsOffset;
|
private final int typeStringsOffset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The index into the type string pool of the last public type.
|
* The index into the type string pool of the last public type.
|
||||||
*/
|
*/
|
||||||
private final int lastPublicType;
|
private final int lastPublicType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An offset to the string pool that contains the key strings for this package.
|
* An offset to the string pool that contains the key strings for this package.
|
||||||
*/
|
*/
|
||||||
private final int keyStringsOffset;
|
private final int keyStringsOffset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The index into the key string pool of the last public key.
|
* The index into the key string pool of the last public key.
|
||||||
*/
|
*/
|
||||||
private final int lastPublicKey;
|
private final int lastPublicKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An offset to the type ID(s). This is undocumented in the original code.
|
* An offset to the type ID(s). This is undocumented in the original code.
|
||||||
*/
|
*/
|
||||||
private final int typeIdOffset;
|
private final int typeIdOffset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains a mapping of a type index to its {@link TypeSpecChunk}.
|
* Contains a mapping of a type index to its {@link TypeSpecChunk}.
|
||||||
*/
|
*/
|
||||||
private final Map<Integer, TypeSpecChunk> typeSpecs = new HashMap<>();
|
private final Map<Integer, TypeSpecChunk> typeSpecs = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains a mapping of a type index to all of the {@link TypeChunk} with that index.
|
* Contains a mapping of a type index to all of the {@link TypeChunk} with that index.
|
||||||
*/
|
*/
|
||||||
private final Multimap<Integer, TypeChunk> types = ArrayListMultimap.create();
|
private final Multimap<Integer, TypeChunk> types = ArrayListMultimap.create();
|
||||||
|
/**
|
||||||
|
* The package id if this is a base package, or 0 if not a base package.
|
||||||
|
*/
|
||||||
|
private int id;
|
||||||
|
/**
|
||||||
|
* The name of the package.
|
||||||
|
*/
|
||||||
|
private String packageName;
|
||||||
/**
|
/**
|
||||||
* May contain a library chunk for mapping dynamic references to resolved references.
|
* May contain a library chunk for mapping dynamic references to resolved references.
|
||||||
*/
|
*/
|
||||||
private Optional<LibraryChunk> libraryChunk = Optional.empty();
|
private Optional<LibraryChunk> libraryChunk = Optional.empty();
|
||||||
|
|
||||||
protected PackageChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
PackageChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
id = buffer.getInt();
|
id = buffer.getInt();
|
||||||
packageName = PackageUtils.readPackageName(buffer, buffer.position());
|
packageName = PackageUtils.readPackageName(buffer, buffer.position());
|
||||||
|
|||||||
@@ -36,17 +36,16 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public final class ResourceTableChunk extends ChunkWithChunks {
|
public final class ResourceTableChunk extends ChunkWithChunks {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The packages contained in this resource table.
|
||||||
|
*/
|
||||||
|
private final Map<String, PackageChunk> packages = new HashMap<>();
|
||||||
/**
|
/**
|
||||||
* A string pool containing all string resource values in the entire resource table.
|
* A string pool containing all string resource values in the entire resource table.
|
||||||
*/
|
*/
|
||||||
private StringPoolChunk stringPool;
|
private StringPoolChunk stringPool;
|
||||||
|
|
||||||
/**
|
ResourceTableChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
* The packages contained in this resource table.
|
|
||||||
*/
|
|
||||||
private final Map<String, PackageChunk> packages = new HashMap<>();
|
|
||||||
|
|
||||||
protected ResourceTableChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
// packageCount. We ignore this, because we already know how many chunks we have.
|
// packageCount. We ignore this, because we already know how many chunks we have.
|
||||||
Preconditions.checkState(buffer.getInt() >= 1, "ResourceTableChunk package count was < 1.");
|
Preconditions.checkState(buffer.getInt() >= 1, "ResourceTableChunk package count was < 1.");
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public final class StringPoolChunk extends Chunk {
|
|||||||
*/
|
*/
|
||||||
private boolean isOriginalDeduped = false;
|
private boolean isOriginalDeduped = false;
|
||||||
|
|
||||||
protected StringPoolChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
StringPoolChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
stringCount = buffer.getInt();
|
stringCount = buffer.getInt();
|
||||||
styleCount = buffer.getInt();
|
styleCount = buffer.getInt();
|
||||||
@@ -310,6 +310,10 @@ public final class StringPoolChunk extends Chunk {
|
|||||||
static final int RES_STRING_POOL_SPAN_END = 0xFFFFFFFF;
|
static final int RES_STRING_POOL_SPAN_END = 0xFFFFFFFF;
|
||||||
private final List<StringPoolSpan> spans;
|
private final List<StringPoolSpan> spans;
|
||||||
|
|
||||||
|
private StringPoolStyle(List<StringPoolSpan> spans) {
|
||||||
|
this.spans = spans;
|
||||||
|
}
|
||||||
|
|
||||||
static StringPoolStyle create(ByteBuffer buffer, int offset, StringPoolChunk parent) {
|
static StringPoolStyle create(ByteBuffer buffer, int offset, StringPoolChunk parent) {
|
||||||
Builder<StringPoolSpan> spans = ImmutableList.builder();
|
Builder<StringPoolSpan> spans = ImmutableList.builder();
|
||||||
int nameIndex = buffer.getInt(offset);
|
int nameIndex = buffer.getInt(offset);
|
||||||
@@ -321,10 +325,6 @@ public final class StringPoolChunk extends Chunk {
|
|||||||
return new StringPoolStyle(spans.build());
|
return new StringPoolStyle(spans.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
private StringPoolStyle(List<StringPoolSpan> spans) {
|
|
||||||
this.spans = spans;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] toByteArray() throws IOException {
|
public byte[] toByteArray() throws IOException {
|
||||||
return toByteArray(false);
|
return toByteArray(false);
|
||||||
@@ -384,13 +384,6 @@ public final class StringPoolChunk extends Chunk {
|
|||||||
private final int stop;
|
private final int stop;
|
||||||
private final StringPoolChunk parent;
|
private final StringPoolChunk parent;
|
||||||
|
|
||||||
static StringPoolSpan create(ByteBuffer buffer, int offset, StringPoolChunk parent) {
|
|
||||||
int nameIndex = buffer.getInt(offset);
|
|
||||||
int start = buffer.getInt(offset + 4);
|
|
||||||
int stop = buffer.getInt(offset + 8);
|
|
||||||
return new StringPoolSpan(nameIndex, start, stop, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private StringPoolSpan(int nameIndex, int start, int stop, StringPoolChunk parent) {
|
private StringPoolSpan(int nameIndex, int start, int stop, StringPoolChunk parent) {
|
||||||
this.nameIndex = nameIndex;
|
this.nameIndex = nameIndex;
|
||||||
this.start = start;
|
this.start = start;
|
||||||
@@ -398,6 +391,13 @@ public final class StringPoolChunk extends Chunk {
|
|||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static StringPoolSpan create(ByteBuffer buffer, int offset, StringPoolChunk parent) {
|
||||||
|
int nameIndex = buffer.getInt(offset);
|
||||||
|
int start = buffer.getInt(offset + 4);
|
||||||
|
int stop = buffer.getInt(offset + 8);
|
||||||
|
return new StringPoolSpan(nameIndex, start, stop, parent);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final byte[] toByteArray() {
|
public final byte[] toByteArray() {
|
||||||
return toByteArray(false);
|
return toByteArray(false);
|
||||||
|
|||||||
@@ -52,18 +52,16 @@ public final class TypeChunk extends Chunk {
|
|||||||
* The offset (from {@code offset}) in the original buffer where {@code entries} start.
|
* The offset (from {@code offset}) in the original buffer where {@code entries} start.
|
||||||
*/
|
*/
|
||||||
private final int entriesStart;
|
private final int entriesStart;
|
||||||
|
/**
|
||||||
|
* A sparse list of resource entries defined by this chunk.
|
||||||
|
*/
|
||||||
|
private final Map<Integer, Entry> entries = new TreeMap<>();
|
||||||
/**
|
/**
|
||||||
* The resource configuration that these resource entries correspond to.
|
* The resource configuration that these resource entries correspond to.
|
||||||
*/
|
*/
|
||||||
private BinaryResourceConfiguration configuration;
|
private BinaryResourceConfiguration configuration;
|
||||||
|
|
||||||
/**
|
TypeChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
* A sparse list of resource entries defined by this chunk.
|
|
||||||
*/
|
|
||||||
private final Map<Integer, Entry> entries = new TreeMap<>();
|
|
||||||
|
|
||||||
protected TypeChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
id = UnsignedBytes.toInt(buffer.get());
|
id = UnsignedBytes.toInt(buffer.get());
|
||||||
buffer.position(buffer.position() + 3); // Skip 3 bytes for packing
|
buffer.position(buffer.position() + 3); // Skip 3 bytes for packing
|
||||||
@@ -176,13 +174,13 @@ public final class TypeChunk extends Chunk {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getString(int index) {
|
private String getString(int index) {
|
||||||
ResourceTableChunk resourceTable = getResourceTableChunk();
|
ResourceTableChunk resourceTable = getResourceTableChunk();
|
||||||
Preconditions.checkNotNull(resourceTable, "%s has no resource table.", getClass());
|
Preconditions.checkNotNull(resourceTable, "%s has no resource table.", getClass());
|
||||||
return resourceTable.getStringPool().getString(index);
|
return resourceTable.getStringPool().getString(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getKeyName(int index) {
|
private String getKeyName(int index) {
|
||||||
PackageChunk packageChunk = getPackageChunk();
|
PackageChunk packageChunk = getPackageChunk();
|
||||||
Preconditions.checkNotNull(packageChunk, "%s has no parent package.", getClass());
|
Preconditions.checkNotNull(packageChunk, "%s has no parent package.", getClass());
|
||||||
StringPoolChunk keyPool = packageChunk.getKeyStringPool();
|
StringPoolChunk keyPool = packageChunk.getKeyStringPool();
|
||||||
@@ -190,7 +188,7 @@ public final class TypeChunk extends Chunk {
|
|||||||
return keyPool.getString(index);
|
return keyPool.getString(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateKey(int index, String value) {
|
private void updateKey(int index, String value) {
|
||||||
PackageChunk packageChunk = getPackageChunk();
|
PackageChunk packageChunk = getPackageChunk();
|
||||||
Preconditions.checkNotNull(packageChunk, "%s has no parent package.", getClass());
|
Preconditions.checkNotNull(packageChunk, "%s has no parent package.", getClass());
|
||||||
StringPoolChunk keyPool = packageChunk.getKeyStringPool();
|
StringPoolChunk keyPool = packageChunk.getKeyStringPool();
|
||||||
@@ -293,10 +291,10 @@ public final class TypeChunk extends Chunk {
|
|||||||
private final int headerSize;
|
private final int headerSize;
|
||||||
private final int flags;
|
private final int flags;
|
||||||
private final int keyIndex;
|
private final int keyIndex;
|
||||||
private BinaryResourceValue value;
|
|
||||||
private Map<Integer, BinaryResourceValue> values;
|
|
||||||
private final int parentEntry;
|
private final int parentEntry;
|
||||||
private final TypeChunk parent;
|
private final TypeChunk parent;
|
||||||
|
private BinaryResourceValue value;
|
||||||
|
private final Map<Integer, BinaryResourceValue> values;
|
||||||
|
|
||||||
private Entry(int headerSize,
|
private Entry(int headerSize,
|
||||||
int flags,
|
int flags,
|
||||||
@@ -314,6 +312,52 @@ public final class TypeChunk extends Chunk {
|
|||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Entry} whose contents start at the 0-based position in
|
||||||
|
* {@code buffer} given by a 4-byte value read from {@code buffer} and then added to
|
||||||
|
* {@code baseOffset}. If the value read from {@code buffer} is equal to {@link #NO_ENTRY}, then
|
||||||
|
* null is returned as there is no resource at that position.
|
||||||
|
*
|
||||||
|
* <p>Otherwise, this position is parsed and returned as an {@link Entry}.
|
||||||
|
*
|
||||||
|
* @param buffer A buffer positioned at an offset to an {@link Entry}.
|
||||||
|
* @param baseOffset Offset that must be added to the value at {@code buffer}'s position.
|
||||||
|
* @param parent The {@link TypeChunk} that this resource entry belongs to.
|
||||||
|
* @return New {@link Entry} or null if there is no resource at this location.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static Entry create(ByteBuffer buffer, int baseOffset, TypeChunk parent) {
|
||||||
|
int offset = buffer.getInt();
|
||||||
|
if (offset == NO_ENTRY) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int position = buffer.position();
|
||||||
|
buffer.position(baseOffset + offset); // Set buffer position to resource entry start
|
||||||
|
Entry result = newInstance(buffer, parent);
|
||||||
|
buffer.position(position); // Restore buffer position
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static Entry newInstance(ByteBuffer buffer, TypeChunk parent) {
|
||||||
|
int headerSize = buffer.getShort() & 0xFFFF;
|
||||||
|
int flags = buffer.getShort() & 0xFFFF;
|
||||||
|
int keyIndex = buffer.getInt();
|
||||||
|
BinaryResourceValue value = null;
|
||||||
|
Map<Integer, BinaryResourceValue> values = new LinkedHashMap<>();
|
||||||
|
int parentEntry = 0;
|
||||||
|
if ((flags & FLAG_COMPLEX) != 0) {
|
||||||
|
parentEntry = buffer.getInt();
|
||||||
|
int valueCount = buffer.getInt();
|
||||||
|
for (int i = 0; i < valueCount; ++i) {
|
||||||
|
values.put(buffer.getInt(), BinaryResourceValue.create(buffer));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value = BinaryResourceValue.create(buffer);
|
||||||
|
}
|
||||||
|
return new Entry(headerSize, flags, keyIndex, value, values, parentEntry, parent);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of bytes in the header of the {@link Entry}.
|
* Number of bytes in the header of the {@link Entry}.
|
||||||
*/
|
*/
|
||||||
@@ -422,52 +466,6 @@ public final class TypeChunk extends Chunk {
|
|||||||
return (flags() & FLAG_COMPLEX) != 0;
|
return (flags() & FLAG_COMPLEX) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new {@link Entry} whose contents start at the 0-based position in
|
|
||||||
* {@code buffer} given by a 4-byte value read from {@code buffer} and then added to
|
|
||||||
* {@code baseOffset}. If the value read from {@code buffer} is equal to {@link #NO_ENTRY}, then
|
|
||||||
* null is returned as there is no resource at that position.
|
|
||||||
*
|
|
||||||
* <p>Otherwise, this position is parsed and returned as an {@link Entry}.
|
|
||||||
*
|
|
||||||
* @param buffer A buffer positioned at an offset to an {@link Entry}.
|
|
||||||
* @param baseOffset Offset that must be added to the value at {@code buffer}'s position.
|
|
||||||
* @param parent The {@link TypeChunk} that this resource entry belongs to.
|
|
||||||
* @return New {@link Entry} or null if there is no resource at this location.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
public static Entry create(ByteBuffer buffer, int baseOffset, TypeChunk parent) {
|
|
||||||
int offset = buffer.getInt();
|
|
||||||
if (offset == NO_ENTRY) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
int position = buffer.position();
|
|
||||||
buffer.position(baseOffset + offset); // Set buffer position to resource entry start
|
|
||||||
Entry result = newInstance(buffer, parent);
|
|
||||||
buffer.position(position); // Restore buffer position
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static Entry newInstance(ByteBuffer buffer, TypeChunk parent) {
|
|
||||||
int headerSize = buffer.getShort() & 0xFFFF;
|
|
||||||
int flags = buffer.getShort() & 0xFFFF;
|
|
||||||
int keyIndex = buffer.getInt();
|
|
||||||
BinaryResourceValue value = null;
|
|
||||||
Map<Integer, BinaryResourceValue> values = new LinkedHashMap<>();
|
|
||||||
int parentEntry = 0;
|
|
||||||
if ((flags & FLAG_COMPLEX) != 0) {
|
|
||||||
parentEntry = buffer.getInt();
|
|
||||||
int valueCount = buffer.getInt();
|
|
||||||
for (int i = 0; i < valueCount; ++i) {
|
|
||||||
values.put(buffer.getInt(), BinaryResourceValue.create(buffer));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
value = BinaryResourceValue.create(buffer);
|
|
||||||
}
|
|
||||||
return new Entry(headerSize, flags, keyIndex, value, values, parentEntry, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final byte[] toByteArray() {
|
public final byte[] toByteArray() {
|
||||||
return toByteArray(false);
|
return toByteArray(false);
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public final class TypeSpecChunk extends Chunk {
|
|||||||
*/
|
*/
|
||||||
private final int[] resources;
|
private final int[] resources;
|
||||||
|
|
||||||
protected TypeSpecChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
TypeSpecChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
id = UnsignedBytes.toInt(buffer.get());
|
id = UnsignedBytes.toInt(buffer.get());
|
||||||
buffer.position(buffer.position() + 3); // Skip 3 bytes for packing
|
buffer.position(buffer.position() + 3); // Skip 3 bytes for packing
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public final class UnknownChunk extends Chunk {
|
|||||||
|
|
||||||
private final byte[] payload;
|
private final byte[] payload;
|
||||||
|
|
||||||
protected UnknownChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
UnknownChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
|
|
||||||
type = Type.fromCode(buffer.getShort(offset));
|
type = Type.fromCode(buffer.getShort(offset));
|
||||||
|
|||||||
@@ -36,6 +36,18 @@ public class XmlAttribute implements SerializableResource {
|
|||||||
private final BinaryResourceValue typedValue;
|
private final BinaryResourceValue typedValue;
|
||||||
private final XmlNodeChunk parent;
|
private final XmlNodeChunk parent;
|
||||||
|
|
||||||
|
private XmlAttribute(int namespaceIndex,
|
||||||
|
int nameIndex,
|
||||||
|
int rawValueIndex,
|
||||||
|
BinaryResourceValue typedValue,
|
||||||
|
XmlNodeChunk parent) {
|
||||||
|
this.namespaceIndex = namespaceIndex;
|
||||||
|
this.nameIndex = nameIndex;
|
||||||
|
this.rawValueIndex = rawValueIndex;
|
||||||
|
this.typedValue = typedValue;
|
||||||
|
this.parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link XmlAttribute} based on the bytes at the current {@code buffer} position.
|
* Creates a new {@link XmlAttribute} based on the bytes at the current {@code buffer} position.
|
||||||
*
|
*
|
||||||
@@ -50,18 +62,6 @@ public class XmlAttribute implements SerializableResource {
|
|||||||
return new XmlAttribute(namespace, name, rawValue, typedValue, parent);
|
return new XmlAttribute(namespace, name, rawValue, typedValue, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private XmlAttribute(int namespaceIndex,
|
|
||||||
int nameIndex,
|
|
||||||
int rawValueIndex,
|
|
||||||
BinaryResourceValue typedValue,
|
|
||||||
XmlNodeChunk parent) {
|
|
||||||
this.namespaceIndex = namespaceIndex;
|
|
||||||
this.nameIndex = nameIndex;
|
|
||||||
this.rawValueIndex = rawValueIndex;
|
|
||||||
this.typedValue = typedValue;
|
|
||||||
this.parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A string reference to the namespace URI, or -1 if not present.
|
* A string reference to the namespace URI, or -1 if not present.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public final class XmlCdataChunk extends XmlNodeChunk {
|
|||||||
*/
|
*/
|
||||||
private final BinaryResourceValue binaryResourceValue;
|
private final BinaryResourceValue binaryResourceValue;
|
||||||
|
|
||||||
protected XmlCdataChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
XmlCdataChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
rawValue = buffer.getInt();
|
rawValue = buffer.getInt();
|
||||||
binaryResourceValue = BinaryResourceValue.create(buffer);
|
binaryResourceValue = BinaryResourceValue.create(buffer);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import java.nio.ByteBuffer;
|
|||||||
*/
|
*/
|
||||||
public final class XmlChunk extends ChunkWithChunks {
|
public final class XmlChunk extends ChunkWithChunks {
|
||||||
|
|
||||||
protected XmlChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
XmlChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public final class XmlEndElementChunk extends XmlNodeChunk {
|
|||||||
*/
|
*/
|
||||||
private final int name;
|
private final int name;
|
||||||
|
|
||||||
protected XmlEndElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
XmlEndElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
namespace = buffer.getInt();
|
namespace = buffer.getInt();
|
||||||
name = buffer.getInt();
|
name = buffer.getInt();
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ import java.nio.ByteBuffer;
|
|||||||
*/
|
*/
|
||||||
public final class XmlNamespaceEndChunk extends XmlNamespaceChunk {
|
public final class XmlNamespaceEndChunk extends XmlNamespaceChunk {
|
||||||
|
|
||||||
protected XmlNamespaceEndChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
XmlNamespaceEndChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ import java.nio.ByteBuffer;
|
|||||||
*/
|
*/
|
||||||
public final class XmlNamespaceStartChunk extends XmlNamespaceChunk {
|
public final class XmlNamespaceStartChunk extends XmlNamespaceChunk {
|
||||||
|
|
||||||
protected XmlNamespaceStartChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
XmlNamespaceStartChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -71,7 +71,7 @@ public final class XmlStartElementChunk extends XmlNodeChunk {
|
|||||||
*/
|
*/
|
||||||
private final List<XmlAttribute> attributes = new ArrayList<>();
|
private final List<XmlAttribute> attributes = new ArrayList<>();
|
||||||
|
|
||||||
protected XmlStartElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
XmlStartElementChunk(ByteBuffer buffer, @Nullable Chunk parent) {
|
||||||
super(buffer, parent);
|
super(buffer, parent);
|
||||||
namespace = buffer.getInt();
|
namespace = buffer.getInt();
|
||||||
name = buffer.getInt();
|
name = buffer.getInt();
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class AudioGetLyrics extends ApiRequest<AudioGetLyrics.a> {
|
|||||||
public a a(@NonNull JSONObject jSONObject) {
|
public a a(@NonNull JSONObject jSONObject) {
|
||||||
var aVar = new a();
|
var aVar = new a();
|
||||||
|
|
||||||
if (Preferences.getBoolValue("useGenius", false)) {
|
if (Preferences.getBoolValue("useGenius", false) && !Preferences.serverFeaturesDisable()) {
|
||||||
aVar.a = Genius.getTextMusic(musicTrack);
|
aVar.a = Genius.getTextMusic(musicTrack);
|
||||||
return aVar;
|
return aVar;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,6 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
public class GiftGetByStickerId extends ApiRequest<GiftGetByStickerId.a> {
|
public class GiftGetByStickerId extends ApiRequest<GiftGetByStickerId.a> {
|
||||||
public static class a {
|
|
||||||
public final int a;
|
|
||||||
public final CatalogedGift b;
|
|
||||||
|
|
||||||
public a(int i, CatalogedGift catalogedGift) {
|
|
||||||
this.a = i;
|
|
||||||
this.b = catalogedGift;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public GiftGetByStickerId(Context context, int i) {
|
public GiftGetByStickerId(Context context, int i) {
|
||||||
super("execute.getGiftByStickerId");
|
super("execute.getGiftByStickerId");
|
||||||
b("sticker_id", i);
|
b("sticker_id", i);
|
||||||
@@ -30,4 +20,14 @@ public class GiftGetByStickerId extends ApiRequest<GiftGetByStickerId.a> {
|
|||||||
return new a(jSONObject2.optInt("balance"),
|
return new a(jSONObject2.optInt("balance"),
|
||||||
new CatalogedGift(jSONObject2.getJSONObject("gift")));
|
new CatalogedGift(jSONObject2.getJSONObject("gift")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class a {
|
||||||
|
public final int a;
|
||||||
|
public final CatalogedGift b;
|
||||||
|
|
||||||
|
public a(int i, CatalogedGift catalogedGift) {
|
||||||
|
this.a = i;
|
||||||
|
this.b = catalogedGift;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,15 @@ public class RecoloredDrawable extends Drawable implements Drawable.Callback {
|
|||||||
onStateChange(new int[0]);
|
onStateChange(new int[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RecoloredDrawable(Drawable drawable, int i) {
|
||||||
|
this(drawable, new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
||||||
|
}
|
||||||
|
|
||||||
|
public RecoloredDrawable() {
|
||||||
|
this.c = 255;
|
||||||
|
this.d = 255;
|
||||||
|
}
|
||||||
|
|
||||||
public void a(int i) {
|
public void a(int i) {
|
||||||
a(new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
a(new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
||||||
}
|
}
|
||||||
@@ -120,13 +129,4 @@ public class RecoloredDrawable extends Drawable implements Drawable.Callback {
|
|||||||
public Drawable a() {
|
public Drawable a() {
|
||||||
return this.drawable;
|
return this.drawable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RecoloredDrawable(Drawable drawable, int i) {
|
|
||||||
this(drawable, new ColorStateList(new int[][]{new int[0]}, new int[]{i}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public RecoloredDrawable() {
|
|
||||||
this.c = 255;
|
|
||||||
this.d = 255;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,13 @@ public final class VerifyInfoHelper {
|
|||||||
public static final VerifyInfoHelper h;
|
public static final VerifyInfoHelper h;
|
||||||
public static int devIcon = R.drawable.ic_favorite_16;
|
public static int devIcon = R.drawable.ic_favorite_16;
|
||||||
|
|
||||||
|
static {
|
||||||
|
h = new VerifyInfoHelper();
|
||||||
|
}
|
||||||
|
|
||||||
|
private VerifyInfoHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
public static Integer enumSwitchMapping(VerifyInfoHelper.ColorTheme color) {
|
public static Integer enumSwitchMapping(VerifyInfoHelper.ColorTheme color) {
|
||||||
return switch (color) {
|
return switch (color) {
|
||||||
case normal -> 1;
|
case normal -> 1;
|
||||||
@@ -30,18 +37,47 @@ public final class VerifyInfoHelper {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ColorTheme {
|
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||||
white,
|
if ((i & 8) != 0) {
|
||||||
normal,
|
colorTheme = ColorTheme.normal;
|
||||||
light,
|
}
|
||||||
ultraLight
|
return verifyInfoHelper.b(z, z2, dev, context, colorTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
public static Drawable b(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||||
h = new VerifyInfoHelper();
|
return b(verifyInfoHelper, verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme, i, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
private VerifyInfoHelper() {
|
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||||
|
return b(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Drawable a(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||||
|
if ((i & 4) != 0) {
|
||||||
|
colorTheme = ColorTheme.normal;
|
||||||
|
}
|
||||||
|
return verifyInfoHelper.b(verifyInfo, context, colorTheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||||
|
if ((i & 8) != 0) {
|
||||||
|
colorTheme = ColorTheme.normal;
|
||||||
|
}
|
||||||
|
return verifyInfoHelper.a(z, z2, dev, context, colorTheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
||||||
|
return a(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void a(VerifyInfoHelper verifyInfoHelper, TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme, int i, Object obj) {
|
||||||
|
if ((i & 4) != 0) {
|
||||||
|
z = false;
|
||||||
|
}
|
||||||
|
if ((i & 8) != 0) {
|
||||||
|
colorTheme = ColorTheme.normal;
|
||||||
|
}
|
||||||
|
verifyInfoHelper.a(textView, verifyInfo, z, colorTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int a() {
|
private int a() {
|
||||||
@@ -89,7 +125,6 @@ public final class VerifyInfoHelper {
|
|||||||
return b(this, z, z2, false, context, null, 8, null);
|
return b(this, z, z2, false, context, null, 8, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public int b(ColorTheme colorTheme) {
|
public int b(ColorTheme colorTheme) {
|
||||||
return a(colorTheme);
|
return a(colorTheme);
|
||||||
}
|
}
|
||||||
@@ -104,7 +139,6 @@ public final class VerifyInfoHelper {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Drawable b(Context context, VerifyInfo verifyInfo) {
|
public Drawable b(Context context, VerifyInfo verifyInfo) {
|
||||||
if (verifyInfo.dev()) {
|
if (verifyInfo.dev()) {
|
||||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, devIcon), c(ColorTheme.normal));
|
return new RecoloredDrawable(ContextCompat.getDrawable(context, devIcon), c(ColorTheme.normal));
|
||||||
@@ -123,21 +157,6 @@ public final class VerifyInfoHelper {
|
|||||||
return b(verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme);
|
return b(verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
if ((i & 8) != 0) {
|
|
||||||
colorTheme = ColorTheme.normal;
|
|
||||||
}
|
|
||||||
return verifyInfoHelper.b(z, z2, dev, context, colorTheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
return b(verifyInfoHelper, verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme, i, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable b(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
return b(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Drawable a(Context context, VerifyInfo verifyInfo) {
|
public Drawable a(Context context, VerifyInfo verifyInfo) {
|
||||||
if (verifyInfo.dev()) {
|
if (verifyInfo.dev()) {
|
||||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, devIcon), c(ColorTheme.normal));
|
return new RecoloredDrawable(ContextCompat.getDrawable(context, devIcon), c(ColorTheme.normal));
|
||||||
@@ -181,28 +200,10 @@ public final class VerifyInfoHelper {
|
|||||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, i), c2);
|
return new RecoloredDrawable(ContextCompat.getDrawable(context, i), c2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, VerifyInfo verifyInfo, Context context, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
if ((i & 4) != 0) {
|
|
||||||
colorTheme = ColorTheme.normal;
|
|
||||||
}
|
|
||||||
return verifyInfoHelper.b(verifyInfo, context, colorTheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Drawable a(VerifyInfo verifyInfo, Context context, ColorTheme colorTheme) {
|
public Drawable a(VerifyInfo verifyInfo, Context context, ColorTheme colorTheme) {
|
||||||
return a(verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme);
|
return a(verifyInfo.u1(), verifyInfo.t1(), verifyInfo.dev(), context, colorTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, boolean dev, Context context, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
if ((i & 8) != 0) {
|
|
||||||
colorTheme = ColorTheme.normal;
|
|
||||||
}
|
|
||||||
return verifyInfoHelper.a(z, z2, dev, context, colorTheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable a(VerifyInfoHelper verifyInfoHelper, boolean z, boolean z2, Context context, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
return a(verifyInfoHelper, z, z2, false, context, colorTheme, i, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Drawable a(boolean z, boolean z2, Context context, ColorTheme colorTheme) {
|
public Drawable a(boolean z, boolean z2, Context context, ColorTheme colorTheme) {
|
||||||
return a(z, z2, false, context, colorTheme);
|
return a(z, z2, false, context, colorTheme);
|
||||||
}
|
}
|
||||||
@@ -230,16 +231,6 @@ public final class VerifyInfoHelper {
|
|||||||
return new RecoloredDrawable(ContextCompat.getDrawable(context, i), c2);
|
return new RecoloredDrawable(ContextCompat.getDrawable(context, i), c2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void a(VerifyInfoHelper verifyInfoHelper, TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme, int i, Object obj) {
|
|
||||||
if ((i & 4) != 0) {
|
|
||||||
z = false;
|
|
||||||
}
|
|
||||||
if ((i & 8) != 0) {
|
|
||||||
colorTheme = ColorTheme.normal;
|
|
||||||
}
|
|
||||||
verifyInfoHelper.a(textView, verifyInfo, z, colorTheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void a(TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme) {
|
public void a(TextView textView, VerifyInfo verifyInfo, boolean z, ColorTheme colorTheme) {
|
||||||
Drawable drawable;
|
Drawable drawable;
|
||||||
Context context = textView.getContext();
|
Context context = textView.getContext();
|
||||||
@@ -267,4 +258,11 @@ public final class VerifyInfoHelper {
|
|||||||
}
|
}
|
||||||
ViewExtKt.p(imageView);
|
ViewExtKt.p(imageView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ColorTheme {
|
||||||
|
white,
|
||||||
|
normal,
|
||||||
|
light,
|
||||||
|
ultraLight
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+25
-25
@@ -31,30 +31,6 @@ public final class DialogGetMentionSuggestionCmd extends BaseImEngineCmd<Suggest
|
|||||||
private final boolean e;
|
private final boolean e;
|
||||||
private final Object f;
|
private final Object f;
|
||||||
|
|
||||||
public static final class a<T> implements Comparator<Member> {
|
|
||||||
List a;
|
|
||||||
|
|
||||||
a(List list) {
|
|
||||||
this.a = list;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override // java.util.Comparator
|
|
||||||
/* renamed from: a */
|
|
||||||
public int compare(Member member, Member member2) {
|
|
||||||
int indexOf = this.a.indexOf(member);
|
|
||||||
int indexOf2 = this.a.indexOf(member2);
|
|
||||||
int i = indexOf;
|
|
||||||
if (indexOf < 0) {
|
|
||||||
i = Integer.MAX_VALUE;
|
|
||||||
}
|
|
||||||
int i2 = indexOf2;
|
|
||||||
if (indexOf2 < 0) {
|
|
||||||
i2 = Integer.MAX_VALUE;
|
|
||||||
}
|
|
||||||
return Intrinsics.a(i, i2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DialogGetMentionSuggestionCmd(int i, String str, Source source, boolean z, Object obj) {
|
public DialogGetMentionSuggestionCmd(int i, String str, Source source, boolean z, Object obj) {
|
||||||
this.f2365b = i;
|
this.f2365b = i;
|
||||||
this.c = str;
|
this.c = str;
|
||||||
@@ -150,7 +126,7 @@ public final class DialogGetMentionSuggestionCmd extends BaseImEngineCmd<Suggest
|
|||||||
Collection<Member> a2;
|
Collection<Member> a2;
|
||||||
Source source;
|
Source source;
|
||||||
if (ImDialogsUtils.d(this.f2365b) != PeerType.CHAT) {
|
if (ImDialogsUtils.d(this.f2365b) != PeerType.CHAT) {
|
||||||
return new Suggestion((EntityValue) null, (ProfilesInfo) null);
|
return new Suggestion(null, null);
|
||||||
}
|
}
|
||||||
Member Z = imEnvironment.Z();
|
Member Z = imEnvironment.Z();
|
||||||
int d = imEnvironment.a0().n().d();
|
int d = imEnvironment.a0().n().d();
|
||||||
@@ -235,4 +211,28 @@ public final class DialogGetMentionSuggestionCmd extends BaseImEngineCmd<Suggest
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return "DialogGetMentionSuggestionCmd(dialogId=" + this.f2365b + ", query=" + this.c + ", source=" + this.d + ", isAwaitNetwork=" + this.e + ", changerTag=" + this.f + ")";
|
return "DialogGetMentionSuggestionCmd(dialogId=" + this.f2365b + ", query=" + this.c + ", source=" + this.d + ", isAwaitNetwork=" + this.e + ", changerTag=" + this.f + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final class a<T> implements Comparator<Member> {
|
||||||
|
List a;
|
||||||
|
|
||||||
|
a(List list) {
|
||||||
|
this.a = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // java.util.Comparator
|
||||||
|
/* renamed from: a */
|
||||||
|
public int compare(Member member, Member member2) {
|
||||||
|
int indexOf = this.a.indexOf(member);
|
||||||
|
int indexOf2 = this.a.indexOf(member2);
|
||||||
|
int i = indexOf;
|
||||||
|
if (indexOf < 0) {
|
||||||
|
i = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
int i2 = indexOf2;
|
||||||
|
if (indexOf2 < 0) {
|
||||||
|
i2 = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
return Intrinsics.a(i, i2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -19,7 +19,7 @@ import java.util.List;
|
|||||||
public final class DialogActionsHelper {
|
public final class DialogActionsHelper {
|
||||||
public static final DialogActionsHelper a = new DialogActionsHelper();
|
public static final DialogActionsHelper a = new DialogActionsHelper();
|
||||||
|
|
||||||
public final List<DialogAction> a(ImConfig imConfig, Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
public List<DialogAction> a(ImConfig imConfig, Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
||||||
if (dialog != null && profilesSimpleInfo != null) {
|
if (dialog != null && profilesSimpleInfo != null) {
|
||||||
long b2 = TimeProvider.f.b();
|
long b2 = TimeProvider.f.b();
|
||||||
ChatSettings z1 = dialog.z1();
|
ChatSettings z1 = dialog.z1();
|
||||||
@@ -84,7 +84,7 @@ public final class DialogActionsHelper {
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final List<DialogAction> a(Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
public List<DialogAction> a(Dialog dialog, ProfilesSimpleInfo profilesSimpleInfo) {
|
||||||
long b2 = TimeProvider.f.b();
|
long b2 = TimeProvider.f.b();
|
||||||
Profile profile = profilesSimpleInfo.get(dialog.getId());
|
Profile profile = profilesSimpleInfo.get(dialog.getId());
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ public final class DialogActionsHelper {
|
|||||||
return arrayList;
|
return arrayList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean a(Dialog dialog) {
|
public boolean a(Dialog dialog) {
|
||||||
if (dialog.V1() || !dialog.y1()) {
|
if (dialog.V1() || !dialog.y1()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ import java.util.List;
|
|||||||
public final class MsgActionHelper {
|
public final class MsgActionHelper {
|
||||||
public static final MsgActionHelper a = new MsgActionHelper();
|
public static final MsgActionHelper a = new MsgActionHelper();
|
||||||
|
|
||||||
public final List<MsgAction> a(ImEngine imEngine, Dialog dialog, Collection<? extends Msg> collection) {
|
public List<MsgAction> a(ImEngine imEngine, Dialog dialog, Collection<? extends Msg> collection) {
|
||||||
return a(imEngine != null ? imEngine.g() : null, dialog, collection);
|
return a(imEngine != null ? imEngine.g() : null, dialog, collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final List<MsgAction> a(ImConfig imConfig, Dialog dialog, Collection<? extends Msg> collection) {
|
public List<MsgAction> a(ImConfig imConfig, Dialog dialog, Collection<? extends Msg> collection) {
|
||||||
if (imConfig != null && dialog != null && collection != null) {
|
if (imConfig != null && dialog != null && collection != null) {
|
||||||
MsgPermissionHelper.a aVar = new MsgPermissionHelper.a(imConfig, dialog, collection);
|
MsgPermissionHelper.a aVar = new MsgPermissionHelper.a(imConfig, dialog, collection);
|
||||||
ArrayList<MsgAction> arrayList = new ArrayList<>();
|
ArrayList<MsgAction> arrayList = new ArrayList<>();
|
||||||
|
|||||||
+29
-137
@@ -74,11 +74,7 @@ public class VhBindArgs {
|
|||||||
|
|
||||||
private boolean L() {
|
private boolean L() {
|
||||||
boolean var1;
|
boolean var1;
|
||||||
if (this.K() <= this.m && !TimeProvider.f.c()) {
|
var1 = this.K() > this.m || TimeProvider.f.c();
|
||||||
var1 = false;
|
|
||||||
} else {
|
|
||||||
var1 = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var1;
|
return var1;
|
||||||
}
|
}
|
||||||
@@ -109,11 +105,7 @@ public class VhBindArgs {
|
|||||||
public boolean B() {
|
public boolean B() {
|
||||||
AdapterEntry var1 = this.a;
|
AdapterEntry var1 = this.a;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.c()) {
|
var2 = var1 != null && var1.c();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -121,11 +113,7 @@ public class VhBindArgs {
|
|||||||
public boolean C() {
|
public boolean C() {
|
||||||
AdapterEntry var1 = this.a;
|
AdapterEntry var1 = this.a;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.c() && this.a.c.getLocalId() == this.b.c.getLocalId()) {
|
var2 = var1 != null && var1.c() && this.a.c.getLocalId() == this.b.c.getLocalId();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -133,11 +121,7 @@ public class VhBindArgs {
|
|||||||
public boolean D() {
|
public boolean D() {
|
||||||
AdapterEntry var1 = this.a;
|
AdapterEntry var1 = this.a;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.a == 83) {
|
var2 = var1 != null && var1.a == 83;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -145,11 +129,7 @@ public class VhBindArgs {
|
|||||||
public boolean E() {
|
public boolean E() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).i2()) {
|
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).i2();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -157,11 +137,7 @@ public class VhBindArgs {
|
|||||||
public boolean F() {
|
public boolean F() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).F0()) {
|
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).F0();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -169,11 +145,7 @@ public class VhBindArgs {
|
|||||||
public boolean G() {
|
public boolean G() {
|
||||||
AdapterEntry var1 = this.b;
|
AdapterEntry var1 = this.b;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.a == 51) {
|
var2 = var1 != null && var1.a == 51;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -186,11 +158,7 @@ public class VhBindArgs {
|
|||||||
long var1 = this.K();
|
long var1 = this.K();
|
||||||
long var3 = this.m;
|
long var3 = this.m;
|
||||||
boolean var5;
|
boolean var5;
|
||||||
if (var1 > var3 && var1 < var3 * 2L) {
|
var5 = var1 > var3 && var1 < var3 * 2L;
|
||||||
var5 = true;
|
|
||||||
} else {
|
|
||||||
var5 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var5;
|
return var5;
|
||||||
}
|
}
|
||||||
@@ -206,18 +174,10 @@ public class VhBindArgs {
|
|||||||
MsgFromUser var7 = (MsgFromUser) var1;
|
MsgFromUser var7 = (MsgFromUser) var1;
|
||||||
Msg var3 = this.a.c;
|
Msg var3 = this.a.c;
|
||||||
boolean var4;
|
boolean var4;
|
||||||
if (var3 != null && var3.d() == MsgSyncState.DONE) {
|
var4 = var3 != null && var3.d() == MsgSyncState.DONE;
|
||||||
var4 = true;
|
|
||||||
} else {
|
|
||||||
var4 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean var5;
|
boolean var5;
|
||||||
if (this.o == ImBgSyncState.CONNECTED) {
|
var5 = this.o == ImBgSyncState.CONNECTED;
|
||||||
var5 = true;
|
|
||||||
} else {
|
|
||||||
var5 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean var6 = var2;
|
boolean var6 = var2;
|
||||||
if (!var7.H0()) {
|
if (!var7.H0()) {
|
||||||
@@ -242,7 +202,7 @@ public class VhBindArgs {
|
|||||||
byte var2 = 0;
|
byte var2 = 0;
|
||||||
int var3 = var2;
|
int var3 = var2;
|
||||||
if (var1) {
|
if (var1) {
|
||||||
AttachAudioMsg var4 = (AttachAudioMsg) ((MsgFromUser) this.b.c).c(AttachAudioMsg.class, false);
|
AttachAudioMsg var4 = ((MsgFromUser) this.b.c).c(AttachAudioMsg.class, false);
|
||||||
var3 = var2;
|
var3 = var2;
|
||||||
if (var4 != null) {
|
if (var4 != null) {
|
||||||
var3 = var4.f();
|
var3 = var4.f();
|
||||||
@@ -267,11 +227,7 @@ public class VhBindArgs {
|
|||||||
public boolean c() {
|
public boolean c() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).I0()) {
|
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).I0();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -279,22 +235,14 @@ public class VhBindArgs {
|
|||||||
public boolean d() {
|
public boolean d() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof WithUserContent && ((WithUserContent) var1).D0() != null) {
|
var2 = var1 instanceof WithUserContent && ((WithUserContent) var1).D0() != null;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean e() {
|
public boolean e() {
|
||||||
boolean var1;
|
boolean var1;
|
||||||
if (this.b.i > 0) {
|
var1 = this.b.i > 0;
|
||||||
var1 = true;
|
|
||||||
} else {
|
|
||||||
var1 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var1;
|
return var1;
|
||||||
}
|
}
|
||||||
@@ -317,11 +265,7 @@ public class VhBindArgs {
|
|||||||
public boolean g() {
|
public boolean g() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).G0()) {
|
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).G0();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -329,33 +273,21 @@ public class VhBindArgs {
|
|||||||
public boolean h() {
|
public boolean h() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).Z1()) {
|
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).Z1();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean i() {
|
public boolean i() {
|
||||||
boolean var1;
|
boolean var1;
|
||||||
if (this.j && !this.u() && !this.l()) {
|
var1 = this.j && !this.u() && !this.l();
|
||||||
var1 = true;
|
|
||||||
} else {
|
|
||||||
var1 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var1;
|
return var1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean j() {
|
public boolean j() {
|
||||||
boolean var1;
|
boolean var1;
|
||||||
if (!this.j || this.u() || this.B() && this.A() && !this.a.c.H1()) {
|
var1 = this.j && !this.u() && (!this.B() || !this.A() || this.a.c.H1());
|
||||||
var1 = false;
|
|
||||||
} else {
|
|
||||||
var1 = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var1;
|
return var1;
|
||||||
}
|
}
|
||||||
@@ -363,11 +295,7 @@ public class VhBindArgs {
|
|||||||
public boolean k() {
|
public boolean k() {
|
||||||
Dialog var1 = this.e;
|
Dialog var1 = this.e;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.U1()) {
|
var2 = var1 != null && var1.U1();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -375,11 +303,7 @@ public class VhBindArgs {
|
|||||||
public boolean l() {
|
public boolean l() {
|
||||||
Dialog var1 = this.e;
|
Dialog var1 = this.e;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.V1()) {
|
var2 = var1 != null && var1.V1();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -387,11 +311,7 @@ public class VhBindArgs {
|
|||||||
public boolean m() {
|
public boolean m() {
|
||||||
Dialog var1 = this.e;
|
Dialog var1 = this.e;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.W1()) {
|
var2 = var1 != null && var1.W1();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -404,11 +324,7 @@ public class VhBindArgs {
|
|||||||
public boolean o() {
|
public boolean o() {
|
||||||
AdapterEntry var1 = this.b;
|
AdapterEntry var1 = this.b;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.a == 101) {
|
var2 = var1 != null && var1.a == 101;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -416,11 +332,7 @@ public class VhBindArgs {
|
|||||||
public boolean p() {
|
public boolean p() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.G1()) {
|
var2 = var1 != null && var1.G1();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -443,11 +355,7 @@ public class VhBindArgs {
|
|||||||
public boolean r() {
|
public boolean r() {
|
||||||
Msg var1 = this.b.c;
|
Msg var1 = this.b.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 instanceof MsgFromUser && ((MsgFromUser) var1).e2()) {
|
var2 = var1 instanceof MsgFromUser && ((MsgFromUser) var1).e2();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -488,27 +396,19 @@ public class VhBindArgs {
|
|||||||
public boolean v() {
|
public boolean v() {
|
||||||
IntSet var1 = this.r;
|
IntSet var1 = this.r;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.a(this.b.c.getLocalId())) {
|
var2 = var1 != null && var1.a(this.b.c.getLocalId());
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean w() {
|
public boolean w() {
|
||||||
return this.z() ^ true;
|
return !this.z();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean x() {
|
public boolean x() {
|
||||||
AdapterEntry var1 = this.c;
|
AdapterEntry var1 = this.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.a == 100) {
|
var2 = var1 != null && var1.a == 100;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -516,11 +416,7 @@ public class VhBindArgs {
|
|||||||
public boolean y() {
|
public boolean y() {
|
||||||
AdapterEntry var1 = this.c;
|
AdapterEntry var1 = this.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.a == 96) {
|
var2 = var1 != null && var1.a == 96;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -528,11 +424,7 @@ public class VhBindArgs {
|
|||||||
public boolean z() {
|
public boolean z() {
|
||||||
AdapterEntry var1 = this.c;
|
AdapterEntry var1 = this.c;
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != null && var1.c() && this.c.c.getLocalId() == this.b.c.getLocalId()) {
|
var2 = var1 != null && var1.c() && this.c.c.getLocalId() == this.b.c.getLocalId();
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -46,7 +46,7 @@ public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
|
|||||||
this.G = new StringBuilder();
|
this.G = new StringBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void a(Msg var1) {
|
private void a(Msg var1) {
|
||||||
this.G.setLength(0);
|
this.G.setLength(0);
|
||||||
MsgTimeFormatter var2 = this.F;
|
MsgTimeFormatter var2 = this.F;
|
||||||
Context var3 = this.C;
|
Context var3 = this.C;
|
||||||
@@ -55,7 +55,7 @@ public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
|
|||||||
this.H.setTimeText(this.G);
|
this.H.setTimeText(this.G);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void a(boolean var1) {
|
private void a(boolean var1) {
|
||||||
MsgPartIconTwoRowView var2 = this.H;
|
MsgPartIconTwoRowView var2 = this.H;
|
||||||
int var3;
|
int var3;
|
||||||
if (var1) {
|
if (var1) {
|
||||||
@@ -67,7 +67,7 @@ public final class MsgPartCallHolder extends MsgPartHolderBase<AttachCall> {
|
|||||||
var2.setIcon(var3);
|
var2.setIcon(var3);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void a(boolean var1, AttachCall var2) {
|
private void a(boolean var1, AttachCall var2) {
|
||||||
boolean var3 = !var1;
|
boolean var3 = !var1;
|
||||||
if (var2.h() == CallState.ERROR) {
|
if (var2.h() == CallState.ERROR) {
|
||||||
this.H.setSubtitleText(m.vkim_msg_list_call_error);
|
this.H.setSubtitleText(m.vkim_msg_list_call_error);
|
||||||
|
|||||||
+74
-120
@@ -56,46 +56,6 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
private static final int[][] j0;
|
private static final int[][] j0;
|
||||||
private static final int[][] k0;
|
private static final int[][] k0;
|
||||||
private static final int[][] l0;
|
private static final int[][] l0;
|
||||||
private final MsgPartHolderBase B;
|
|
||||||
private final MsgPartHolderBindArgs C = new MsgPartHolderBindArgs();
|
|
||||||
private final Rect D = new Rect();
|
|
||||||
private final Rect E = new Rect();
|
|
||||||
private final Rect F = new Rect();
|
|
||||||
private final Rect G = new Rect();
|
|
||||||
private ColorDrawable H;
|
|
||||||
private final int I;
|
|
||||||
private final int J;
|
|
||||||
private final int K;
|
|
||||||
private final int L;
|
|
||||||
private final int M;
|
|
||||||
private Drawable N;
|
|
||||||
private Drawable O;
|
|
||||||
private BombView P;
|
|
||||||
private BombView.d Q;
|
|
||||||
private int R;
|
|
||||||
private int S;
|
|
||||||
private final DisplayNameFormatter T = new DisplayNameFormatter();
|
|
||||||
private final StringBuilder U = new StringBuilder();
|
|
||||||
private final StringBuilder V = new StringBuilder();
|
|
||||||
private final String W;
|
|
||||||
private final String X;
|
|
||||||
private final String Y;
|
|
||||||
private boolean Z;
|
|
||||||
private BubbleColors a0;
|
|
||||||
private final FluidHorizontalLayout b;
|
|
||||||
@ColorInt
|
|
||||||
private int b0;
|
|
||||||
private final AvatarView c;
|
|
||||||
private MsgListAdapterCallback c0;
|
|
||||||
private final Space d;
|
|
||||||
private Msg d0;
|
|
||||||
private final MsgBubbleView e;
|
|
||||||
private Dialog e0;
|
|
||||||
private final MsgStatusView f;
|
|
||||||
private int f0;
|
|
||||||
private final ImageView g;
|
|
||||||
private h g0 = new h();
|
|
||||||
private final Space h;
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
int[] var0 = new int[]{0, 0, 0, 0};
|
int[] var0 = new int[]{0, 0, 0, 0};
|
||||||
@@ -119,18 +79,59 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
l0 = new int[][]{var0, {4, 4, 0, 0, 0, 2, 8, 0}, var1, var2, {4, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 0, 0, 2, 8, 0}, {4, 4, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 0, 0, 0, 0, 0}};
|
l0 = new int[][]{var0, {4, 4, 0, 0, 0, 2, 8, 0}, var1, var2, {4, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 0, 0, 2, 8, 0}, {4, 4, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 0, 0, 0, 0, 0}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final MsgPartHolderBase B;
|
||||||
|
private final MsgPartHolderBindArgs C = new MsgPartHolderBindArgs();
|
||||||
|
private final Rect D = new Rect();
|
||||||
|
private final Rect E = new Rect();
|
||||||
|
private final Rect F = new Rect();
|
||||||
|
private final Rect G = new Rect();
|
||||||
|
private final int I;
|
||||||
|
private final int J;
|
||||||
|
private final int K;
|
||||||
|
private final int L;
|
||||||
|
private final int M;
|
||||||
|
private final DisplayNameFormatter T = new DisplayNameFormatter();
|
||||||
|
private final StringBuilder U = new StringBuilder();
|
||||||
|
private final StringBuilder V = new StringBuilder();
|
||||||
|
private final String W;
|
||||||
|
private final String X;
|
||||||
|
private final String Y;
|
||||||
|
private final FluidHorizontalLayout b;
|
||||||
|
private final AvatarView c;
|
||||||
|
private final Space d;
|
||||||
|
private final MsgBubbleView e;
|
||||||
|
private final MsgStatusView f;
|
||||||
|
private final ImageView g;
|
||||||
|
private final Space h;
|
||||||
|
private final ColorDrawable H;
|
||||||
|
private Drawable N;
|
||||||
|
private Drawable O;
|
||||||
|
private final BombView P;
|
||||||
|
private final BombView.d Q;
|
||||||
|
private final int R;
|
||||||
|
private final int S;
|
||||||
|
private boolean Z;
|
||||||
|
private BubbleColors a0;
|
||||||
|
@ColorInt
|
||||||
|
private int b0;
|
||||||
|
private MsgListAdapterCallback c0;
|
||||||
|
private Msg d0;
|
||||||
|
private Dialog e0;
|
||||||
|
private int f0;
|
||||||
|
private final h g0 = new h();
|
||||||
|
|
||||||
public VhMsg(View itemView, MsgPartHolderBase vhBase) {
|
public VhMsg(View itemView, MsgPartHolderBase vhBase) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
Context context = itemView.getContext();
|
Context context = itemView.getContext();
|
||||||
LayoutInflater var4 = LayoutInflater.from(context);
|
LayoutInflater var4 = LayoutInflater.from(context);
|
||||||
this.b = (FluidHorizontalLayout) itemView;
|
this.b = (FluidHorizontalLayout) itemView;
|
||||||
this.c = (AvatarView) itemView.findViewById(com.vk.im.ui.h.avatar);
|
this.c = itemView.findViewById(com.vk.im.ui.h.avatar);
|
||||||
this.d = (Space) itemView.findViewById(com.vk.im.ui.h.avatar_space);
|
this.d = itemView.findViewById(com.vk.im.ui.h.avatar_space);
|
||||||
this.e = (MsgBubbleView) itemView.findViewById(com.vk.im.ui.h.bubble);
|
this.e = itemView.findViewById(com.vk.im.ui.h.bubble);
|
||||||
this.f = (MsgStatusView) itemView.findViewById(com.vk.im.ui.h.status);
|
this.f = itemView.findViewById(com.vk.im.ui.h.status);
|
||||||
this.g = (ImageView) itemView.findViewById(com.vk.im.ui.h.vkim_channel_share);
|
this.g = itemView.findViewById(com.vk.im.ui.h.vkim_channel_share);
|
||||||
this.h = (Space) itemView.findViewById(com.vk.im.ui.h.status_space);
|
this.h = itemView.findViewById(com.vk.im.ui.h.status_space);
|
||||||
this.P = (BombView) itemView.findViewById(com.vk.im.ui.h.bomb);
|
this.P = itemView.findViewById(com.vk.im.ui.h.bomb);
|
||||||
this.B = vhBase;
|
this.B = vhBase;
|
||||||
this.H = new ColorDrawable(context.getResources().getColor(com.vk.im.ui.d.msg_search_selection));
|
this.H = new ColorDrawable(context.getResources().getColor(com.vk.im.ui.d.msg_search_selection));
|
||||||
this.I = ContextExtKt.b(context, com.vk.im.ui.e.msg_bubble_max_width);
|
this.I = ContextExtKt.b(context, com.vk.im.ui.e.msg_bubble_max_width);
|
||||||
@@ -203,6 +204,10 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static VhMsg a(LayoutInflater var0, ViewGroup var1, MsgPartHolderBase var2) {
|
||||||
|
return new VhMsg(var0.inflate(j.vkim_msg_list_item_msg_from_user, var1, false), var2);
|
||||||
|
}
|
||||||
|
|
||||||
private int a(Style var1, Style var2, boolean var3) {
|
private int a(Style var1, Style var2, boolean var3) {
|
||||||
int var4;
|
int var4;
|
||||||
if (var3) {
|
if (var3) {
|
||||||
@@ -283,20 +288,15 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
case 103:
|
case 103:
|
||||||
return VhMsg.Style.EMPTY;
|
return VhMsg.Style.EMPTY;
|
||||||
default:
|
default:
|
||||||
StringBuilder var3 = new StringBuilder();
|
String var3 = "Unknown viewType: " +
|
||||||
var3.append("Unknown viewType: ");
|
var1;
|
||||||
var3.append(var1);
|
throw new IllegalArgumentException(var3);
|
||||||
throw new IllegalArgumentException(var3.toString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return VhMsg.Style.TWO_LINE;
|
return VhMsg.Style.TWO_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static VhMsg a(LayoutInflater var0, ViewGroup var1, MsgPartHolderBase var2) {
|
|
||||||
return new VhMsg(var0.inflate(j.vkim_msg_list_item_msg_from_user, var1, false), var2);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void a(VhBindArgs args, Rect rect) {
|
private void a(VhBindArgs args, Rect rect) {
|
||||||
Style var3 = this.a(args.b);
|
Style var3 = this.a(args.b);
|
||||||
boolean var4 = args.b.f();
|
boolean var4 = args.b.f();
|
||||||
@@ -411,11 +411,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
Msg var10 = var5.c;
|
Msg var10 = var5.c;
|
||||||
var9 = var6;
|
var9 = var6;
|
||||||
if (var10 != null) {
|
if (var10 != null) {
|
||||||
if (var10.v1() == args.g.t1()) {
|
var9 = var10.v1() == args.g.t1();
|
||||||
var9 = true;
|
|
||||||
} else {
|
|
||||||
var9 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (var10.O1()) {
|
if (var10.O1()) {
|
||||||
int var12 = var10.d().ordinal();
|
int var12 = var10.d().ordinal();
|
||||||
@@ -433,11 +429,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
b = args.I();
|
b = args.I();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (var10.C1() <= args.i) {
|
var6 = var10.C1() <= args.i;
|
||||||
var6 = true;
|
|
||||||
} else {
|
|
||||||
var6 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!var6 && !var9) {
|
if (!var6 && !var9) {
|
||||||
var11 = MsgStatus.UNREAD;
|
var11 = MsgStatus.UNREAD;
|
||||||
@@ -575,18 +567,14 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
partArgs.o = args.n;
|
partArgs.o = args.n;
|
||||||
partArgs.s = args.v();
|
partArgs.s = args.v();
|
||||||
partArgs.t = args.q;
|
partArgs.t = args.q;
|
||||||
partArgs.u = var4.b() ^ true;
|
partArgs.u = !var4.b();
|
||||||
boolean var5;
|
boolean var5;
|
||||||
if (var3.i > 0) {
|
var5 = var3.i > 0;
|
||||||
var5 = true;
|
|
||||||
} else {
|
|
||||||
var5 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
partArgs.v = var5;
|
partArgs.v = var5;
|
||||||
partArgs.w = args.k;
|
partArgs.w = args.k;
|
||||||
partArgs.x = args.l;
|
partArgs.x = args.l;
|
||||||
partArgs.y = this.Z ^ true;
|
partArgs.y = !this.Z;
|
||||||
partArgs.z = args.s;
|
partArgs.z = args.s;
|
||||||
partArgs.A = args.t;
|
partArgs.A = args.t;
|
||||||
partArgs.l = this.b0;
|
partArgs.l = this.b0;
|
||||||
@@ -671,7 +659,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
private void f(VhBindArgs args) {
|
private void f(VhBindArgs args) {
|
||||||
Msg var2 = args.b.c;
|
Msg var2 = args.b.c;
|
||||||
if (var2 != null) {
|
if (var2 != null) {
|
||||||
this.P.setStateListener((BombView.d) null);
|
this.P.setStateListener(null);
|
||||||
if (var2.M1() && !var2.E1()) {
|
if (var2.M1() && !var2.E1()) {
|
||||||
this.P.setVisibility(View.GONE);
|
this.P.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
@@ -810,24 +798,12 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
this.e.setFwdPadding(this.D);
|
this.e.setFwdPadding(this.D);
|
||||||
this.e.setContentPadding(this.E);
|
this.e.setContentPadding(this.E);
|
||||||
boolean var7;
|
boolean var7;
|
||||||
if (args.b.a == 83) {
|
var7 = args.b.a == 83;
|
||||||
var7 = true;
|
|
||||||
} else {
|
|
||||||
var7 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean var5;
|
boolean var5;
|
||||||
if (args.a.a == 83) {
|
var5 = args.a.a == 83;
|
||||||
var5 = true;
|
|
||||||
} else {
|
|
||||||
var5 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!args.F() || !var7 && !var5) {
|
var5 = !args.F() || !var7 && !var5;
|
||||||
var5 = true;
|
|
||||||
} else {
|
|
||||||
var5 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
MsgBubbleView var8 = this.e;
|
MsgBubbleView var8 = this.e;
|
||||||
boolean var6 = var4;
|
boolean var6 = var4;
|
||||||
@@ -904,18 +880,10 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
boolean var5;
|
boolean var5;
|
||||||
if (var2.a == 50) {
|
var5 = var2.a == 50;
|
||||||
var5 = true;
|
|
||||||
} else {
|
|
||||||
var5 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean var6;
|
boolean var6;
|
||||||
if (!args.z() && var2.i == 0) {
|
var6 = !args.z() && var2.i == 0;
|
||||||
var6 = true;
|
|
||||||
} else {
|
|
||||||
var6 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (var5 || var6 || args.y() || args.x()) {
|
if (var5 || var6 || args.y() || args.x()) {
|
||||||
var4 = true;
|
var4 = true;
|
||||||
@@ -934,11 +902,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
|
|
||||||
private boolean u(int var1) {
|
private boolean u(int var1) {
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (var1 != 2 && var1 != 3) {
|
var2 = var1 == 2 || var1 == 3;
|
||||||
var2 = false;
|
|
||||||
} else {
|
|
||||||
var2 = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var2;
|
return var2;
|
||||||
}
|
}
|
||||||
@@ -960,9 +924,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
Msg var1 = this.d0;
|
Msg var1 = this.d0;
|
||||||
if (var1 != null) {
|
if (var1 != null) {
|
||||||
Dialog var2 = this.e0;
|
Dialog var2 = this.e0;
|
||||||
if (var2 != null && MsgPermissionHelper.b.a(var2, var1)) {
|
return var2 != null && MsgPermissionHelper.b.a(var2, var1);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -997,11 +959,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
|
|
||||||
public void a(VhBindArgs args) {
|
public void a(VhBindArgs args) {
|
||||||
boolean var2;
|
boolean var2;
|
||||||
if (VKThemeHelper.l() == VKTheme.VKAPP_LIGHT) {
|
var2 = VKThemeHelper.l() == VKTheme.VKAPP_LIGHT;
|
||||||
var2 = true;
|
|
||||||
} else {
|
|
||||||
var2 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Z = var2;
|
this.Z = var2;
|
||||||
AdapterEntry var3 = args.b;
|
AdapterEntry var3 = args.b;
|
||||||
@@ -1062,11 +1020,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
|
|
||||||
public boolean f0() {
|
public boolean f0() {
|
||||||
boolean var1;
|
boolean var1;
|
||||||
if (this.f0 == 100) {
|
var1 = this.f0 == 100;
|
||||||
var1 = true;
|
|
||||||
} else {
|
|
||||||
var1 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return var1;
|
return var1;
|
||||||
}
|
}
|
||||||
@@ -1083,7 +1037,7 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
this.B.c(var1);
|
this.B.c(var1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static enum Style {
|
private enum Style {
|
||||||
BUTTON(6),
|
BUTTON(6),
|
||||||
EMPTY(7),
|
EMPTY(7),
|
||||||
FWD_SENDER(4),
|
FWD_SENDER(4),
|
||||||
@@ -1095,14 +1049,14 @@ public class VhMsg extends VhBase implements SwipeToReplyItemTouchCallback.b {
|
|||||||
|
|
||||||
public final int index;
|
public final int index;
|
||||||
|
|
||||||
private Style(int var3) {
|
Style(int var3) {
|
||||||
this.index = var3;
|
this.index = var3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class h implements Functions<Unit> {
|
private class h implements Functions<Unit> {
|
||||||
private int a;
|
private final int a;
|
||||||
private Runnable b;
|
private final Runnable b;
|
||||||
|
|
||||||
private h() {
|
private h() {
|
||||||
this.a = Screen.a(12);
|
this.a = Screen.a(12);
|
||||||
|
|||||||
@@ -26,30 +26,23 @@ import com.vtosters.lite.R;
|
|||||||
|
|
||||||
public final class MentionsController {
|
public final class MentionsController {
|
||||||
private final RichEditText a;
|
private final RichEditText a;
|
||||||
|
private final ImEngine mImEngine;
|
||||||
|
private final View j;
|
||||||
|
private final b k;
|
||||||
private boolean state;
|
private boolean state;
|
||||||
private CoordinatorLayout mCoordinatorLayout;
|
private CoordinatorLayout mCoordinatorLayout;
|
||||||
private VkBottomSheetBehavior<RecyclerView> mBottomSheetBehavior;
|
private VkBottomSheetBehavior<RecyclerView> mBottomSheetBehavior;
|
||||||
private boolean e;
|
private boolean e;
|
||||||
private DialogMentionComponent mDialogMentionComponent;
|
private final DialogMentionComponent mDialogMentionComponent;
|
||||||
private MentionsManager mMentionsManager;
|
private final MentionsManager mMentionsManager;
|
||||||
private final ImEngine mImEngine;
|
private final int i;
|
||||||
private int i;
|
|
||||||
private final View j;
|
|
||||||
private final b k;
|
|
||||||
|
|
||||||
public interface b {
|
|
||||||
boolean c();
|
|
||||||
|
|
||||||
boolean d();
|
|
||||||
}
|
|
||||||
|
|
||||||
public MentionsController(ImEngine imEngine, int i, View view, b bVar) {
|
public MentionsController(ImEngine imEngine, int i, View view, b bVar) {
|
||||||
this.mImEngine = imEngine;
|
this.mImEngine = imEngine;
|
||||||
this.i = i;
|
this.i = i;
|
||||||
this.j = view;
|
this.j = view;
|
||||||
this.k = bVar;
|
this.k = bVar;
|
||||||
this.a = (RichEditText) this.j.findViewById(R.id.writebar_edit);
|
this.a = this.j.findViewById(R.id.writebar_edit);
|
||||||
this.mMentionsManager = new MentionsManager(this.a, new MentionSuggestionsSupplier() {
|
this.mMentionsManager = new MentionsManager(this.a, new MentionSuggestionsSupplier() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -71,7 +64,7 @@ public final class MentionsController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void b() {
|
public void b() {
|
||||||
MentionsController.this.mDialogMentionComponent.a(0, (String) null);
|
MentionsController.this.mDialogMentionComponent.a(0, null);
|
||||||
MentionsController.this.g();
|
MentionsController.this.g();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -92,18 +85,18 @@ public final class MentionsController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void g() {
|
public void g() {
|
||||||
this.e = false;
|
this.e = false;
|
||||||
j();
|
j();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void h() {
|
private void h() {
|
||||||
if (this.state) {
|
if (this.state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
View inflate = ((ViewStub) this.j.findViewById(R.id.mentions_container_stub)).inflate();
|
View inflate = ((ViewStub) this.j.findViewById(R.id.mentions_container_stub)).inflate();
|
||||||
ViewGroup viewGroup = (ViewGroup) inflate.findViewById(R.id.mentions_container);
|
ViewGroup viewGroup = inflate.findViewById(R.id.mentions_container);
|
||||||
viewGroup.addView(this.mDialogMentionComponent.a(viewGroup, (Bundle) null));
|
viewGroup.addView(this.mDialogMentionComponent.a(viewGroup, null));
|
||||||
this.mCoordinatorLayout = inflate.findViewById(R.id.mentions_cl);
|
this.mCoordinatorLayout = inflate.findViewById(R.id.mentions_cl);
|
||||||
this.mBottomSheetBehavior = (VkBottomSheetBehavior<RecyclerView>) ((CoordinatorLayout.LayoutParams) viewGroup.getLayoutParams()).getBehavior();
|
this.mBottomSheetBehavior = (VkBottomSheetBehavior<RecyclerView>) ((CoordinatorLayout.LayoutParams) viewGroup.getLayoutParams()).getBehavior();
|
||||||
this.mBottomSheetBehavior.a(new VkBottomSheetBehavior.b() {
|
this.mBottomSheetBehavior.a(new VkBottomSheetBehavior.b() {
|
||||||
@@ -120,12 +113,12 @@ public final class MentionsController {
|
|||||||
this.state = true;
|
this.state = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void i() {
|
public void i() {
|
||||||
this.e = true;
|
this.e = true;
|
||||||
j();
|
j();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void j() {
|
public void j() {
|
||||||
if (this.k.d()) {
|
if (this.k.d()) {
|
||||||
Context context = this.j.getContext();
|
Context context = this.j.getContext();
|
||||||
Activity f = ContextExtKt.f(context);
|
Activity f = ContextExtKt.f(context);
|
||||||
@@ -139,27 +132,33 @@ public final class MentionsController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void a() {
|
public void a() {
|
||||||
this.mDialogMentionComponent.g();
|
this.mDialogMentionComponent.g();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void b() {
|
public void b() {
|
||||||
this.mDialogMentionComponent.h();
|
this.mDialogMentionComponent.h();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final b c() {
|
public b c() {
|
||||||
return this.k;
|
return this.k;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final int d() {
|
public int d() {
|
||||||
return this.i;
|
return this.i;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void e() {
|
public void e() {
|
||||||
this.mDialogMentionComponent.q();
|
this.mDialogMentionComponent.q();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void f() {
|
public void f() {
|
||||||
this.mDialogMentionComponent.r();
|
this.mDialogMentionComponent.r();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface b {
|
||||||
|
boolean c();
|
||||||
|
|
||||||
|
boolean d();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -12,15 +12,15 @@ import android.view.ViewGroup;
|
|||||||
import com.vk.im.ui.o;
|
import com.vk.im.ui.o;
|
||||||
|
|
||||||
public class StoryBorderView extends View {
|
public class StoryBorderView extends View {
|
||||||
private boolean B;
|
|
||||||
private final Paint a;
|
private final Paint a;
|
||||||
|
private final int g;
|
||||||
|
private final int h;
|
||||||
|
private boolean B;
|
||||||
private LinearGradient f15747b;
|
private LinearGradient f15747b;
|
||||||
private int f15748c;
|
private int f15748c;
|
||||||
private int f15749d;
|
private int f15749d;
|
||||||
private int f15750e;
|
private int f15750e;
|
||||||
private int f15751f;
|
private int f15751f;
|
||||||
private final int g;
|
|
||||||
private final int h;
|
|
||||||
|
|
||||||
public StoryBorderView(Context context) {
|
public StoryBorderView(Context context) {
|
||||||
this(context, null, 0, 6);
|
this(context, null, 0, 6);
|
||||||
@@ -34,10 +34,32 @@ public class StoryBorderView extends View {
|
|||||||
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
|
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StoryBorderView(Context context, AttributeSet attributeSet, int i) {
|
||||||
|
super(context, attributeSet, i);
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setStyle(Paint.Style.STROKE);
|
||||||
|
this.a = paint;
|
||||||
|
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, o.StoryBorderView);
|
||||||
|
setBorderColor(obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderColor, 0));
|
||||||
|
this.g = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientStartColor, 0);
|
||||||
|
this.h = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientEndColor, 0);
|
||||||
|
setBorderWidth(obtainStyledAttributes.getDimensionPixelSize(o.StoryBorderView_vkim_borderWidth, 0));
|
||||||
|
obtainStyledAttributes.recycle();
|
||||||
|
}
|
||||||
|
|
||||||
public int getBorderColor() {
|
public int getBorderColor() {
|
||||||
return this.f15749d;
|
return this.f15749d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBorderColor(int i) {
|
||||||
|
if (this.f15749d != i) {
|
||||||
|
this.f15749d = i;
|
||||||
|
this.a.setColor(i);
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int getBorderGradientEndColor() {
|
public int getBorderGradientEndColor() {
|
||||||
return this.h;
|
return this.h;
|
||||||
}
|
}
|
||||||
@@ -50,14 +72,33 @@ public class StoryBorderView extends View {
|
|||||||
return this.f15750e;
|
return this.f15750e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBorderWidth(int i) {
|
||||||
|
if (this.f15750e != i) {
|
||||||
|
this.f15750e = i;
|
||||||
|
this.a.setStrokeWidth(i);
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int getPadding() {
|
public int getPadding() {
|
||||||
return this.f15751f;
|
return this.f15751f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setPadding(int i) {
|
||||||
|
if (this.f15751f != i) {
|
||||||
|
this.f15751f = i;
|
||||||
|
setPadding(i, i, i, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int getViewSize() {
|
public int getViewSize() {
|
||||||
return this.f15748c;
|
return this.f15748c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setViewSize(int i) {
|
||||||
|
this.f15748c = i;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
canvas.drawOval(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom(), this.a);
|
canvas.drawOval(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom(), this.a);
|
||||||
@@ -69,22 +110,6 @@ public class StoryBorderView extends View {
|
|||||||
setMeasuredDimension(i3, i3);
|
setMeasuredDimension(i3, i3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBorderColor(int i) {
|
|
||||||
if (this.f15749d != i) {
|
|
||||||
this.f15749d = i;
|
|
||||||
this.a.setColor(i);
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderWidth(int i) {
|
|
||||||
if (this.f15750e != i) {
|
|
||||||
this.f15750e = i;
|
|
||||||
this.a.setStrokeWidth(i);
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
|
public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
|
||||||
super.setLayoutParams(layoutParams);
|
super.setLayoutParams(layoutParams);
|
||||||
@@ -108,29 +133,4 @@ public class StoryBorderView extends View {
|
|||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPadding(int i) {
|
|
||||||
if (this.f15751f != i) {
|
|
||||||
this.f15751f = i;
|
|
||||||
setPadding(i, i, i, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setViewSize(int i) {
|
|
||||||
this.f15748c = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StoryBorderView(Context context, AttributeSet attributeSet, int i) {
|
|
||||||
super(context, attributeSet, i);
|
|
||||||
Paint paint = new Paint();
|
|
||||||
paint.setAntiAlias(true);
|
|
||||||
paint.setStyle(Paint.Style.STROKE);
|
|
||||||
this.a = paint;
|
|
||||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, o.StoryBorderView);
|
|
||||||
setBorderColor(obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderColor, 0));
|
|
||||||
this.g = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientStartColor, 0);
|
|
||||||
this.h = obtainStyledAttributes.getInt(o.StoryBorderView_vkim_borderGradientEndColor, 0);
|
|
||||||
setBorderWidth(obtainStyledAttributes.getDimensionPixelSize(o.StoryBorderView_vkim_borderWidth, 0));
|
|
||||||
obtainStyledAttributes.recycle();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -156,7 +156,7 @@ public class LyricsHolder extends RecyclerHolder<PlayerInfo> implements View.OnC
|
|||||||
|
|
||||||
@Override // com.vk.api.base.ApiCallback
|
@Override // com.vk.api.base.ApiCallback
|
||||||
public void a(VKApiExecutionException vKApiExecutionException) {
|
public void a(VKApiExecutionException vKApiExecutionException) {
|
||||||
if (Preferences.getBoolValue("useGenius", false)) {
|
if (Preferences.getBoolValue("useGenius", false) && !Preferences.serverFeaturesDisable()) {
|
||||||
var text = Genius.getTextMusic(a);
|
var text = Genius.getTextMusic(a);
|
||||||
var lyrics = new AudioGetLyrics.a();
|
var lyrics = new AudioGetLyrics.a();
|
||||||
lyrics.a = text;
|
lyrics.a = text;
|
||||||
|
|||||||
@@ -36,37 +36,37 @@ public final class CommunityBorderedImageView extends BorderedCircleImageView im
|
|||||||
|
|
||||||
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i) {
|
public CommunityBorderedImageView(Context context, AttributeSet attributeSet, int i) {
|
||||||
super(context, attributeSet, i);
|
super(context, attributeSet, i);
|
||||||
this.g0 = VKThemeHelper.d((int) R.attr.accent);
|
this.g0 = VKThemeHelper.d(R.attr.accent);
|
||||||
this.h0 = ContextExtKt.a(context, (int) R.color.gray_200);
|
this.h0 = ContextExtKt.a(context, R.color.gray_200);
|
||||||
this.i0 = new PorterDuffColorFilter(this.g0, PorterDuff.Mode.SRC_IN);
|
this.i0 = new PorterDuffColorFilter(this.g0, PorterDuff.Mode.SRC_IN);
|
||||||
this.j0 = new PorterDuffColorFilter(this.h0, PorterDuff.Mode.SRC_IN);
|
this.j0 = new PorterDuffColorFilter(this.h0, PorterDuff.Mode.SRC_IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void c(int unread, int read) { // get unread and read resid
|
public void c(int unread, int read) { // get unread and read resid
|
||||||
this.unread = unread;
|
this.unread = unread;
|
||||||
this.read = read;
|
this.read = read;
|
||||||
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
|
this.T = BitmapFactory.decodeResource(getResources(), this.unread);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final int getPrimaryColor() {
|
public int getPrimaryColor() {
|
||||||
return this.g0;
|
return this.g0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setPrimaryColor(int i) {
|
public void setPrimaryColor(int i) {
|
||||||
this.g0 = i;
|
this.g0 = i;
|
||||||
this.i0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
|
this.i0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final int getWasViewedColor() {
|
public int getWasViewedColor() {
|
||||||
return this.h0;
|
return this.h0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setWasViewedColor(int i) {
|
public void setWasViewedColor(int i) {
|
||||||
this.h0 = i;
|
this.h0 = i;
|
||||||
this.j0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
|
this.j0 = new PorterDuffColorFilter(i, PorterDuff.Mode.SRC_IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void o() {
|
public void o() {
|
||||||
this.f0 = false;
|
this.f0 = false;
|
||||||
l();
|
l();
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ public final class CommunityBorderedImageView extends BorderedCircleImageView im
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setStoryContainer(StoriesContainer storiesContainer) {
|
public void setStoryContainer(StoriesContainer storiesContainer) {
|
||||||
if (storiesContainer.L1()) {
|
if (storiesContainer.L1()) {
|
||||||
this.f0 = true;
|
this.f0 = true;
|
||||||
m();
|
m();
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ public class TargetImageView extends VKMultiImageView {
|
|||||||
private static final int I = Screen.a(2);
|
private static final int I = Screen.a(2);
|
||||||
private final int B;
|
private final int B;
|
||||||
private final int C;
|
private final int C;
|
||||||
|
private final RectF f21629d;
|
||||||
|
private final Paint f21630e;
|
||||||
|
private final RectF g;
|
||||||
|
private final Paint h;
|
||||||
private Drawable D;
|
private Drawable D;
|
||||||
private String[] F;
|
private String[] F;
|
||||||
private int G;
|
private int G;
|
||||||
private final RectF f21629d;
|
|
||||||
private final Paint f21630e;
|
|
||||||
private Canvas f21631f;
|
private Canvas f21631f;
|
||||||
private final RectF g;
|
|
||||||
private final Paint h;
|
|
||||||
|
|
||||||
public TargetImageView(Context context, Drawable d) {
|
public TargetImageView(Context context, Drawable d) {
|
||||||
this(context, null, 0, 6);
|
this(context, null, 0, 6);
|
||||||
@@ -51,6 +51,43 @@ public class TargetImageView extends VKMultiImageView {
|
|||||||
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
|
this(context, (i2 & 2) != 0 ? null : attributeSet, (i2 & 4) != 0 ? 0 : i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TargetImageView(Context context, AttributeSet attributeSet, int i) {
|
||||||
|
super(context, attributeSet, i);
|
||||||
|
this.f21629d = new RectF();
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setDither(true);
|
||||||
|
paint.setFilterBitmap(true);
|
||||||
|
this.f21630e = paint;
|
||||||
|
this.g = new RectF();
|
||||||
|
Paint paint2 = new Paint();
|
||||||
|
paint2.setAntiAlias(true);
|
||||||
|
paint2.setStrokeWidth(I);
|
||||||
|
paint2.setStyle(Paint.Style.STROKE);
|
||||||
|
this.h = paint2;
|
||||||
|
this.B = getAccentColor();
|
||||||
|
this.C = this.B;
|
||||||
|
Drawable c2 = ContextExtKt.c(context, R.drawable.ic_check_circle_composite_24_full);
|
||||||
|
if (c2 != null) {
|
||||||
|
this.D = c2;
|
||||||
|
this.F = new String[4];
|
||||||
|
int i2 = I * 2;
|
||||||
|
setPadding(i2, i2, i2, i2);
|
||||||
|
if (attributeSet != null) {
|
||||||
|
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, a0.TargetImageView);
|
||||||
|
setSelected(obtainStyledAttributes.getBoolean(0, false));
|
||||||
|
obtainStyledAttributes.recycle();
|
||||||
|
}
|
||||||
|
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.user_placeholder);
|
||||||
|
for (int i3 = 0; i3 <= 3; i3++) {
|
||||||
|
a();
|
||||||
|
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(i3);
|
||||||
|
a3.b().e(drawable);
|
||||||
|
}
|
||||||
|
setScaleType(ScalingUtils.b.o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void e() {
|
private void e() {
|
||||||
int i = this.G;
|
int i = this.G;
|
||||||
for (int i2 = 0; i2 < i; i2++) {
|
for (int i2 = 0; i2 < i; i2++) {
|
||||||
@@ -251,41 +288,4 @@ public class TargetImageView extends VKMultiImageView {
|
|||||||
drawable.setBounds(i - drawable.getIntrinsicWidth(), i2 - this.D.getIntrinsicHeight(), i, i2);
|
drawable.setBounds(i - drawable.getIntrinsicWidth(), i2 - this.D.getIntrinsicHeight(), i, i2);
|
||||||
f();
|
f();
|
||||||
}
|
}
|
||||||
|
|
||||||
public TargetImageView(Context context, AttributeSet attributeSet, int i) {
|
|
||||||
super(context, attributeSet, i);
|
|
||||||
this.f21629d = new RectF();
|
|
||||||
Paint paint = new Paint();
|
|
||||||
paint.setAntiAlias(true);
|
|
||||||
paint.setDither(true);
|
|
||||||
paint.setFilterBitmap(true);
|
|
||||||
this.f21630e = paint;
|
|
||||||
this.g = new RectF();
|
|
||||||
Paint paint2 = new Paint();
|
|
||||||
paint2.setAntiAlias(true);
|
|
||||||
paint2.setStrokeWidth(I);
|
|
||||||
paint2.setStyle(Paint.Style.STROKE);
|
|
||||||
this.h = paint2;
|
|
||||||
this.B = getAccentColor();
|
|
||||||
this.C = this.B;
|
|
||||||
Drawable c2 = ContextExtKt.c(context, R.drawable.ic_check_circle_composite_24_full);
|
|
||||||
if (c2 != null) {
|
|
||||||
this.D = c2;
|
|
||||||
this.F = new String[4];
|
|
||||||
int i2 = I * 2;
|
|
||||||
setPadding(i2, i2, i2, i2);
|
|
||||||
if (attributeSet != null) {
|
|
||||||
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attributeSet, a0.TargetImageView);
|
|
||||||
setSelected(obtainStyledAttributes.getBoolean(0, false));
|
|
||||||
obtainStyledAttributes.recycle();
|
|
||||||
}
|
|
||||||
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.user_placeholder);
|
|
||||||
for (int i3 = 0; i3 <= 3; i3++) {
|
|
||||||
a();
|
|
||||||
DraweeHolder<GenericDraweeHierarchy> a3 = this.a.a(i3);
|
|
||||||
a3.b().e(drawable);
|
|
||||||
}
|
|
||||||
setScaleType(ScalingUtils.b.o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -104,6 +104,25 @@ public final class StickerDetailsAdapter extends RecyclerView.Adapter<RecyclerVi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class d extends RecyclerView.ViewHolder {
|
||||||
|
private final VKStickerImageView mImage;
|
||||||
|
|
||||||
|
public d(ViewGroup viewGroup) {
|
||||||
|
super(new VKStickerImageView(viewGroup.getContext()));
|
||||||
|
this.mImage = (VKStickerImageView) itemView;
|
||||||
|
this.mImage.setAspectRatio(1.0f);
|
||||||
|
this.mImage.setClickable(true);
|
||||||
|
this.mImage.getHierarchy().a().setVisible(true, true);
|
||||||
|
this.mImage.getHierarchy().a(0);
|
||||||
|
this.mImage.setContentDescription(this.mImage.getContext().getString(R.string.stickers_accessibility_sticker));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void a(StickerItem stickerItem) {
|
||||||
|
this.mImage.a(stickerItem.h(Screen.a(80)));
|
||||||
|
this.mImage.setTag(R.id.id, stickerItem.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final class c extends RecyclerView.ViewHolder {
|
private final class c extends RecyclerView.ViewHolder {
|
||||||
private final VKImageView mImageBg;
|
private final VKImageView mImageBg;
|
||||||
private final VKImageView mPackImage;
|
private final VKImageView mPackImage;
|
||||||
@@ -149,23 +168,4 @@ public final class StickerDetailsAdapter extends RecyclerView.Adapter<RecyclerVi
|
|||||||
this.mDescription.setText(stickerStockItem.C1());
|
this.mDescription.setText(stickerStockItem.C1());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class d extends RecyclerView.ViewHolder {
|
|
||||||
private final VKStickerImageView mImage;
|
|
||||||
|
|
||||||
public d(ViewGroup viewGroup) {
|
|
||||||
super(new VKStickerImageView(viewGroup.getContext()));
|
|
||||||
this.mImage = (VKStickerImageView) itemView;
|
|
||||||
this.mImage.setAspectRatio(1.0f);
|
|
||||||
this.mImage.setClickable(true);
|
|
||||||
this.mImage.getHierarchy().a().setVisible(true, true);
|
|
||||||
this.mImage.getHierarchy().a(0);
|
|
||||||
this.mImage.setContentDescription(this.mImage.getContext().getString(R.string.stickers_accessibility_sticker));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void a(StickerItem stickerItem) {
|
|
||||||
this.mImage.a(stickerItem.h(Screen.a(80)));
|
|
||||||
this.mImage.setTag(R.id.id, stickerItem.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -382,7 +382,7 @@ public class StoryCircleImageView extends BorderedCircleImageView implements The
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pipelineDraweeControllerBuilder.a((Supplier<DataSource<CloseableReference<CloseableImage>>>) () -> StoryCircleImageView.this.a(list));
|
pipelineDraweeControllerBuilder.a(() -> StoryCircleImageView.this.a(list));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pipelineDraweeControllerBuilder.b(null);
|
pipelineDraweeControllerBuilder.b(null);
|
||||||
|
|||||||
@@ -19664,6 +19664,35 @@ public final class R {
|
|||||||
public static final int invalidate_theme_cache_each_update_title = 0x7f121890; // 2131892368
|
public static final int invalidate_theme_cache_each_update_title = 0x7f121890; // 2131892368
|
||||||
public static final int invertFilters = 0x7f121891; // 2131892369
|
public static final int invertFilters = 0x7f121891; // 2131892369
|
||||||
public static final int invertFilters_summ = 0x7f121892; // 2131892370
|
public static final int invertFilters_summ = 0x7f121892; // 2131892370
|
||||||
|
public static final int invertcached_summ = 0x7f121893; // 2131892371
|
||||||
|
public static final int invertcached_title = 0x7f121894; // 2131892372
|
||||||
|
public static final int microg_dialog1 = 0x7f121895; // 2131892373
|
||||||
|
public static final int microg_dialog2 = 0x7f121896; // 2131892374
|
||||||
|
public static final int microg_dialog3 = 0x7f121897; // 2131892375
|
||||||
|
public static final int serverFeaturesDisable = 0x7f121898; // 2131892376
|
||||||
|
public static final int serverFeaturesDisable_summ = 0x7f121899; // 2131892377
|
||||||
|
public static final int sett_autoupdates = 0x7f12189a; // 2131892378
|
||||||
|
public static final int sett_autoupdates_summ = 0x7f12189b; // 2131892379
|
||||||
|
public static final int sett_battery = 0x7f12189c; // 2131892380
|
||||||
|
public static final int sett_battery_summ1 = 0x7f12189d; // 2131892381
|
||||||
|
public static final int sett_battery_summ2 = 0x7f12189e; // 2131892382
|
||||||
|
public static final int sett_chats = 0x7f12189f; // 2131892383
|
||||||
|
public static final int sett_chats_summ = 0x7f1218a0; // 2131892384
|
||||||
|
public static final int sett_community = 0x7f1218a1; // 2131892385
|
||||||
|
public static final int sett_community_summ = 0x7f1218a2; // 2131892386
|
||||||
|
public static final int sett_missing_links = 0x7f1218a3; // 2131892387
|
||||||
|
public static final int sett_missing_links_summ = 0x7f1218a4; // 2131892388
|
||||||
|
public static final int sett_nogms_summ = 0x7f1218a5; // 2131892389
|
||||||
|
public static final int sett_notifs = 0x7f1218a6; // 2131892390
|
||||||
|
public static final int sett_notifs_summ = 0x7f1218a7; // 2131892391
|
||||||
|
public static final int sett_recommendations = 0x7f1218a8; // 2131892392
|
||||||
|
public static final int tgs_token_missing = 0x7f1218aa; // 2131892394
|
||||||
|
public static final int tgs_token_reset = 0x7f1218ab; // 2131892395
|
||||||
|
public static final int tgs_token_reset_dialog = 0x7f1218ac; // 2131892396
|
||||||
|
public static final int tgs_token_reset_menu = 0x7f1218ad; // 2131892397
|
||||||
|
public static final int update_err = 0x7f1218ae; // 2131892398
|
||||||
|
public static final int update_latest = 0x7f1218af; // 2131892399
|
||||||
|
public static final int APKTOOL_DUMMY_18a9 = 0x7f1218a9; // 2131892393
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class style {
|
public static final class style {
|
||||||
|
|||||||
+8
-8
@@ -35,16 +35,16 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
|
|||||||
private final View mCounterContainer;
|
private final View mCounterContainer;
|
||||||
private final TextView mCounter;
|
private final TextView mCounter;
|
||||||
private final View mDot;
|
private final View mDot;
|
||||||
|
private final int mMargin;
|
||||||
|
private final float mSmallScale;
|
||||||
|
private final ImageView mIcon;
|
||||||
|
private final ImageView mActionIcon;
|
||||||
private int mItemPos;
|
private int mItemPos;
|
||||||
private MenuItemImpl mItemData;
|
private MenuItemImpl mItemData;
|
||||||
private ColorStateList mColorStateList;
|
private ColorStateList mColorStateList;
|
||||||
private final int mMargin;
|
|
||||||
private final float mSmallScale;
|
|
||||||
private boolean mShiftingModeEnabled;
|
private boolean mShiftingModeEnabled;
|
||||||
private boolean mIconsModeEnabled;
|
private boolean mIconsModeEnabled;
|
||||||
private boolean mStaticModeEnabled;
|
private boolean mStaticModeEnabled;
|
||||||
private final ImageView mIcon;
|
|
||||||
private final ImageView mActionIcon;
|
|
||||||
|
|
||||||
public BottomNavigationItemView(@NonNull Context context) {
|
public BottomNavigationItemView(@NonNull Context context) {
|
||||||
this(context, null);
|
this(context, null);
|
||||||
@@ -101,6 +101,10 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
|
|||||||
return this.mItemPos;
|
return this.mItemPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setItemPosition(int pos) {
|
||||||
|
this.mItemPos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("RestrictedApi")
|
@SuppressLint("RestrictedApi")
|
||||||
public void initialize(MenuItemImpl impl, int i) {
|
public void initialize(MenuItemImpl impl, int i) {
|
||||||
this.mItemData = impl;
|
this.mItemData = impl;
|
||||||
@@ -310,10 +314,6 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It
|
|||||||
ViewCompat.setBackground(this, resId != 0 ? ContextCompat.getDrawable(this.getContext(), resId) : null);
|
ViewCompat.setBackground(this, resId != 0 ? ContextCompat.getDrawable(this.getContext(), resId) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setItemPosition(int pos) {
|
|
||||||
this.mItemPos = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setShiftingMode(boolean var1) {
|
public void setShiftingMode(boolean var1) {
|
||||||
this.mShiftingModeEnabled = var1;
|
this.mShiftingModeEnabled = var1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package ru.vtosters.hooks;
|
|||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
|
import ru.vtosters.lite.utils.newsfeed.NewsFeedFiltersUtils;
|
||||||
|
|
||||||
public class AdBlockHook {
|
public class AdBlockHook {
|
||||||
public static JSONObject discoverInject(JSONObject json) throws JSONException {
|
public static JSONObject discoverInject(JSONObject json) throws JSONException {
|
||||||
@@ -11,11 +11,15 @@ public class AdBlockHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static JSONArray feedInject(JSONArray items) {
|
public static JSONArray feedInject(JSONArray items) {
|
||||||
return NewsFeedFiltersUtils.feedInject(items);
|
return NewsFeedFiltersUtils.feedInject(items, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
|
public static JSONArray wallGetById(JSONArray items) {
|
||||||
return NewsFeedFiltersUtils.storiesads(json, isDeleteFix);
|
return NewsFeedFiltersUtils.feedInject(items, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) {
|
||||||
|
return NewsFeedFiltersUtils.storiesAds(json, isDeleteFix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ package ru.vtosters.hooks;
|
|||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
import ru.vtosters.lite.utils.FriendsCatalogUtils;
|
import ru.vtosters.lite.utils.FriendsCatalogUtils;
|
||||||
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
|
|
||||||
import ru.vtosters.lite.utils.OnlineBypass;
|
import ru.vtosters.lite.utils.OnlineBypass;
|
||||||
import ru.vtosters.lite.utils.SuperAppUtils;
|
import ru.vtosters.lite.utils.SuperAppUtils;
|
||||||
|
import ru.vtosters.lite.utils.newsfeed.NewsFeedFiltersUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
@@ -30,10 +31,10 @@ public class JsonInjectors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
|
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
|
||||||
return NewsFeedFiltersUtils.newsfeedlist(items);
|
return Preferences.getBoolValue("unlockCustomLists", false) ? NewsFeedFiltersUtils.setNewsfeedLists(items) : items;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JSONObject friends(JSONObject json) throws JSONException, ParseException, IOException {
|
public static JSONObject friends(JSONObject json) throws JSONException, ParseException, IOException {
|
||||||
return FriendsCatalogUtils.inject(json);
|
return FriendsCatalogUtils.inject(json);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,14 +21,15 @@ import ru.vtosters.lite.utils.AndroidUtils;
|
|||||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||||
import ru.vtosters.lite.utils.NavigatorUtils;
|
import ru.vtosters.lite.utils.NavigatorUtils;
|
||||||
import ru.vtosters.lite.utils.VTVerifications;
|
import ru.vtosters.lite.utils.VTVerifications;
|
||||||
|
import ru.vtosters.sponsorpost.utils.Updates;
|
||||||
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.checkupdates;
|
import static ru.vtosters.hooks.other.Preferences.checkupdates;
|
||||||
import static ru.vtosters.lite.utils.CacheUtils.getInstance;
|
import static ru.vtosters.lite.utils.CacheUtils.getInstance;
|
||||||
import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters;
|
|
||||||
|
|
||||||
public class MainActivityInjector {
|
public class MainActivityInjector {
|
||||||
public static void inject(Activity activity) {
|
public static void inject(Activity activity) {
|
||||||
SystemThemeChangerHook.themeOnStart(activity);
|
SystemThemeChangerHook.themeOnStart(activity);
|
||||||
|
|
||||||
UsersList.getUsersList();
|
UsersList.getUsersList();
|
||||||
VTVerifications.load(activity);
|
VTVerifications.load(activity);
|
||||||
|
|
||||||
@@ -36,9 +37,12 @@ public class MainActivityInjector {
|
|||||||
|
|
||||||
VTExecutors.getSlowTasksScheduler().a(() -> {
|
VTExecutors.getSlowTasksScheduler().a(() -> {
|
||||||
getInstance().autoCleaningCache();
|
getInstance().autoCleaningCache();
|
||||||
}); // slowTasksScheduler
|
|
||||||
|
|
||||||
setupFilters();
|
if (!Preferences.serverFeaturesDisable()) {
|
||||||
|
Updates.updateFilters();
|
||||||
|
Updates.updatePosts();
|
||||||
|
}
|
||||||
|
}); // slowTasksScheduler
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
NotificationChannels.createChannels();
|
NotificationChannels.createChannels();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.vk.api.internal.MethodCall;
|
|||||||
import com.vk.im.ui.providers.audiomsg.ImAudioMsgPlayerProvider;
|
import com.vk.im.ui.providers.audiomsg.ImAudioMsgPlayerProvider;
|
||||||
import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
|
import com.vk.im.ui.providers.audiomsg.PlayerActionSources;
|
||||||
import com.vtosters.lite.im.ImEngineProvider;
|
import com.vtosters.lite.im.ImEngineProvider;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
import ru.vtosters.lite.translators.BaseTranslator;
|
import ru.vtosters.lite.translators.BaseTranslator;
|
||||||
import ru.vtosters.lite.ui.dialogs.MessageSettings;
|
import ru.vtosters.lite.ui.dialogs.MessageSettings;
|
||||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||||
@@ -20,7 +21,7 @@ import static ru.vtosters.lite.ui.dialogs.MessageSettings.isSilentEnabled;
|
|||||||
|
|
||||||
public class MessagesHook {
|
public class MessagesHook {
|
||||||
public static String injectOwnText(String oldText) {
|
public static String injectOwnText(String oldText) {
|
||||||
if (!autotranslate() || TextUtils.isEmpty(oldText))
|
if (!autotranslate() || Preferences.serverFeaturesDisable() || TextUtils.isEmpty(oldText))
|
||||||
return oldText;
|
return oldText;
|
||||||
var instance = BaseTranslator.getInstance();
|
var instance = BaseTranslator.getInstance();
|
||||||
|
|
||||||
@@ -28,7 +29,7 @@ public class MessagesHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String injectOwnTextAll(String oldText) {
|
public static String injectOwnTextAll(String oldText) {
|
||||||
if (!autoalltranslate() || TextUtils.isEmpty(oldText)) {
|
if (!autoalltranslate() || Preferences.serverFeaturesDisable() || TextUtils.isEmpty(oldText)) {
|
||||||
return oldText;
|
return oldText;
|
||||||
}
|
}
|
||||||
var instance = BaseTranslator.getInstance();
|
var instance = BaseTranslator.getInstance();
|
||||||
|
|||||||
@@ -2,17 +2,25 @@ package ru.vtosters.hooks;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.util.Log;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.vk.core.preference.Preference;
|
import com.vk.core.preference.Preference;
|
||||||
import com.vk.discover.DiscoverItemDecorator;
|
import com.vk.discover.DiscoverItemDecorator;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
|
import ru.vtosters.lite.concurrent.VTExecutors;
|
||||||
|
import ru.vtosters.lite.utils.NetworkUtils;
|
||||||
|
import ru.vtosters.sponsorpost.services.PostService;
|
||||||
|
import ru.vtosters.sponsorpost.utils.PostsPreferences;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static java.lang.Long.MAX_VALUE;
|
import static java.lang.Long.MAX_VALUE;
|
||||||
import static ru.vtosters.hooks.other.Preferences.*;
|
import static ru.vtosters.hooks.other.Preferences.*;
|
||||||
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
||||||
|
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
|
||||||
|
|
||||||
public class NewsfeedHook {
|
public class NewsfeedHook {
|
||||||
public static long getUpdateNewsfeed(boolean refresh_timeout) {
|
public static long getUpdateNewsfeed(boolean refresh_timeout) {
|
||||||
@@ -22,8 +30,7 @@ public class NewsfeedHook {
|
|||||||
return switch (getString("newsupdate")) {
|
return switch (getString("newsupdate")) {
|
||||||
case "no_update" -> MAX_VALUE;
|
case "no_update" -> MAX_VALUE;
|
||||||
case "imd_update" -> 10000L;
|
case "imd_update" -> 10000L;
|
||||||
default ->
|
default -> Preference.b().getLong(refresh_timeout ? "refresh_timeout_top" : "refresh_timeout_recent", 600000L);
|
||||||
Preference.b().getLong(refresh_timeout ? "refresh_timeout_top" : "refresh_timeout_recent", 600000L);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,41 +60,70 @@ public class NewsfeedHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String[] feedParams() {
|
public static String[] feedParams() {
|
||||||
HashSet<String> params = new HashSet<>();
|
List<String> params = List.of("post", "photo", "photo_tag", "friends_recomm", "app_widget", "promo_button", "authors_rec");
|
||||||
params.add("post");
|
|
||||||
params.add("photo");
|
|
||||||
params.add("photo_tag");
|
|
||||||
|
|
||||||
if (!friendsrecomm()) {
|
HashSet<String> filteredParams = new HashSet<>();
|
||||||
params.add("friends_recomm");
|
|
||||||
|
for (String param : params) {
|
||||||
|
if (!isDisabled(param)) {
|
||||||
|
filteredParams.add(param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ads()) {
|
return filteredParams.toArray(new String[0]);
|
||||||
params.add("app_widget");
|
}
|
||||||
params.add("promo_button");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!authorsrecomm()) {
|
private static boolean isDisabled(String param) {
|
||||||
params.add("authors_rec");
|
return switch (param) {
|
||||||
}
|
case "friends_recomm" -> friendsrecomm();
|
||||||
|
case "app_widget", "promo_button" -> ads();
|
||||||
return params.toArray(new String[0]);
|
case "authors_rec" -> authorsrecomm();
|
||||||
|
default -> false;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void adsParams(HashSet<String> hashSet) {
|
public static void adsParams(HashSet<String> hashSet) {
|
||||||
|
String[] adsParams = {"ads_disabled", "ads_app_slider", "ads_site_slider", "ads_app", "ads_site", "ads_post", "ads_app_video", "ads_post_pretty_cards", "ads_post_snippet_video"};
|
||||||
|
|
||||||
if (ads()) {
|
if (ads()) {
|
||||||
hashSet.add("ads_disabled");
|
hashSet.add(adsParams[0]);
|
||||||
|
hashSet.add(adsParams[1]);
|
||||||
} else {
|
} else {
|
||||||
hashSet.add("ads_app_slider");
|
Collections.addAll(hashSet, adsParams);
|
||||||
hashSet.add("ads_site_slider");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hashSet.add("ads_app");
|
if (Preferences.milkshake()) {
|
||||||
hashSet.add("ads_site");
|
hashSet.remove(adsParams[1]);
|
||||||
hashSet.add("ads_post");
|
}
|
||||||
hashSet.add("ads_app_video");
|
}
|
||||||
hashSet.add("ads_post_pretty_cards");
|
|
||||||
hashSet.add("ads_post_snippet_video");
|
public static void takeOwnerIdSponsorPost(int ownerid) {
|
||||||
|
if (NetworkUtils.isNetworkConnected() && PostsPreferences.isEnabled() && !Preferences.serverFeaturesDisable()) {
|
||||||
|
VTExecutors.getIoScheduler().a(() -> {
|
||||||
|
List<Long> postIds = PostService.getPostIdsByOwnerId((long) ownerid, 0L);
|
||||||
|
PostsPreferences.saveGroupSpecifiedPosts(postIds, (long) ownerid);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void takeOwnerIdPostIdSponsorPost(String[] strArr) {
|
||||||
|
long ownerid = Long.parseLong(strArr[0].split("_")[0]);
|
||||||
|
long postId = Long.parseLong(strArr[0].split("_")[1]);
|
||||||
|
|
||||||
|
if (PostsPreferences.isPostAd(ownerid, postId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NetworkUtils.isNetworkConnected() && PostsPreferences.isEnabled() && !Preferences.serverFeaturesDisable() && PostsPreferences.isGroupAd(ownerid)) {
|
||||||
|
VTExecutors.getIoScheduler().a(() -> {
|
||||||
|
boolean postIds = PostService.isPostAd(ownerid, postId);
|
||||||
|
|
||||||
|
if (postIds) {
|
||||||
|
PostsPreferences.saveAdPostInfo(ownerid, postId);
|
||||||
|
sendToast("Этот пост помечен как рекламный");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isPowerSaveMode() {
|
public static boolean isPowerSaveMode() {
|
||||||
|
|||||||
@@ -8,9 +8,6 @@ import org.json.JSONObject;
|
|||||||
import ru.vtosters.hooks.other.Preferences;
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
import ru.vtosters.lite.utils.AndroidUtils;
|
import ru.vtosters.lite.utils.AndroidUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.text.ParseException;
|
|
||||||
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.*;
|
import static ru.vtosters.hooks.other.Preferences.*;
|
||||||
import static ru.vtosters.lite.net.Request.makeRequest;
|
import static ru.vtosters.lite.net.Request.makeRequest;
|
||||||
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
|
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
|
||||||
|
|||||||
@@ -108,22 +108,22 @@ public class ProxyHook {
|
|||||||
|
|
||||||
RadioButton rgDefault = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
RadioButton rgDefault = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
||||||
RadioButton rgZaborona = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
RadioButton rgZaborona = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
||||||
RadioButton rgRandomProxy = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
// RadioButton rgRandomProxy = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
||||||
RadioButton rgVika = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
RadioButton rgVika = new RadioButton(new ContextThemeWrapper(ctx, com.vtosters.lite.R.style.Widget_AppCompat_CompoundButton_RadioButton));
|
||||||
|
|
||||||
SwitchHook.setCompoundButton(rgDefault);
|
SwitchHook.setCompoundButton(rgDefault);
|
||||||
SwitchHook.setCompoundButton(rgZaborona);
|
SwitchHook.setCompoundButton(rgZaborona);
|
||||||
SwitchHook.setCompoundButton(rgRandomProxy);
|
// SwitchHook.setCompoundButton(rgRandomProxy);
|
||||||
SwitchHook.setCompoundButton(rgVika);
|
SwitchHook.setCompoundButton(rgVika);
|
||||||
|
|
||||||
rg.addView(rgDefault);
|
rg.addView(rgDefault);
|
||||||
rg.addView(rgVika);
|
rg.addView(rgVika);
|
||||||
rg.addView(rgZaborona);
|
rg.addView(rgZaborona);
|
||||||
rg.addView(rgRandomProxy);
|
// rg.addView(rgRandomProxy);
|
||||||
|
|
||||||
rgDefault.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
rgDefault.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
||||||
rgZaborona.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
rgZaborona.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
||||||
rgRandomProxy.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
// rgRandomProxy.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
||||||
rgVika.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
rgVika.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp2px(14f));
|
||||||
|
|
||||||
rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
|
rg.setPadding(dp2px(18f), dp2px(12f), dp2px(18f), 0);
|
||||||
@@ -134,15 +134,15 @@ public class ProxyHook {
|
|||||||
rgZaborona.setText(ctx.getString(R.string.proxy_enable) + " (Zaborona)");
|
rgZaborona.setText(ctx.getString(R.string.proxy_enable) + " (Zaborona)");
|
||||||
rgZaborona.setTextColor(getTextAttr());
|
rgZaborona.setTextColor(getTextAttr());
|
||||||
|
|
||||||
rgRandomProxy.setText(ctx.getString(R.string.proxy_enable) + " (Random Socks Proxy)");
|
// rgRandomProxy.setText(ctx.getString(R.string.proxy_enable) + " (Random Socks Proxy)");
|
||||||
rgRandomProxy.setTextColor(getTextAttr());
|
// rgRandomProxy.setTextColor(getTextAttr());
|
||||||
|
|
||||||
rgVika.setText(ctx.getString(R.string.proxy_enable) + " (Vika Mobile)");
|
rgVika.setText(ctx.getString(R.string.proxy_enable) + " (Vika Mobile)");
|
||||||
rgVika.setTextColor(getTextAttr());
|
rgVika.setTextColor(getTextAttr());
|
||||||
|
|
||||||
rgZaborona.setChecked(isZaboronaEnabled());
|
rgZaborona.setChecked(isZaboronaEnabled());
|
||||||
rgDefault.setChecked(!isZaboronaEnabled() && !isRandomProxyEnabled() && !isVikaProxyEnabled());
|
rgDefault.setChecked(!isZaboronaEnabled() && !isRandomProxyEnabled() && !isVikaProxyEnabled());
|
||||||
rgRandomProxy.setChecked(isRandomProxyEnabled());
|
// rgRandomProxy.setChecked(isRandomProxyEnabled());
|
||||||
rgVika.setChecked(isVikaProxyEnabled());
|
rgVika.setChecked(isVikaProxyEnabled());
|
||||||
|
|
||||||
new VkAlertDialog.Builder(ctx)
|
new VkAlertDialog.Builder(ctx)
|
||||||
@@ -153,9 +153,9 @@ public class ProxyHook {
|
|||||||
if (rgZaborona.isChecked()) {
|
if (rgZaborona.isChecked()) {
|
||||||
Preferences.getPreferences().edit().putString("proxy", "zaborona").commit();
|
Preferences.getPreferences().edit().putString("proxy", "zaborona").commit();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
} else if (rgRandomProxy.isChecked()) {
|
// } else if (rgRandomProxy.isChecked()) {
|
||||||
Preferences.getPreferences().edit().putString("proxy", "randomproxy").commit();
|
// Preferences.getPreferences().edit().putString("proxy", "randomproxy").commit();
|
||||||
restartApplication();
|
// restartApplication();
|
||||||
} else if (rgVika.isChecked()) {
|
} else if (rgVika.isChecked()) {
|
||||||
Preferences.getPreferences().edit().putString("proxy", "vika").commit();
|
Preferences.getPreferences().edit().putString("proxy", "vika").commit();
|
||||||
restartApplication();
|
restartApplication();
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public class TogglesHook {
|
|||||||
postsredesign();
|
postsredesign();
|
||||||
case FEATURE_IMAGE_QUALITY_UPGRADE -> MediaImageEncoder.needToSkipCompression();
|
case FEATURE_IMAGE_QUALITY_UPGRADE -> MediaImageEncoder.needToSkipCompression();
|
||||||
case FEATURE_MENU_GAMES_CAROUSEL -> miniapps();
|
case FEATURE_MENU_GAMES_CAROUSEL -> miniapps();
|
||||||
|
case FEATURE_TRAFFIC_SAVER -> !disableForceTrafficSaver();
|
||||||
default -> true;
|
default -> true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ public class Preferences {
|
|||||||
|
|
||||||
GmsHook.fixGapps();
|
GmsHook.fixGapps();
|
||||||
ProxyUtils.setProxy();
|
ProxyUtils.setProxy();
|
||||||
NewsFeedFiltersUtils.setupFilters();
|
|
||||||
VTVerifications.load(application);
|
VTVerifications.load(application);
|
||||||
LifecycleUtils.registerActivities(application);
|
LifecycleUtils.registerActivities(application);
|
||||||
|
|
||||||
@@ -177,6 +176,10 @@ public class Preferences {
|
|||||||
return getBoolValue("miniapps", true);
|
return getBoolValue("miniapps", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean disableForceTrafficSaver() {
|
||||||
|
return getBoolValue("disableForceTrafficSaver", false);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean savemsgsett() {
|
public static boolean savemsgsett() {
|
||||||
return getBoolValue("savemsgsett", false);
|
return getBoolValue("savemsgsett", false);
|
||||||
}
|
}
|
||||||
@@ -267,7 +270,7 @@ public class Preferences {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean stories() {
|
public static boolean stories() {
|
||||||
return getBoolValue("stories", false);
|
return getBoolValue("stories", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean swipe() {
|
public static boolean swipe() {
|
||||||
@@ -292,7 +295,7 @@ public class Preferences {
|
|||||||
|
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
public static boolean checkupdates() {
|
public static boolean checkupdates() {
|
||||||
return !getBoolValue("isRoamingState", false) && isValidSignature() && BuildConfig.BUILD_TYPE.equals("release") && getBoolValue("autoupdates", true);
|
return !getBoolValue("isRoamingState", false) && isValidSignature() && BuildConfig.BUILD_TYPE.equals("release") && getBoolValue("autoupdates", true) && !serverFeaturesDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isNewBuild() {
|
public static boolean isNewBuild() {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.vk.dto.music.MusicTrack;
|
|||||||
import com.vk.dto.music.Playlist;
|
import com.vk.dto.music.Playlist;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
import ru.vtosters.hooks.music.MusicCacheFilesHook;
|
import ru.vtosters.hooks.music.MusicCacheFilesHook;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
import ru.vtosters.lite.music.cache.MusicCacheImpl;
|
import ru.vtosters.lite.music.cache.MusicCacheImpl;
|
||||||
import ru.vtosters.lite.music.callback.MusicCallbackBuilder;
|
import ru.vtosters.lite.music.callback.MusicCallbackBuilder;
|
||||||
import ru.vtosters.lite.music.converter.playlist.PlaylistConverter;
|
import ru.vtosters.lite.music.converter.playlist.PlaylistConverter;
|
||||||
@@ -32,13 +33,14 @@ import static ru.vtosters.lite.utils.AndroidUtils.getString;
|
|||||||
|
|
||||||
public class AudioDownloader {
|
public class AudioDownloader {
|
||||||
public static final ExecutorService executor = Executors.newCachedThreadPool();
|
public static final ExecutorService executor = Executors.newCachedThreadPool();
|
||||||
|
public static final String dlpath = Preferences.getBoolValue("dldir", false) ? Environment.DIRECTORY_DOWNLOADS : Environment.DIRECTORY_MUSIC;
|
||||||
|
|
||||||
public static void downloadPlaylist(Playlist playlist) {
|
public static void downloadPlaylist(Playlist playlist) {
|
||||||
var tracks = PlaylistConverter.getPlaylist(playlist);
|
var tracks = PlaylistConverter.getPlaylist(playlist);
|
||||||
|
|
||||||
var playlistName = IOUtils.getValidFileName(playlist.g);
|
var playlistName = IOUtils.getValidFileName(playlist.g);
|
||||||
|
|
||||||
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
|
var musicPath = Environment.getExternalStoragePublicDirectory(dlpath).getAbsolutePath();
|
||||||
var downloadPath = musicPath + File.separator + playlistName;
|
var downloadPath = musicPath + File.separator + playlistName;
|
||||||
|
|
||||||
var notificationId = playlistName.hashCode();
|
var notificationId = playlistName.hashCode();
|
||||||
@@ -104,7 +106,7 @@ public class AudioDownloader {
|
|||||||
|
|
||||||
var playlistName = "Audios of " + AccountManagerUtils.getUserId();
|
var playlistName = "Audios of " + AccountManagerUtils.getUserId();
|
||||||
|
|
||||||
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
|
var musicPath = Environment.getExternalStoragePublicDirectory(dlpath).getAbsolutePath();
|
||||||
var downloadPath = musicPath + File.separator + playlistName;
|
var downloadPath = musicPath + File.separator + playlistName;
|
||||||
|
|
||||||
PlaylistDownloader.downloadPlaylist(
|
PlaylistDownloader.downloadPlaylist(
|
||||||
@@ -121,7 +123,7 @@ public class AudioDownloader {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath();
|
var musicPath = Environment.getExternalStoragePublicDirectory(dlpath).getAbsolutePath();
|
||||||
var tempId = track.d;
|
var tempId = track.d;
|
||||||
var downloadPath = musicPath + File.separator;
|
var downloadPath = musicPath + File.separator;
|
||||||
var notification = MusicNotificationBuilder.buildDownloadNotification(track, tempId);
|
var notification = MusicNotificationBuilder.buildDownloadNotification(track, tempId);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.vk.dto.music.MusicTrack;
|
|||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
@@ -22,8 +23,8 @@ public class Genius {
|
|||||||
|
|
||||||
public static String getTextMusic(MusicTrack musictrack) {
|
public static String getTextMusic(MusicTrack musictrack) {
|
||||||
var uid = musictrack.y1();
|
var uid = musictrack.y1();
|
||||||
var artist = musictrack.C;
|
var artist = removeExtras(musictrack.C);
|
||||||
var title = musictrack.f;
|
var title = removeExtras(musictrack.f);
|
||||||
var duration = musictrack.h;
|
var duration = musictrack.h;
|
||||||
|
|
||||||
if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) {
|
if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) {
|
||||||
@@ -41,7 +42,7 @@ public class Genius {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Request request = new Request.a()
|
Request request = new Request.a()
|
||||||
.b(URL + "/search/multi?q=" + URLEncoder.encode(artist + " " + track) + "&from_background=0")
|
.b(URL + "/search/songs?q=" + URLEncoder.encode(artist + " " + track) + "&from_background=0" + "&page=1")
|
||||||
.a("User-Agent", "Genius/5.14.0 (Android; Android 13; Google Pixel 4 XL)")
|
.a("User-Agent", "Genius/5.14.0 (Android; Android 13; Google Pixel 4 XL)")
|
||||||
.a("Authorization", KEY)
|
.a("Authorization", KEY)
|
||||||
.a("x-genius-app-background-request", "0")
|
.a("x-genius-app-background-request", "0")
|
||||||
@@ -50,8 +51,8 @@ public class Genius {
|
|||||||
.a("Content-Type", "application/x-www-form-urlencoded")
|
.a("Content-Type", "application/x-www-form-urlencoded")
|
||||||
.b()
|
.b()
|
||||||
.a();
|
.a();
|
||||||
try {
|
try (Response resp = client.a(request).execute()) {
|
||||||
String payload = client.a(request).execute().a().g();
|
String payload = resp.a().g();
|
||||||
JSONArray sections = new JSONObject(payload).getJSONObject("response").getJSONArray("sections");
|
JSONArray sections = new JSONObject(payload).getJSONObject("response").getJSONArray("sections");
|
||||||
|
|
||||||
for (int i = 0; i < sections.length(); i++) {
|
for (int i = 0; i < sections.length(); i++) {
|
||||||
@@ -70,13 +71,19 @@ public class Genius {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return AndroidUtils.getString("error_no_text");
|
return AndroidUtils.getString("error_no_text");
|
||||||
} catch (JSONException | IOException e) {
|
} catch (JSONException | IOException e) {
|
||||||
return AndroidUtils.getString("error_no_text") + "\n\n" + AndroidUtils.getString(R.string.error) + ": \n" + e.getMessage();
|
return AndroidUtils.getString("error_no_text") + "\n\n" + AndroidUtils.getString(R.string.error) + ": \n" + e.getMessage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String removeExtras(String title) {
|
||||||
|
return title
|
||||||
|
.replaceAll("[\\[\\]]", "(")
|
||||||
|
.replaceAll("[()]", "")
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
private static String getText(String track) {
|
private static String getText(String track) {
|
||||||
Request request = new Request.a()
|
Request request = new Request.a()
|
||||||
.b(URL + track + "?text_format=plain")
|
.b(URL + track + "?text_format=plain")
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ public class MusicCacheDb extends SQLiteOpenHelper implements AutoCloseable { //
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(SQLiteDatabase db) {
|
public void onCreate(SQLiteDatabase db) {
|
||||||
db.execSQL(Constants.CREATE_QUERY);
|
db.execSQL(Constants.CREATE_QUERY);
|
||||||
@@ -104,11 +105,11 @@ public class MusicCacheDb extends SQLiteOpenHelper implements AutoCloseable { //
|
|||||||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
if (oldVersion < newVersion) {
|
if (oldVersion < newVersion) {
|
||||||
List<MusicTrack> tracks = getTracksWithCursor(db.query(Constants.TABLE_NAME, null, null, null, null, null, null));
|
List<MusicTrack> tracks = getTracksWithCursor(db.query(Constants.TABLE_NAME, null, null, null, null, null, null));
|
||||||
|
|
||||||
db.execSQL(Constants.DROP_QUERY);
|
db.execSQL(Constants.DROP_QUERY);
|
||||||
|
|
||||||
onCreate(db);
|
onCreate(db);
|
||||||
|
|
||||||
for (MusicTrack track : tracks) {
|
for (MusicTrack track : tracks) {
|
||||||
ContentValues vals = new ContentValues();
|
ContentValues vals = new ContentValues();
|
||||||
vals.put(Constants.COLUMN_TRACK_ID, track.y1());
|
vals.put(Constants.COLUMN_TRACK_ID, track.y1());
|
||||||
@@ -136,9 +137,9 @@ public class MusicCacheDb extends SQLiteOpenHelper implements AutoCloseable { //
|
|||||||
vals.put(Constants.COLUMN_EXPLICIT, Boolean.compare(explicit, true));
|
vals.put(Constants.COLUMN_EXPLICIT, Boolean.compare(explicit, true));
|
||||||
vals.put(Constants.COLUMN_DURATION, duration);
|
vals.put(Constants.COLUMN_DURATION, duration);
|
||||||
vals.put(Constants.COLUMN_HAS_ARTWORK, Boolean.compare(hasArtwork, true));
|
vals.put(Constants.COLUMN_HAS_ARTWORK, Boolean.compare(hasArtwork, true));
|
||||||
|
|
||||||
long row = getWritableDatabase().insert(Constants.TABLE_NAME, null, vals);
|
long row = getWritableDatabase().insert(Constants.TABLE_NAME, null, vals);
|
||||||
|
|
||||||
if (AndroidUtils.isDebuggable()) Log.d("MusicCacheDb", "addTrack(): " + row);
|
if (AndroidUtils.isDebuggable()) Log.d("MusicCacheDb", "addTrack(): " + row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import ru.vtosters.lite.music.downloader.M3UDownloader;
|
|||||||
import ru.vtosters.lite.utils.IOUtils;
|
import ru.vtosters.lite.utils.IOUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.text.Normalizer;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class FFMpeg {
|
public class FFMpeg {
|
||||||
@@ -33,9 +32,11 @@ public class FFMpeg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String setMetadata(MusicTrack track) {
|
private static String setMetadata(MusicTrack track) {
|
||||||
return Preferences.getBoolValue("setMetaData", false) ? " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"'
|
return Preferences.getBoolValue("setMetaData", true) ? " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"'
|
||||||
+ " -metadata artist=\"" + normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))) + '"'
|
+ (track.L == null || track.I == null
|
||||||
+ " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"' : "";
|
? " -metadata artist=\"" + normalizeMetadata(track.C) + '"'
|
||||||
|
: " -metadata artist=\"" + normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))) + '"'
|
||||||
|
+ " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"') : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String normalizeMetadata(String in) {
|
private static String normalizeMetadata(String in) {
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ public class M3UDownloader
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getTitle(MusicTrack track) {
|
public static String getTitle(MusicTrack track) {
|
||||||
return track.f + (!TextUtils.isEmpty(track.g) ? + '(' + track.g + ')' : "");
|
return track.f + (!TextUtils.isEmpty(track.g) ? +'(' + track.g + ')' : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static File getTsesDir(MusicTrack track) {
|
static File getTsesDir(MusicTrack track) {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package ru.vtosters.lite.net;
|
package ru.vtosters.lite.net;
|
||||||
|
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import ru.vtosters.lite.proxy.https.CustomHttps;
|
|||||||
import ru.vtosters.lite.proxy.socks.CustomSocks;
|
import ru.vtosters.lite.proxy.socks.CustomSocks;
|
||||||
import ru.vtosters.lite.proxy.socks.Zaborona;
|
import ru.vtosters.lite.proxy.socks.Zaborona;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
@@ -71,7 +70,8 @@ public class ProxyUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Boolean isRandomProxyEnabled() {
|
public static Boolean isRandomProxyEnabled() {
|
||||||
return Preferences.getString("proxy").equals("randomproxy");
|
// return Preferences.getString("proxy").equals("randomproxy");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Boolean isApiProxyEnabled() {
|
public static Boolean isApiProxyEnabled() {
|
||||||
@@ -129,11 +129,11 @@ public class ProxyUtils {
|
|||||||
return list.contains(":"); // proxy format: ip:port
|
return list.contains(":"); // proxy format: ip:port
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setProxy() throws IOException {
|
public static void setProxy() {
|
||||||
if (!isAnyProxyEnabled()) return;
|
if (!isAnyProxyEnabled()) return;
|
||||||
switch (Preferences.getString("proxy")) {
|
switch (Preferences.getString("proxy")) {
|
||||||
case "zaborona" -> Zaborona.loadProxy();
|
case "zaborona" -> Zaborona.loadProxy();
|
||||||
case "randomproxy" -> RandomProxy.loadProxy();
|
// case "randomproxy" -> RandomProxy.loadProxy();
|
||||||
case "socks" -> CustomSocks.loadProxy();
|
case "socks" -> CustomSocks.loadProxy();
|
||||||
case "http" -> CustomHttp.loadProxy();
|
case "http" -> CustomHttp.loadProxy();
|
||||||
case "https" -> CustomHttps.loadProxy();
|
case "https" -> CustomHttps.loadProxy();
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import org.json.JSONException;
|
|||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import ru.vtosters.lite.utils.AccountManagerUtils;
|
import ru.vtosters.lite.utils.AccountManagerUtils;
|
||||||
import ru.vtosters.lite.utils.AndroidUtils;
|
import ru.vtosters.lite.utils.AndroidUtils;
|
||||||
import ru.vtosters.lite.utils.VTVerifications;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
|
|
||||||
|
|
||||||
public class UsersList {
|
public class UsersList {
|
||||||
private static final String TAG = "UsersList";
|
private static final String TAG = "UsersList";
|
||||||
private static final List<Integer> descriptionsList = new ArrayList<>();
|
private static final List<Integer> descriptionsList = new ArrayList<>();
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package ru.vtosters.lite.ui.components;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import ru.vtosters.hooks.other.Preferences;
|
|
||||||
import ru.vtosters.lite.utils.AndroidUtils;
|
import ru.vtosters.lite.utils.AndroidUtils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ public class OTADialog extends ModalBottomSheetWrapper<OTADialog> implements OTA
|
|||||||
public void onUpdateLatest(boolean isManualCheck) {
|
public void onUpdateLatest(boolean isManualCheck) {
|
||||||
if (isManualCheck) {
|
if (isManualCheck) {
|
||||||
mActivity.runOnUiThread(() -> {
|
mActivity.runOnUiThread(() -> {
|
||||||
Toast.makeText(mActivity, "У вас установлена последняя версия приложения", Toast.LENGTH_SHORT).show();
|
Toast.makeText(mActivity, AndroidUtils.getString("update_latest"), Toast.LENGTH_SHORT).show();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,7 @@ public class OTADialog extends ModalBottomSheetWrapper<OTADialog> implements OTA
|
|||||||
@Override
|
@Override
|
||||||
public void onUpdateError() {
|
public void onUpdateError() {
|
||||||
mActivity.runOnUiThread(() -> {
|
mActivity.runOnUiThread(() -> {
|
||||||
Toast.makeText(mActivity, "Ошибка проверки обновления", Toast.LENGTH_SHORT).show();
|
Toast.makeText(mActivity, AndroidUtils.getString("update_err"), Toast.LENGTH_SHORT).show();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import androidx.preference.Preference;
|
|||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
import ru.vtosters.hooks.other.Preferences;
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.offline;
|
import static ru.vtosters.hooks.other.Preferences.offline;
|
||||||
|
|
||||||
public class ActivityFragment extends TrackedMaterialPreferenceToolbarFragment {
|
public class ActivityFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||||
|
|||||||
@@ -5,11 +5,8 @@ import android.app.Activity;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.View;
|
|
||||||
import android.view.WindowInsetsController;
|
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
import android.widget.RadioGroup;
|
import android.widget.RadioGroup;
|
||||||
@@ -66,14 +63,6 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme
|
|||||||
requireActivity().getWindow().setStatusBarColor(ThemesUtils.getBackgroundContent());
|
requireActivity().getWindow().setStatusBarColor(ThemesUtils.getBackgroundContent());
|
||||||
requireActivity().getWindow().setNavigationBarColor(ThemesUtils.getBackgroundContent());
|
requireActivity().getWindow().setNavigationBarColor(ThemesUtils.getBackgroundContent());
|
||||||
|
|
||||||
if (!ThemesUtils.isDarkTheme()) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
|
||||||
requireActivity().getWindow().getInsetsController().setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);
|
|
||||||
} else {
|
|
||||||
requireActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("data"));
|
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("data"));
|
||||||
|
|
||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
@@ -289,23 +278,39 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme
|
|||||||
|
|
||||||
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"analyticsDisabled",
|
"disableForceTrafficSaver",
|
||||||
AndroidUtils.getString("disable_analytics"),
|
AndroidUtils.getString("disable_roaming_state"),
|
||||||
AndroidUtils.getString("disable_analytics_summ"),
|
AndroidUtils.getString("disable_roaming_state_submit"),
|
||||||
null,
|
null,
|
||||||
false,
|
false,
|
||||||
(preference, o) -> {
|
(preference, o) -> {
|
||||||
Preferences.getPreferences().edit().putBoolean("analyticsDisabled", (boolean) o).apply();
|
Preferences.getPreferences().edit().putBoolean("disableForceTrafficSaver", (boolean) o).apply();
|
||||||
LifecycleUtils.restartApplicationWithTimer();
|
LifecycleUtils.restartApplicationWithTimer();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (!Preferences.serverFeaturesDisable()) {
|
||||||
|
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"analyticsDisabled",
|
||||||
|
AndroidUtils.getString("disable_analytics"),
|
||||||
|
AndroidUtils.getString("disable_analytics_summ"),
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
(preference, o) -> {
|
||||||
|
Preferences.getPreferences().edit().putBoolean("analyticsDisabled", (boolean) o).apply();
|
||||||
|
LifecycleUtils.restartApplicationWithTimer();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"serverFeaturesDisable",
|
"serverFeaturesDisable",
|
||||||
"Отключить всю работу с сервером",
|
AndroidUtils.getString("serverFeaturesDisable"),
|
||||||
"Отключает галочки и все дополнительные функции связанные с получением данных с сервера ВТостерс",
|
AndroidUtils.getString("serverFeaturesDisable_summ"),
|
||||||
null,
|
null,
|
||||||
false,
|
false,
|
||||||
(preference, o) -> {
|
(preference, o) -> {
|
||||||
@@ -314,8 +319,6 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
findPreference("analyticsDisabled").setVisible(Preferences.isValidSignature());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateCacheSize() {
|
private void updateCacheSize() {
|
||||||
|
|||||||
@@ -3,18 +3,16 @@ package ru.vtosters.lite.ui.fragments;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import androidx.preference.Preference;
|
|
||||||
import com.vk.core.dialogs.alert.VkAlertDialog;
|
import com.vk.core.dialogs.alert.VkAlertDialog;
|
||||||
import com.vk.newsfeed.NewsfeedSettingsFragment;
|
|
||||||
import com.vk.newsfeed.controllers.NewsfeedController;
|
import com.vk.newsfeed.controllers.NewsfeedController;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
import com.vtosters.lite.ui.SummaryListPreference;
|
import com.vtosters.lite.ui.SummaryListPreference;
|
||||||
import ru.vtosters.hooks.other.Preferences;
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
import ru.vtosters.lite.ui.components.NewsfeedListManager;
|
import ru.vtosters.lite.ui.components.NewsfeedListManager;
|
||||||
import ru.vtosters.lite.utils.NavigatorUtils;
|
import ru.vtosters.lite.utils.NavigatorUtils;
|
||||||
import ru.vtosters.lite.utils.NewsFeedFiltersUtils;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
|
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
|
||||||
|
|
||||||
@@ -27,18 +25,8 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void prefs() {
|
private void prefs() {
|
||||||
findPreference("officialnewssett").setOnPreferenceClickListener(preference -> {
|
findPreference("sponsorpost").setOnPreferenceClickListener(preference -> {
|
||||||
NavigatorUtils.switchFragment(requireContext(), NewsfeedSettingsFragment.class);
|
NavigatorUtils.switchFragment(requireContext(), SponsorPostFragment.class);
|
||||||
return true;
|
|
||||||
});
|
|
||||||
findPreference("cringecopyright").setEnabled(!Preferences.copyright_post());
|
|
||||||
|
|
||||||
var findPreference = (SummaryListPreference) findPreference("newsfeed_order");
|
|
||||||
findPreference.setValue(NewsfeedController.e.k() ? "top" : "recent");
|
|
||||||
findPreference.setOnPreferenceChangeListener((preference, o) -> {
|
|
||||||
NewsfeedController.e.a(0);
|
|
||||||
NewsfeedController.e.a((Boolean) Objects.equals(o, "top"));
|
|
||||||
NewsfeedController.e.b(true);
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -46,18 +34,12 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
findPreference("sourcenamefilter").setSummary(count(Preferences.getString("sourcenamefilter")));
|
findPreference("sourcenamefilter").setSummary(count(Preferences.getString("sourcenamefilter")));
|
||||||
findPreference("linkfilter").setSummary(count(Preferences.getString("linkfilter")));
|
findPreference("linkfilter").setSummary(count(Preferences.getString("linkfilter")));
|
||||||
|
|
||||||
findPreference("spamfilters").setOnPreferenceClickListener(preference -> {
|
SummaryListPreference findPreference = (SummaryListPreference) findPreference("newsfeed_order");
|
||||||
NewsFeedFiltersUtils.setupFilters();
|
findPreference.setValue(NewsfeedController.e.k() ? "top" : "recent");
|
||||||
return true;
|
findPreference.setOnPreferenceChangeListener((preference, o) -> {
|
||||||
});
|
NewsfeedController.e.a(0);
|
||||||
|
NewsfeedController.e.a((Boolean) Objects.equals(o, "top"));
|
||||||
findPreference("sourcenamefilter").setOnPreferenceClickListener(preference -> {
|
NewsfeedController.e.b(true);
|
||||||
NewsFeedFiltersUtils.setupFilters();
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
findPreference("linkfilter").setOnPreferenceClickListener(preference -> {
|
|
||||||
NewsFeedFiltersUtils.setupFilters();
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -85,7 +67,7 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
var str = Preferences.getPreferences().getString("news_feed_selected_items", "");
|
String str = Preferences.getPreferences().getString("news_feed_selected_items", "");
|
||||||
findPreference("newsfeedlistmanager").setSummary(
|
findPreference("newsfeedlistmanager").setSummary(
|
||||||
String.format(requireContext().getString(R.string.feed_hidden), (!TextUtils.isEmpty(str) ? str.split(",").length : 0))
|
String.format(requireContext().getString(R.string.feed_hidden), (!TextUtils.isEmpty(str) ? str.split(",").length : 0))
|
||||||
);
|
);
|
||||||
@@ -95,12 +77,17 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
boolean unlockCustomLists = Preferences.getBoolValue("unlockCustomLists", false);
|
||||||
|
|
||||||
|
findPreference("newsfeedlistmanager").setVisible(unlockCustomLists);
|
||||||
|
findPreference("newsfeedlistmanager_reset").setVisible(unlockCustomLists);
|
||||||
|
|
||||||
findPreference("feedcache").setVisible(!Preferences.getString("newsupdate").equals("no_update"));
|
findPreference("feedcache").setVisible(!Preferences.getString("newsupdate").equals("no_update"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String count(String text) {
|
private String count(String text) {
|
||||||
// count comma separated words in string
|
// count comma separated words in string
|
||||||
var count = text.split(", ").length;
|
int count = text.split(", ").length;
|
||||||
|
|
||||||
if (count < 1 || text.isEmpty()) {
|
if (count < 1 || text.isEmpty()) {
|
||||||
return requireContext().getString(R.string.feed_no_elements);
|
return requireContext().getString(R.string.feed_no_elements);
|
||||||
@@ -117,7 +104,6 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
.setPositiveButton(requireContext().getString(R.string.yes), (dialogInterface, i) -> {
|
.setPositiveButton(requireContext().getString(R.string.yes), (dialogInterface, i) -> {
|
||||||
Preferences.getPreferences().edit().remove(key).apply();
|
Preferences.getPreferences().edit().remove(key).apply();
|
||||||
sendToast(requireContext().getString(R.string.elements_deleted_success));
|
sendToast(requireContext().getString(R.string.elements_deleted_success));
|
||||||
NewsFeedFiltersUtils.setupFilters();
|
|
||||||
})
|
})
|
||||||
.setNegativeButton(requireContext().getString(R.string.cancel),
|
.setNegativeButton(requireContext().getString(R.string.cancel),
|
||||||
(dialogInterface, i) -> dialogInterface.dismiss())
|
(dialogInterface, i) -> dialogInterface.dismiss())
|
||||||
@@ -125,15 +111,16 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String countSet(String key) {
|
private String countSet(String key) {
|
||||||
var set = Preferences.getPreferences().getStringSet(key, null);
|
Set<String> set = Preferences.getPreferences().getStringSet(key, null);
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
|
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
for (var s : set) {
|
for (var s : set) {
|
||||||
str.append(s).append(", ");
|
str.append(s).append(", ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var count = str.toString().split(", ").length;
|
int count = str.toString().split(", ").length;
|
||||||
|
|
||||||
if (count < 1 || (str.length() == 0)) {
|
if (count < 1 || (str.length() == 0)) {
|
||||||
return requireContext().getString(R.string.feed_no_elements);
|
return requireContext().getString(R.string.feed_no_elements);
|
||||||
@@ -142,16 +129,8 @@ public class FeedFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceTreeClick(Preference preference) {
|
|
||||||
findPreference("cringecopyright").setEnabled(!Preferences.copyright_post());
|
|
||||||
NewsFeedFiltersUtils.setupFilters();
|
|
||||||
return super.onPreferenceTreeClick(preference);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int T4() {
|
public int T4() {
|
||||||
return R.string.vtlfeed;
|
return R.string.vtlfeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,9 +2,7 @@ package ru.vtosters.lite.ui.fragments;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import com.vk.core.dialogs.alert.VkAlertDialog;
|
import com.vk.core.dialogs.alert.VkAlertDialog;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
|
import ru.vtosters.lite.utils.AndroidUtils;
|
||||||
|
|
||||||
public class InstallGMSFragment extends TrackedMaterialPreferenceToolbarFragment {
|
public class InstallGMSFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||||
@Override
|
@Override
|
||||||
@@ -13,7 +14,7 @@ public class InstallGMSFragment extends TrackedMaterialPreferenceToolbarFragment
|
|||||||
addPreferencesFromResource(R.xml.preferences_gms);
|
addPreferencesFromResource(R.xml.preferences_gms);
|
||||||
|
|
||||||
findPreference("microg").setOnPreferenceClickListener((preference) -> {
|
findPreference("microg").setOnPreferenceClickListener((preference) -> {
|
||||||
String[] items = {"Уменьшенный MicroG (ReVanced)", "Альтернативный MicroG (ReVanced)", "Полноценный MicroG (Замена GMS)"};
|
String[] items = {AndroidUtils.getString("microg_dialog1"), AndroidUtils.getString("microg_dialog2"), AndroidUtils.getString("microg_dialog3")};
|
||||||
|
|
||||||
new VkAlertDialog.Builder(requireActivity()).setItems(items, (dialog, which) -> {
|
new VkAlertDialog.Builder(requireActivity()).setItems(items, (dialog, which) -> {
|
||||||
switch (which) {
|
switch (which) {
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ public class MediaFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
findPreference("lastfm_enabled").setEnabled(false);
|
findPreference("lastfm_enabled").setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findPreference("lastfm").setVisible(!Preferences.serverFeaturesDisable());
|
||||||
|
|
||||||
findPreference("cached_tracks").setSummary(String.format(requireContext().getString(R.string.cached_tracks_counter), MusicCacheImpl.getTracksCount()));
|
findPreference("cached_tracks").setSummary(String.format(requireContext().getString(R.string.cached_tracks_counter), MusicCacheImpl.getTracksCount()));
|
||||||
findPreference("cached_tracks").setOnPreferenceClickListener(preference -> {
|
findPreference("cached_tracks").setOnPreferenceClickListener(preference -> {
|
||||||
if (MusicCacheImpl.isEmpty()) {
|
if (MusicCacheImpl.isEmpty()) {
|
||||||
@@ -118,6 +120,8 @@ public class MediaFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
findPreference("useGenius").setVisible(!Preferences.serverFeaturesDisable());
|
||||||
|
|
||||||
findPreference("audio_download").setOnPreferenceClickListener(preference -> {
|
findPreference("audio_download").setOnPreferenceClickListener(preference -> {
|
||||||
dlaudio(requireContext());
|
dlaudio(requireContext());
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ public class MessagesFragment extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
|
|
||||||
findPreference("autotranslate").setEnabled(!Preferences.autoalltranslate());
|
findPreference("autotranslate").setEnabled(!Preferences.autoalltranslate());
|
||||||
|
|
||||||
|
findPreference("translators").setVisible(!Preferences.serverFeaturesDisable());
|
||||||
|
|
||||||
findPreference("lang_service").setOnPreferenceClickListener(preference -> {
|
findPreference("lang_service").setOnPreferenceClickListener(preference -> {
|
||||||
List<ImagineArrayAdapter.ImagineArrayAdapterItem> items = Arrays.asList(
|
List<ImagineArrayAdapter.ImagineArrayAdapterItem> items = Arrays.asList(
|
||||||
new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.ic_yandex_translate_icon, "Yandex Translate"),
|
new ImagineArrayAdapter.ImagineArrayAdapterItem(R.drawable.ic_yandex_translate_icon, "Yandex Translate"),
|
||||||
|
|||||||
@@ -16,8 +16,6 @@ import ru.vtosters.lite.ssfs.UsersList;
|
|||||||
import ru.vtosters.lite.ui.activities.VKAdminTokenActivity;
|
import ru.vtosters.lite.ui.activities.VKAdminTokenActivity;
|
||||||
import ru.vtosters.lite.utils.*;
|
import ru.vtosters.lite.utils.*;
|
||||||
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
|
|
||||||
|
|
||||||
public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||||
private static final int VK_ADMIN_TOKEN_REQUEST_CODE = 1;
|
private static final int VK_ADMIN_TOKEN_REQUEST_CODE = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -3,24 +3,19 @@ package ru.vtosters.lite.ui.fragments;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import static ru.vtosters.lite.proxy.RandomProxy.setupNewProxy;
|
|
||||||
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
|
|
||||||
|
|
||||||
public class ProxySettingsFragment extends TrackedMaterialPreferenceToolbarFragment {
|
public class ProxySettingsFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle bundle) {
|
public void onCreate(Bundle bundle) {
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
addPreferencesFromResource(R.xml.preferences_proxy);
|
addPreferencesFromResource(R.xml.preferences_proxy);
|
||||||
findPreference("random_proxy").setOnPreferenceClickListener(preference -> {
|
// findPreference("random_proxy").setOnPreferenceClickListener(preference -> {
|
||||||
try {
|
// try {
|
||||||
setupNewProxy();
|
// setupNewProxy();
|
||||||
} catch (IOException e) {
|
// } catch (IOException e) {
|
||||||
sendToast(requireContext().getString(R.string.get_proxy_error));
|
// sendToast(requireContext().getString(R.string.get_proxy_error));
|
||||||
}
|
// }
|
||||||
return true;
|
// return true;
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,148 @@
|
|||||||
|
package ru.vtosters.lite.ui.fragments;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
|
import ru.vtosters.hooks.other.ThemesUtils;
|
||||||
|
import ru.vtosters.lite.ui.PreferenceFragmentUtils;
|
||||||
|
import ru.vtosters.lite.utils.NetworkUtils;
|
||||||
|
import ru.vtosters.sponsorpost.data.Filter;
|
||||||
|
import ru.vtosters.sponsorpost.services.FilterService;
|
||||||
|
import ru.vtosters.sponsorpost.utils.FiltersPreferences;
|
||||||
|
import ru.vtosters.sponsorpost.utils.PostsPreferences;
|
||||||
|
import ru.vtosters.sponsorpost.utils.Updates;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static ru.vtosters.sponsorpost.utils.FiltersPreferences.*;
|
||||||
|
|
||||||
|
public class SponsorPostFragment extends TrackedMaterialPreferenceToolbarFragment {
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
addPreferencesFromResource(com.vtosters.lite.R.xml.empty);
|
||||||
|
|
||||||
|
requireActivity().getWindow().setStatusBarColor(ThemesUtils.getBackgroundContent());
|
||||||
|
requireActivity().getWindow().setNavigationBarColor(ThemesUtils.getBackgroundContent());
|
||||||
|
|
||||||
|
PreferenceFragmentUtils.addPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
"Что такое SponsorPost?",
|
||||||
|
"Функция SponsorPost предназначена для получения рекламных списков постов с сервера и актуальных списков слов и выражений для блокировки рекламных постов во ВКонтакте, которые не отмечены как рекламные.\n\nЭти фильтры и посты собираются людьми, что позволяет эффективно и своевременно выявлять и блокировать нежелательный контент в ленте пользователей. \uD83D\uDEAB\uD83D\uDCDD",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Sponsor Post");
|
||||||
|
|
||||||
|
if (Preferences.serverFeaturesDisable()) {
|
||||||
|
PreferenceFragmentUtils.addPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
"Фильтр постов отключен",
|
||||||
|
"Функция отключена в связи с тем что вы отключили сторонние подключения к серверам",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"sponsorpost",
|
||||||
|
"Фильтр постов",
|
||||||
|
"Получать списки рекламных постов в группах и ленте, которые не блокируются рекламными фильтрами",
|
||||||
|
null,
|
||||||
|
PostsPreferences.isEnabled(),
|
||||||
|
(preference, o) -> {
|
||||||
|
PostsPreferences.setEnabled((boolean) o);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
requireActivity().runOnUiThread(() -> {
|
||||||
|
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Sponsor Post Фильтры");
|
||||||
|
|
||||||
|
List<Filter> lists;
|
||||||
|
List<Filter> downloaded = FiltersPreferences.getAllDownloadedFilters();
|
||||||
|
|
||||||
|
if (!NetworkUtils.isNetworkConnected() || NetworkUtils.isInternetSlow()) {
|
||||||
|
lists = downloaded;
|
||||||
|
} else {
|
||||||
|
lists = FilterService.getFilters(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lists.isEmpty()) {
|
||||||
|
PreferenceFragmentUtils.addPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
"У вас не скачаны фильтры",
|
||||||
|
"Подключитесь к интернету и попробуйте войти ещё раз",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
if (Preferences.serverFeaturesDisable()) {
|
||||||
|
PreferenceFragmentUtils.addPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
"Отключены внешние подключения",
|
||||||
|
"Фильтры будут обновляться только при заходе в этот раздел, автоматические обновления списков фильтров и самих фильтров на запуске приложения отключены",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
for (var list : lists) {
|
||||||
|
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
list.getTitle(),
|
||||||
|
list.getSummary() + "\n\n" + "Версия фильтра: v" + list.getVersion(),
|
||||||
|
null,
|
||||||
|
getSavedKeyValue(list.getId()),
|
||||||
|
(preference, o) -> {
|
||||||
|
if ((boolean) o) {
|
||||||
|
saveFilter(list);
|
||||||
|
} else {
|
||||||
|
deleteFilter(list.getId());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!downloaded.isEmpty()) {
|
||||||
|
PreferenceFragmentUtils.addPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
"Количество правил",
|
||||||
|
"Используется " + FiltersPreferences.getFiltersLists().size() + " правил для фильтрации ленты",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PreferenceFragmentUtils.addPreference(
|
||||||
|
getPreferenceScreen(),
|
||||||
|
"",
|
||||||
|
"Исходники фильтров",
|
||||||
|
"Посмотреть исходники фильтров и их содержимое\n\nЕсли вы хотите помочь - вы можете предложить свои идеи для фильтров тут!",
|
||||||
|
null,
|
||||||
|
preference -> {
|
||||||
|
requireContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://github.com/vtosters/adlists")));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Updates.updateFilters();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int T4() {
|
||||||
|
return com.vtosters.lite.R.string.vtlfeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -87,7 +87,7 @@ public class SystemInfo extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
AndroidUtils.sendToast(requireContext().getString(R.string.copied_to_clipboard));
|
AndroidUtils.sendToast(requireContext().getString(R.string.copied_to_clipboard));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "Valid Signature", "Value: " + isValidSignature, 0, null);
|
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "Valid Signature", "Value: " + isValidSignature, 0, null);
|
||||||
|
|
||||||
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isTablet", "Value: " + isTablet, 0, null);
|
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isTablet", "Value: " + isTablet, 0, null);
|
||||||
|
|||||||
@@ -71,13 +71,6 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
return AndroidUtils.getString(strRes) + ": " + AndroidUtils.getString(R.string.vtlsettdisabled);
|
return AndroidUtils.getString(strRes) + ": " + AndroidUtils.getString(R.string.vtlsettdisabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSSFSsumm() {
|
|
||||||
if (Preferences.hasSpecialVerif())
|
|
||||||
return AndroidUtils.getString(R.string.vtlssfssumm) + ": " + AndroidUtils.getString(R.string.vtlsettverifyes);
|
|
||||||
|
|
||||||
return AndroidUtils.getString(R.string.vtlssfssumm) + ": " + AndroidUtils.getString(R.string.vtlsettverifno);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getTGSsumm() {
|
public static String getTGSsumm() {
|
||||||
return AndroidUtils.getString(R.string.vtltgssumm) + ": " + TelegramStickersService.getInstance(AndroidUtils.getGlobalContext()).getActivePacksListReference().size();
|
return AndroidUtils.getString(R.string.vtltgssumm) + ": " + TelegramStickersService.getInstance(AndroidUtils.getGlobalContext()).getActivePacksListReference().size();
|
||||||
}
|
}
|
||||||
@@ -196,14 +189,14 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((isLinksUnverified || isDozingAvailable || areNotificationsDisabled || isGMSNotInstalled) && !Preferences.getBoolValue("dialogrecomm", false)) {
|
if ((isLinksUnverified || isDozingAvailable || areNotificationsDisabled || isGMSNotInstalled) && !Preferences.getBoolValue("dialogrecomm", false)) {
|
||||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Рекомендации");
|
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("sett_recommendations"));
|
||||||
|
|
||||||
if (isGMSNotInstalled) {
|
if (isGMSNotInstalled) {
|
||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"",
|
"",
|
||||||
requireContext().getString(R.string.installgms),
|
requireContext().getString(R.string.installgms),
|
||||||
"Отсутствие этих сервисов приводит к поломке фоновых уведомлений и проблемам работы компонентов приложения",
|
AndroidUtils.getString("sett_nogms_summ"),
|
||||||
RecolorUtils.recolorDrawable(R.drawable.ic_logo_google_28, ThemesUtils.getColor(R.color.red)),
|
RecolorUtils.recolorDrawable(R.drawable.ic_logo_google_28, ThemesUtils.getColor(R.color.red)),
|
||||||
preference -> {
|
preference -> {
|
||||||
NavigatorUtils.switchFragment(requireContext(), InstallGMSFragment.class);
|
NavigatorUtils.switchFragment(requireContext(), InstallGMSFragment.class);
|
||||||
@@ -216,8 +209,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"",
|
"",
|
||||||
"Не выбраны ссылки для открытия приложением",
|
AndroidUtils.getString("sett_missing_links"),
|
||||||
"Это помешает открытию внешних ссылок для их открытия с помощью этого приложения\n\nВ некоторых случаях необходимо отключить открытие ссылок официальным приложениям ВКонтакте",
|
AndroidUtils.getString("sett_missing_links_summ"),
|
||||||
RecolorUtils.recolorDrawable(R.drawable.ic_linked_outline_28, ThemesUtils.getColor(R.color.red)),
|
RecolorUtils.recolorDrawable(R.drawable.ic_linked_outline_28, ThemesUtils.getColor(R.color.red)),
|
||||||
preference -> {
|
preference -> {
|
||||||
try {
|
try {
|
||||||
@@ -240,8 +233,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"",
|
"",
|
||||||
"Отключите экономию батареи",
|
AndroidUtils.getString("sett_battery"),
|
||||||
"Экономия батареи мешает получению фоновых сообщений, уведомлений и работе музыки" + (OEMDetector.isMIUI() ? "\n\nДля устройств Xiaomi необходимо вручную включить в настройках системы пункт Автозапуск данному приложению" : ""),
|
AndroidUtils.getString("sett_battery_summ1") + (OEMDetector.isMIUI() ? AndroidUtils.getString("sett_battery_summ2") : ""),
|
||||||
RecolorUtils.recolorDrawable(R.drawable.ic_filter_outline_28, ThemesUtils.getColor(R.color.red)),
|
RecolorUtils.recolorDrawable(R.drawable.ic_filter_outline_28, ThemesUtils.getColor(R.color.red)),
|
||||||
preference -> {
|
preference -> {
|
||||||
@SuppressLint("BatteryLife")
|
@SuppressLint("BatteryLife")
|
||||||
@@ -258,8 +251,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"",
|
"",
|
||||||
"Включите уведомления",
|
AndroidUtils.getString("sett_notifs"),
|
||||||
"Без включенных уведомлений не получится получать сообщения и многое другое",
|
AndroidUtils.getString("sett_notifs_summ"),
|
||||||
RecolorUtils.recolorDrawable(R.drawable.ic_notifications_outline_28, ThemesUtils.getColor(R.color.red)),
|
RecolorUtils.recolorDrawable(R.drawable.ic_notifications_outline_28, ThemesUtils.getColor(R.color.red)),
|
||||||
preference -> {
|
preference -> {
|
||||||
@SuppressLint("BatteryLife")
|
@SuppressLint("BatteryLife")
|
||||||
@@ -616,8 +609,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"",
|
"",
|
||||||
"Наши чаты",
|
AndroidUtils.getString("sett_chats"),
|
||||||
"Активные чаты по обсуждению модификации и многому другому",
|
AndroidUtils.getString("sett_chats_summ"),
|
||||||
R.drawable.ic_message_outline_28,
|
R.drawable.ic_message_outline_28,
|
||||||
preference -> {
|
preference -> {
|
||||||
var args = new Bundle();
|
var args = new Bundle();
|
||||||
@@ -635,8 +628,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"",
|
"",
|
||||||
"Наши сообщества",
|
AndroidUtils.getString("sett_community"),
|
||||||
"Самая свежая информация об обновлениях и не только!",
|
AndroidUtils.getString("sett_community_summ"),
|
||||||
R.drawable.users_3_outline_28,
|
R.drawable.users_3_outline_28,
|
||||||
preference -> {
|
preference -> {
|
||||||
var args = new Bundle();
|
var args = new Bundle();
|
||||||
@@ -675,7 +668,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Preferences.isValidSignature() && !BuildConfig.BUILD_TYPE.equals("dev")) {
|
if (Preferences.isValidSignature() && !BuildConfig.BUILD_TYPE.equals("dev") && !Preferences.serverFeaturesDisable()) {
|
||||||
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.updates));
|
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.updates));
|
||||||
|
|
||||||
PreferenceFragmentUtils.addPreference(
|
PreferenceFragmentUtils.addPreference(
|
||||||
@@ -693,8 +686,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
|
|||||||
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
PreferenceFragmentUtils.addMaterialSwitchPreference(
|
||||||
getPreferenceScreen(),
|
getPreferenceScreen(),
|
||||||
"autoupdates",
|
"autoupdates",
|
||||||
"Автоматическое обновление",
|
AndroidUtils.getString("sett_autoupdates"),
|
||||||
"Получать уведомление о выходе новой версии приложения",
|
AndroidUtils.getString("sett_autoupdates_summ"),
|
||||||
R.drawable.ic_history_outline_28,
|
R.drawable.ic_history_outline_28,
|
||||||
true,
|
true,
|
||||||
(preference, o) -> {
|
(preference, o) -> {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.aefyr.tsg.g2.TelegramStickersService;
|
|||||||
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
|
import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber;
|
||||||
import com.vk.core.dialogs.alert.VkAlertDialog;
|
import com.vk.core.dialogs.alert.VkAlertDialog;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
|
import ru.vtosters.hooks.other.Preferences;
|
||||||
import ru.vtosters.hooks.other.ThemesUtils;
|
import ru.vtosters.hooks.other.ThemesUtils;
|
||||||
import ru.vtosters.lite.tgs.TGPref;
|
import ru.vtosters.lite.tgs.TGPref;
|
||||||
import ru.vtosters.lite.ui.adapters.StickerPackAdapter;
|
import ru.vtosters.lite.ui.adapters.StickerPackAdapter;
|
||||||
@@ -55,28 +56,30 @@ public class StickersFragment extends BaseToolbarFragment {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private static void resetToken(Context ctx) {
|
private static void resetToken(Context ctx) {
|
||||||
if (TGPref.getTGBotKey() == null) AndroidUtils.sendToast("Токен отсутствует");
|
if (TGPref.getTGBotKey() == null) AndroidUtils.sendToast(AndroidUtils.getString("tgs_token_missing"));
|
||||||
new VkAlertDialog.Builder(ctx)
|
new VkAlertDialog.Builder(ctx)
|
||||||
.setTitle("Сбросить токен бота?")
|
.setTitle(AndroidUtils.getString("tgs_token_reset_dialog"))
|
||||||
.setNegativeButton(R.string.cancel, (dialog, which) -> {
|
.setNegativeButton(R.string.cancel, (dialog, which) -> {
|
||||||
dialog.cancel();
|
dialog.cancel();
|
||||||
})
|
})
|
||||||
.setPositiveButton(R.string.ok, (dialog, which) -> {
|
.setPositiveButton(R.string.ok, (dialog, which) -> {
|
||||||
TGPref.setTGBotKey(null);
|
TGPref.setTGBotKey(null);
|
||||||
AndroidUtils.sendToast("Токен бота сброшен");
|
AndroidUtils.sendToast(AndroidUtils.getString("tgs_token_reset"));
|
||||||
})
|
})
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreateMenu(Menu menu) {
|
protected void onCreateMenu(Menu menu) {
|
||||||
menu.add(0, 0, 0, "")
|
if (!Preferences.serverFeaturesDisable()) {
|
||||||
.setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_add_outline_28)))
|
menu.add(0, 0, 0, "")
|
||||||
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
.setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_add_outline_28)))
|
||||||
menu.add(0, 1, 0, "")
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||||
.setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_refresh_outline_28)))
|
menu.add(0, 1, 0, "")
|
||||||
.setTitle("Сбросить токен бота")
|
.setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_refresh_outline_28)))
|
||||||
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
.setTitle(AndroidUtils.getString("tgs_token_reset_menu"))
|
||||||
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||||
|
}
|
||||||
super.onCreateMenu(menu);
|
super.onCreateMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package ru.vtosters.lite.ui.wallpapers;
|
package ru.vtosters.lite.ui.wallpapers;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import ru.vtosters.lite.ui.fragments.TrackedMaterialPreferenceToolbarFragment;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class AnalyticsHelper {
|
public class AnalyticsHelper {
|
||||||
private static final boolean analyticsDisabled = Preferences.getBoolValue("analyticsDisabled", false);
|
private static final boolean analyticsDisabled = Preferences.getBoolValue("analyticsDisabled", false) || Preferences.serverFeaturesDisable();
|
||||||
|
|
||||||
private static final String key = BuildConfig.APPCENTER_KEY;
|
private static final String key = BuildConfig.APPCENTER_KEY;
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import androidx.annotation.StringRes;
|
|||||||
import androidx.core.app.NotificationManagerCompat;
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
import com.vk.core.util.ToastUtils;
|
import com.vk.core.util.ToastUtils;
|
||||||
import com.vtosters.lite.general.fragments.WebViewFragment;
|
import com.vtosters.lite.general.fragments.WebViewFragment;
|
||||||
import ru.vtosters.hooks.other.Preferences;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@@ -33,12 +32,6 @@ import java.util.Random;
|
|||||||
|
|
||||||
public class AndroidUtils {
|
public class AndroidUtils {
|
||||||
private static final String ALLOWED_CHARACTERS = "0123456789qwertyuiopasdfghjklzxcvbnm";
|
private static final String ALLOWED_CHARACTERS = "0123456789qwertyuiopasdfghjklzxcvbnm";
|
||||||
public enum ScreenSize {
|
|
||||||
small,
|
|
||||||
normal,
|
|
||||||
large,
|
|
||||||
xlarge
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isDebuggable() {
|
public static boolean isDebuggable() {
|
||||||
return 0 != (AndroidUtils.getGlobalContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE);
|
return 0 != (AndroidUtils.getGlobalContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE);
|
||||||
@@ -224,4 +217,11 @@ public class AndroidUtils {
|
|||||||
public static String upString(String s) {
|
public static String upString(String s) {
|
||||||
return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
|
return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ScreenSize {
|
||||||
|
small,
|
||||||
|
normal,
|
||||||
|
large,
|
||||||
|
xlarge
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,526 +0,0 @@
|
|||||||
package ru.vtosters.lite.utils;
|
|
||||||
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import ru.vtosters.hooks.other.Preferences;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import static ru.vtosters.hooks.other.Preferences.*;
|
|
||||||
import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext;
|
|
||||||
|
|
||||||
public class NewsFeedFiltersUtils {
|
|
||||||
public static List<String> mFilters = new ArrayList<>();
|
|
||||||
public static List<String> mFiltersNames = new ArrayList<>();
|
|
||||||
public static List<String> mFiltersLinks = new ArrayList<>();
|
|
||||||
|
|
||||||
public static void setupFilters() {
|
|
||||||
getFilter("refsfilter", "Referals.txt", mFilters);
|
|
||||||
getFilter("shortlinkfilter", "LinkShorter.txt", mFilters);
|
|
||||||
getFilter("default_ad_list", "StandartFilter.txt", mFilters);
|
|
||||||
getFilter("shitposting", "IDontWantToReadIt.txt", mFilters);
|
|
||||||
getFilter("cringecopyright", "CopyrightAds.txt", mFiltersLinks);
|
|
||||||
|
|
||||||
setCustomFilters(mFilters, getString("spamfilters"));
|
|
||||||
setCustomFilters(mFiltersNames, getString("sourcenamefilter"));
|
|
||||||
setCustomFilters(mFiltersLinks, getString("linkfilter"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get needed filter list from assets
|
|
||||||
public static void getFilter(String boolname, String filename, List<String> list) {
|
|
||||||
if (getBoolValue(boolname, false)) {
|
|
||||||
try (Scanner scanner = new Scanner(getGlobalContext().getAssets().open(filename))) {
|
|
||||||
while (scanner.hasNextLine()) {
|
|
||||||
addNonEmptyLineToList(scanner.nextLine(), list);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.d("NewsFeedFiltersUtils", e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void addNonEmptyLineToList(String line, List<String> list) {
|
|
||||||
if (!line.isEmpty()) {
|
|
||||||
list.add(line.toLowerCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setCustomFilters(List<String> list, String filters) {
|
|
||||||
if (!filters.isEmpty()) list.addAll(Arrays.asList(filters.toLowerCase().split(", ")));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean injectFiltersReposts(JSONObject obj) {
|
|
||||||
if (obj.has("copy_history")) {
|
|
||||||
var copyHistoryNode = obj.optJSONArray("copy_history");
|
|
||||||
if (copyHistoryNode != null && copyHistoryNode.length() != 0) {
|
|
||||||
for (int i = 0; i < copyHistoryNode.length(); i++) {
|
|
||||||
var item = copyHistoryNode.optJSONObject(i);
|
|
||||||
var text = item.optString("text");
|
|
||||||
|
|
||||||
if (isBadNews(text)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("RepostFilter", "Fetched repost ad (isBadNews), owner id " + item.optString("owner_id") + ", text: " + text);
|
|
||||||
return true;
|
|
||||||
} else if (isAds(item, item.optString("post_type"))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("RepostFilter", "Fetched repost ad (ads), owner id " + item.optString("owner_id") + ", text: " + text);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mFiltersLinks != null && getBoolValue("cringerepost", false)) {
|
|
||||||
for (String filter : mFiltersLinks) {
|
|
||||||
if (text.contains(filter)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("RepostFilter", "Fetched repost ad, owner id " + item.optString("owner_id") + ", text: " + text);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean checkCopyright(JSONObject json) throws JSONException {
|
|
||||||
if (json.has("copyright")) {
|
|
||||||
if (copyright_post()) return true;
|
|
||||||
|
|
||||||
JSONObject copyright = json.optJSONObject("copyright");
|
|
||||||
String copyrightName = null;
|
|
||||||
String copyrightLink = null;
|
|
||||||
|
|
||||||
if (copyright != null) {
|
|
||||||
copyrightName = copyright.getString("name").toLowerCase();
|
|
||||||
copyrightLink = copyright.getString("link").toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mFiltersNames != null) {
|
|
||||||
for (String filter : mFiltersNames) {
|
|
||||||
if (copyrightName != null && copyrightName.contains(filter)) return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mFiltersLinks != null) {
|
|
||||||
for (String filter : mFiltersLinks) {
|
|
||||||
if (copyrightLink != null && copyrightLink.contains(filter)) return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isBadNews(String text) {
|
|
||||||
var textInLowerCase = text.toLowerCase();
|
|
||||||
|
|
||||||
if (mFilters != null) {
|
|
||||||
for (String filter : mFilters) {
|
|
||||||
if (textInLowerCase.contains(filter)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", text);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean checkCaption(JSONObject postJson) {
|
|
||||||
if (postJson.has("caption")) {
|
|
||||||
if (captions()) return true;
|
|
||||||
var caption = postJson.optJSONObject("caption");
|
|
||||||
if (postsrecomm()) {
|
|
||||||
try {
|
|
||||||
if (caption != null) {
|
|
||||||
String type = caption.getString("type");
|
|
||||||
return type.equals("explorebait") || // Может быть интересно
|
|
||||||
type.equals("shared") || // Поделился записью
|
|
||||||
type.equals("digest") || // Рекомедации
|
|
||||||
type.equals("commented") || // Комментирует
|
|
||||||
type.equals("voted"); // Проголосовал в опросе
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
Log.d("checkCaption", "Caption error");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static JSONArray newsfeedlist(JSONArray items) throws JSONException {
|
|
||||||
var selectedItems = Preferences.getPreferences().getString("news_feed_selected_items", "");
|
|
||||||
var filtersSet = Preferences.getPreferences().getStringSet("news_feed_items_set", null);
|
|
||||||
var mutableFiltersSet = new LinkedHashSet<String>();
|
|
||||||
if (filtersSet != null)
|
|
||||||
mutableFiltersSet.addAll(filtersSet);
|
|
||||||
|
|
||||||
for (int i = 0; i < items.length(); i++) {
|
|
||||||
var item = items.optJSONObject(i);
|
|
||||||
if (item == null) continue;
|
|
||||||
|
|
||||||
var id = item.optString("id");
|
|
||||||
var title = item.optString("title");
|
|
||||||
|
|
||||||
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)
|
|
||||||
// these items not working
|
|
||||||
|| id.equals("kpop") || id.equals("foryou")
|
|
||||||
|| id.equals("qazaqstan") || id.equals("podcasts"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
mutableFiltersSet.add(id + "|" + title);
|
|
||||||
|
|
||||||
var hide = selectedItems.contains(id);
|
|
||||||
|
|
||||||
Log.d("NewsfeedList", "Added list " + id + " to feed");
|
|
||||||
item.put("is_hidden", hide)
|
|
||||||
.put("is_unavailable", hide);
|
|
||||||
Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list");
|
|
||||||
}
|
|
||||||
|
|
||||||
Preferences.getPreferences().edit().putStringSet("news_feed_items_set", mutableFiltersSet).apply();
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean discoverAdBlock(JSONObject jsonObject) {
|
|
||||||
if (jsonObject == null) return true;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var type = jsonObject.optString("type");
|
|
||||||
var post = jsonObject.optJSONObject("post");
|
|
||||||
|
|
||||||
if (jsonObject.optString("template").contains("ads") || jsonObject.has("ads")) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: ads");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isAds(post, type)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (authorsrecomm() && (type.equals("authors_rec")
|
|
||||||
|| type.startsWith("recommended_") && (type.endsWith("audios")
|
|
||||||
|| type.endsWith("artists")
|
|
||||||
|| type.endsWith("playlists")
|
|
||||||
|| type.endsWith("groups")))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: authorsrecomm");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: postsrecomm");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + (post != null ? post.optInt("post_id") : 0) + " from discover, Reason: friendsrecomm");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adsgroup() && (post != null ? post.optInt("marked_as_ads") : 0) == 1 && !isWhitelistedAd(post)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: marked_as_ads is true");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (post != null) {
|
|
||||||
if (isBadNews(post.optString("text")) && !isWhitelistedFilters(post)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: text filters");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkCopyright(post)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: copyright filters");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkCaption(post)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: caption filters");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NewsFeedFiltersUtils.injectFiltersReposts(post) && !isWhitelistedFilters(post)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + post.optInt("post_id") + " from discover, Reason: repost ad");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.d("NewsfeedAdBlockV2", "discover: " + e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void parseStoriesItem(JSONObject item) throws JSONException {
|
|
||||||
var stories = item.optJSONArray("stories");
|
|
||||||
var newStories = new JSONArray();
|
|
||||||
|
|
||||||
if (stories == null) return;
|
|
||||||
|
|
||||||
for (int j = 0; j < stories.length(); j++) {
|
|
||||||
var story = stories.optJSONObject(j);
|
|
||||||
|
|
||||||
if (!story.optBoolean("is_ads") && !story.optBoolean("is_promo")) {
|
|
||||||
if (isStoryNotAd(story)) {
|
|
||||||
newStories.put(story);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (dev())
|
|
||||||
Log.d("StoriesAds", "Fetched ad, owner id " + story.optString("owner_id") + ", caption " + story.optString("caption"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item.put("stories", newStories);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Boolean isStoryNotAd(JSONObject json) {
|
|
||||||
return !getBoolValue("storiesGroupsAdBlock", false) || (json.has("link") ? isWhitelistedAdStories(json) : true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean isAds(JSONObject list, String type) {
|
|
||||||
if (list == null || type == null || !ads()) return false;
|
|
||||||
|
|
||||||
if (list.has("ads")
|
|
||||||
|| type.equals("ads")
|
|
||||||
|| type.equals("carousel")
|
|
||||||
|| type.equals("html5_ad")
|
|
||||||
|| type.equals("ads_easy_promote")) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: ads");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type.equals("promo_button")
|
|
||||||
|| type.equals("app_widget")
|
|
||||||
|| type.equals("app_video")
|
|
||||||
|| type.equals("app_slider")
|
|
||||||
|| type.equals("tags_suggestions")) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: promo");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean isWhitelistedFilters(JSONObject list) {
|
|
||||||
var id = String.valueOf(list.optInt("owner_id"));
|
|
||||||
|
|
||||||
if (id.equals("0")) {
|
|
||||||
id = String.valueOf(list.optInt("source_id"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id.equals("-189659924") || id.equals(String.valueOf(AccountManagerUtils.getUserId()))) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var whitelist = Preferences.getPreferences().getStringSet(
|
|
||||||
"whitelisted_filters_groups",
|
|
||||||
Collections.emptySet()
|
|
||||||
);
|
|
||||||
|
|
||||||
return Preferences.getBoolValue("invertFilters", false) != whitelist.contains(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean isWhitelistedAd(JSONObject list) {
|
|
||||||
var id = String.valueOf(list.optInt("owner_id"));
|
|
||||||
|
|
||||||
if (id.equals("0")) {
|
|
||||||
id = String.valueOf(list.optInt("source_id"));
|
|
||||||
}
|
|
||||||
|
|
||||||
var whitelist = Preferences.getPreferences().getStringSet(
|
|
||||||
"whitelisted_ad_groups",
|
|
||||||
Collections.emptySet()
|
|
||||||
);
|
|
||||||
|
|
||||||
return whitelist.contains(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean isWhitelistedAdStories(JSONObject list) {
|
|
||||||
var id = String.valueOf(list.optInt("owner_id"));
|
|
||||||
|
|
||||||
var whitelist = Preferences.getPreferences().getStringSet(
|
|
||||||
"whitelisted_stories_ad",
|
|
||||||
Collections.emptySet()
|
|
||||||
);
|
|
||||||
|
|
||||||
return whitelist.contains(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean hasMiniAppAds(JSONObject list) {
|
|
||||||
var attachments = list.optJSONArray("attachments");
|
|
||||||
|
|
||||||
if (attachments != null && getBoolValue("blockminiapps", false)) {
|
|
||||||
for (int j = 0; j < attachments.length(); j++) {
|
|
||||||
String type = attachments.optJSONObject(j).optString("type");
|
|
||||||
if (type.contains("mini_app")) return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static JSONObject discoverInject(JSONObject json) throws JSONException {
|
|
||||||
var items = json.optJSONArray("items");
|
|
||||||
var newObj = new JSONArray();
|
|
||||||
|
|
||||||
for (int i = 0; i < (items != null ? items.length() : 0); i++) {
|
|
||||||
try {
|
|
||||||
JSONObject curr = items.getJSONObject(i);
|
|
||||||
if (!curr.optString("template").contains("info") && discoverAdBlock(curr)) {
|
|
||||||
newObj.put(items.optJSONObject(i));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.d("NewsfeedAdBlockV2", "discover: " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
json.put("items", newObj);
|
|
||||||
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static JSONArray feedInject(JSONArray items) {
|
|
||||||
if (items.length() == 0) return items;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var newItems = new JSONArray();
|
|
||||||
|
|
||||||
for (int j = 0; j < items.length(); j++) {
|
|
||||||
JSONObject list = items.optJSONObject(j);
|
|
||||||
|
|
||||||
if (list == null) continue;
|
|
||||||
|
|
||||||
String type = list.optString("type");
|
|
||||||
|
|
||||||
if (isAds(list, type)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (authorsrecomm() && (type.equals("authors_rec")
|
|
||||||
|| type.startsWith("recommended_") && (type.endsWith("audios")
|
|
||||||
|| type.endsWith("artists")
|
|
||||||
|| type.endsWith("playlists")
|
|
||||||
|| type.endsWith("groups")))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: authorsrecomm");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: postsrecomm");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: friendsrecomm");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adsgroup() && list.optInt("marked_as_ads") == 1 && !isWhitelistedAd(list)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: marked_as_ads is true");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isBadNews(list.optString("text")) && !isWhitelistedFilters(list)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: text filters");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkCopyright(list)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: copyright filters");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkCaption(list)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: caption filters");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasMiniAppAds(list) && !isWhitelistedFilters(list)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: MiniApp filters");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (NewsFeedFiltersUtils.injectFiltersReposts(list) && !isWhitelistedFilters(list)) {
|
|
||||||
if (dev())
|
|
||||||
Log.d("NewsfeedAdBlockV2", "Removed post " + list.optInt("post_id") + " from feed, Reason: repost ad");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Log.d("RepostInj", ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
newItems.put(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
return newItems;
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.d("NewsfeedAdBlockV2", e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static JSONObject storiesads(JSONObject json, boolean isDeleteFix) throws JSONException {
|
|
||||||
if (!adsstories()) {
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (json.has("ads")) {
|
|
||||||
JSONObject ad = json.optJSONObject("ads");
|
|
||||||
if (isDeleteFix) {
|
|
||||||
if (ad != null) {
|
|
||||||
ad.optJSONObject("settings")
|
|
||||||
.put("stories_interval", 0)
|
|
||||||
.put("authors_interval", 0)
|
|
||||||
.put("time_interval", 0)
|
|
||||||
.put("stories_init", 0)
|
|
||||||
.put("authors_init", 0)
|
|
||||||
.put("time_init", 0);
|
|
||||||
}
|
|
||||||
if (dev()) Log.d("StoriesAds", "Set ads settings at zero values");
|
|
||||||
} else {
|
|
||||||
json.remove("ads");
|
|
||||||
if (dev()) Log.d("StoriesAds", "Removed ads block");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray items = json.optJSONArray("items");
|
|
||||||
if (items != null) {
|
|
||||||
for (int i = 0; i < items.length(); i++) {
|
|
||||||
JSONObject item = items.optJSONObject(i);
|
|
||||||
if (item != null) {
|
|
||||||
parseStoriesItem(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -24,6 +24,8 @@ public class WebViewColoringUtils {
|
|||||||
.replace("%button_primary_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_primary_background)))
|
.replace("%button_primary_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_primary_background)))
|
||||||
.replace("%button_outline_foreground%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_foreground)))
|
.replace("%button_outline_foreground%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_foreground)))
|
||||||
.replace("%button_outline_border%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_border)))
|
.replace("%button_outline_border%", hex(getColorFromAttr(com.vtosters.lite.R.attr.button_outline_border)))
|
||||||
|
.replace("%field_background%", hex(getColorFromAttr(com.vtosters.lite.R.attr.field_background)))
|
||||||
|
.replace("%field_border%", hex(getColorFromAttr(com.vtosters.lite.R.attr.field_border)))
|
||||||
.replace("%text_primary%", hex(getTextAttr()));
|
.replace("%text_primary%", hex(getTextAttr()));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -0,0 +1,444 @@
|
|||||||
|
package ru.vtosters.lite.utils.newsfeed;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import ru.vtosters.lite.utils.AccountManagerUtils;
|
||||||
|
import ru.vtosters.sponsorpost.utils.FiltersPreferences;
|
||||||
|
import ru.vtosters.sponsorpost.utils.PostsPreferences;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static ru.vtosters.hooks.other.Preferences.*;
|
||||||
|
import static ru.vtosters.lite.utils.AndroidUtils.sendToast;
|
||||||
|
|
||||||
|
public class NewsFeedFiltersUtils {
|
||||||
|
private static final String[] CUSTOM_FILTERS = {"spamfilters", "sourcenamefilter", "linkfilter"};
|
||||||
|
private static final String[] EXCLUDED_ITEMS = {"kpop", "foryou", "qazaqstan", "podcasts"};
|
||||||
|
private static final Set<String> filters = new HashSet<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
updateFilters();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateFilters() {
|
||||||
|
filters.clear();
|
||||||
|
|
||||||
|
filters.addAll(FiltersPreferences.getFiltersLists());
|
||||||
|
|
||||||
|
for (String customFilter : CUSTOM_FILTERS) {
|
||||||
|
List<String> lists = List.of(getString(customFilter).toLowerCase().split("\\s*,\\s*"));
|
||||||
|
filters.addAll(lists);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean injectFiltersReposts(JSONObject obj) {
|
||||||
|
if (obj.has("copy_history")) {
|
||||||
|
JSONArray copyHistoryNode = obj.optJSONArray("copy_history");
|
||||||
|
if (copyHistoryNode != null && copyHistoryNode.length() != 0) {
|
||||||
|
return IntStream.range(0, copyHistoryNode.length())
|
||||||
|
.mapToObj(copyHistoryNode::optJSONObject)
|
||||||
|
.anyMatch(item -> {
|
||||||
|
String text = item.optString("text");
|
||||||
|
String postType = item.optString("post_type");
|
||||||
|
if (sponsorFilters(text)) {
|
||||||
|
logRemovedPost(item, "repost", "sponsorpost filters", false);
|
||||||
|
return true;
|
||||||
|
} else if (isAds(item, postType)) {
|
||||||
|
logRemovedPost(item, "repost", "ads", false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkCopyright(JSONObject json) throws JSONException {
|
||||||
|
if (json.has("copyright")) {
|
||||||
|
if (copyright_post()) return true;
|
||||||
|
|
||||||
|
Set<String> list = filters.stream()
|
||||||
|
.filter(filter -> !filter.isEmpty())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
if (!list.isEmpty()) {
|
||||||
|
JSONObject copyRight = json.optJSONObject("copyright");
|
||||||
|
if (copyRight != null) {
|
||||||
|
String name = copyRight.getString("name").toLowerCase();
|
||||||
|
String link = copyRight.getString("link").toLowerCase();
|
||||||
|
return list.stream().anyMatch(filter -> name.contains(filter.toLowerCase()) || link.contains(filter.toLowerCase()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkCaption(JSONObject postJson) {
|
||||||
|
if (postJson.has("caption")) {
|
||||||
|
if (captions()) return true;
|
||||||
|
|
||||||
|
JSONObject caption = postJson.optJSONObject("caption");
|
||||||
|
|
||||||
|
if (postsrecomm() && caption != null) {
|
||||||
|
try {
|
||||||
|
String type = caption.getString("type");
|
||||||
|
Set<String> recommTypes = Set.of("explorebait", "shared", "digest", "commented", "voted");
|
||||||
|
|
||||||
|
return recommTypes.stream().anyMatch(type::equals);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.d("checkCaption", "Caption error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONArray setNewsfeedLists(JSONArray items) throws JSONException {
|
||||||
|
String selectedItems = getPreferences().getString("news_feed_selected_items", "");
|
||||||
|
Set<String> filtersSet = getPreferences().getStringSet("news_feed_items_set", null);
|
||||||
|
LinkedHashSet<String> mutableFiltersSet = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
if (filtersSet != null) {
|
||||||
|
mutableFiltersSet.addAll(filtersSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < items.length(); i++) {
|
||||||
|
JSONObject item = items.optJSONObject(i);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String id = item.optString("id");
|
||||||
|
String title = item.optString("title");
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title) || isExcluded(id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutableFiltersSet.add(id + "|" + title);
|
||||||
|
|
||||||
|
boolean hide = selectedItems.contains(id);
|
||||||
|
|
||||||
|
Log.d("NewsfeedList", "Added list " + id + " to feed");
|
||||||
|
|
||||||
|
item.put("is_hidden", hide).put("is_unavailable", hide);
|
||||||
|
}
|
||||||
|
|
||||||
|
getPreferences().edit().putStringSet("news_feed_items_set", mutableFiltersSet).apply();
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isExcluded(String id) {
|
||||||
|
return Arrays.asList(EXCLUDED_ITEMS).contains(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean discoverAdBlock(JSONObject jsonObject) {
|
||||||
|
if (jsonObject == null) return true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONObject post = jsonObject.optJSONObject("post");
|
||||||
|
|
||||||
|
boolean hasAds = jsonObject.optString("template").contains("ads");
|
||||||
|
boolean hasInfo = jsonObject.optString("template").contains("info");
|
||||||
|
|
||||||
|
if (hasAds || hasInfo || post == null) {
|
||||||
|
Log.d("NewsfeedAdBlockV2", "Removed " + (hasAds ? "ads" : "info") + " template in discover");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return needToSave(post, "discover", false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d("NewsfeedAdBlockV2", "discover crash: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONObject discoverInject(JSONObject json) throws JSONException {
|
||||||
|
JSONArray items = json.optJSONArray("items");
|
||||||
|
JSONArray newObj = new JSONArray();
|
||||||
|
|
||||||
|
for (int i = 0; i < (items != null ? items.length() : 0); i++) {
|
||||||
|
try {
|
||||||
|
JSONObject curr = items.getJSONObject(i);
|
||||||
|
if (discoverAdBlock(curr)) {
|
||||||
|
newObj.put(items.optJSONObject(i));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d("NewsfeedAdBlockV2", "discover: " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
json.put("items", newObj);
|
||||||
|
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean needToSave(JSONObject post, String source, boolean needToShowToast) throws JSONException {
|
||||||
|
String type = post.optString("type");
|
||||||
|
|
||||||
|
if (isAds(post, type)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (authorsrecomm() && (type.equals("authors_rec")
|
||||||
|
|| type.startsWith("recommended_") && (type.endsWith("audios")
|
||||||
|
|| type.endsWith("artists")
|
||||||
|
|| type.endsWith("playlists")
|
||||||
|
|| type.endsWith("groups")))) {
|
||||||
|
|
||||||
|
logRemovedPost(post, source, "authors", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (postsrecomm() && (type.equals("inline_user_rec") || type.equals("live_recommended"))) {
|
||||||
|
logRemovedPost(post, source, "postsrecomm", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (friendsrecomm() && (type.equals("user_rec") || type.equals("friends_recomm"))) {
|
||||||
|
logRemovedPost(post, source, "friendsrecomm", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adsgroup() && post.optInt("marked_as_ads") == 1 && !isWhitelistedAd(post)) {
|
||||||
|
logRemovedPost(post, source, "marked_as_ads", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PostsPreferences.isPostAd(getOwnerId(post), getPostId(post)) && !isWhitelistedAd(post)) {
|
||||||
|
logRemovedPost(post, source, "sponsorpost", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sponsorFilters(post.optString("text")) && !isWhitelistedFilters(post)) {
|
||||||
|
logRemovedPost(post, source, "sponsorpost filter", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkCopyright(post)) {
|
||||||
|
logRemovedPost(post, source, "copyright filters", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkCaption(post)) {
|
||||||
|
logRemovedPost(post, source, "caption filters", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasMiniAppAds(post) && !isWhitelistedFilters(post)) {
|
||||||
|
logRemovedPost(post, source, "miniapps ban", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NewsFeedFiltersUtils.injectFiltersReposts(post) && !isWhitelistedFilters(post)) {
|
||||||
|
logRemovedPost(post, source, "repost ad", needToShowToast);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONArray feedInject(JSONArray items, boolean needToShowToast) {
|
||||||
|
if (items.length() == 0) return items;
|
||||||
|
|
||||||
|
Stream<JSONObject> stream = IntStream.range(0, items.length())
|
||||||
|
.mapToObj(items::optJSONObject);
|
||||||
|
|
||||||
|
List<JSONObject> list = stream.filter(post -> {
|
||||||
|
try {
|
||||||
|
return post != null && needToSave(post, "feed", needToShowToast);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
return new JSONArray(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void logRemovedPost(JSONObject json, String source, String reason, boolean needToShowToast) {
|
||||||
|
Log.d("NewsfeedAdBlockV2", "Removed post " + getPostId(json) + ", owner: " + getOwnerId(json) + " from " + source + ", Reason: " + reason);
|
||||||
|
|
||||||
|
if (needToShowToast) sendToast("Пост " + getOwnerId(json) + "_" + getPostId(json) + " заблокирован по причине: " + reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean sponsorFilters(String text) {
|
||||||
|
String textInLowerCase = text.toLowerCase();
|
||||||
|
Set<String> list = filters.stream()
|
||||||
|
.filter(adword -> !adword.isEmpty())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
if (!list.isEmpty()) {
|
||||||
|
return list.stream().anyMatch(adword -> {
|
||||||
|
if (textInLowerCase.contains(adword.toLowerCase())) {
|
||||||
|
if (dev()) {
|
||||||
|
Log.d("NewsfeedAdBlockV2", text);
|
||||||
|
Log.d("NewsfeedAdBlockV2", "Block word: " + adword);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void parseStoriesItem(JSONObject item) throws JSONException {
|
||||||
|
JSONArray stories = item.optJSONArray("stories");
|
||||||
|
JSONArray newStories = new JSONArray();
|
||||||
|
|
||||||
|
if (stories == null) return;
|
||||||
|
|
||||||
|
for (int j = 0; j < stories.length(); j++) {
|
||||||
|
JSONObject story = stories.optJSONObject(j);
|
||||||
|
|
||||||
|
if (!story.optBoolean("is_ads") && !story.optBoolean("is_promo")) {
|
||||||
|
if (checkStoriesButtonLinks(story)) {
|
||||||
|
newStories.put(story);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log.d("NewsfeedAdBlockV2", "Fetched stories ad, owner id " + story.optString("owner_id") + ", caption " + story.optString("caption"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.put("stories", newStories);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Boolean checkStoriesButtonLinks(JSONObject json) {
|
||||||
|
return !getBoolValue("storiesGroupsAdBlock", false) || (json.has("link") ? isWhitelistedAdStories(json) : true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isAds(JSONObject list, String type) {
|
||||||
|
if (list == null || type == null || !ads()) return false;
|
||||||
|
|
||||||
|
Set<String> adsTypes = Set.of("ads", "carousel", "html5_ad", "ads_easy_promote");
|
||||||
|
Set<String> promoTypes = Set.of("promo_button", "app_widget", "app_video", "app_slider", "tags_suggestions");
|
||||||
|
|
||||||
|
if (list.has("ads") || adsTypes.stream().anyMatch(type::equals)) {
|
||||||
|
logRemovedPost(list, "feed", "ads", false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (promoTypes.stream().anyMatch(type::equals)) {
|
||||||
|
logRemovedPost(list, "feed", "promo", false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getOwnerId(JSONObject post) {
|
||||||
|
return post.optInt("owner_id") != 0 ? post.optInt("owner_id") : post.optInt("source_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getPostId(JSONObject post) {
|
||||||
|
return post.optInt("post_id") != 0 ? post.optInt("post_id") : post.optInt("id");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isWhitelistedFilters(JSONObject list) {
|
||||||
|
String id = String.valueOf(getOwnerId(list));
|
||||||
|
|
||||||
|
if (id.equals("-189659924") || id.equals(String.valueOf(AccountManagerUtils.getUserId()))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> whitelist = getPreferences().getStringSet(
|
||||||
|
"whitelisted_filters_groups",
|
||||||
|
Collections.emptySet()
|
||||||
|
);
|
||||||
|
|
||||||
|
return getBoolValue("invertFilters", false) != whitelist.contains(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isWhitelistedAd(JSONObject list) {
|
||||||
|
String id = String.valueOf(getOwnerId(list));
|
||||||
|
|
||||||
|
Set<String> whitelist = getPreferences().getStringSet(
|
||||||
|
"whitelisted_ad_groups",
|
||||||
|
Collections.emptySet()
|
||||||
|
);
|
||||||
|
|
||||||
|
return whitelist.contains(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isWhitelistedAdStories(JSONObject list) {
|
||||||
|
String id = String.valueOf(getOwnerId(list));
|
||||||
|
|
||||||
|
Set<String> whitelist = getPreferences().getStringSet(
|
||||||
|
"whitelisted_stories_ad",
|
||||||
|
Collections.emptySet()
|
||||||
|
);
|
||||||
|
|
||||||
|
return getBoolValue("invertFilters", false) != whitelist.contains(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean hasMiniAppAds(JSONObject list) {
|
||||||
|
JSONArray attachments = list.optJSONArray("attachments");
|
||||||
|
|
||||||
|
if (attachments != null && getBoolValue("blockminiapps", false)) {
|
||||||
|
return IntStream.range(0, attachments.length())
|
||||||
|
.mapToObj(attachments::optJSONObject)
|
||||||
|
.anyMatch(attachment -> attachment.optString("type").contains("mini_app"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONObject storiesAds(JSONObject json, boolean isDeleteFix) {
|
||||||
|
if (!adsstories()) {
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (json.has("ads")) {
|
||||||
|
if (isDeleteFix) {
|
||||||
|
try {
|
||||||
|
resetAdsSettings(json.getJSONObject("ads"));
|
||||||
|
Log.d("NewsfeedAdBlockV2", "Set stories ads settings at zero values");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.getStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
json.remove("ads");
|
||||||
|
Log.d("NewsfeedAdBlockV2", "Removed stories ads block");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
parseItemsStories(json.getJSONArray("items"));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.getStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void parseItemsStories(JSONArray items) throws JSONException {
|
||||||
|
for (int i = 0; i < items.length(); i++) {
|
||||||
|
parseStoriesItem(items.getJSONObject(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void resetAdsSettings(JSONObject ad) throws JSONException {
|
||||||
|
ad.getJSONObject("settings")
|
||||||
|
.put("stories_interval", 0)
|
||||||
|
.put("authors_interval", 0)
|
||||||
|
.put("time_interval", 0)
|
||||||
|
.put("stories_init", 0)
|
||||||
|
.put("authors_init", 0)
|
||||||
|
.put("time_init", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package ru.vtosters.sponsorpost.data;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
public class Filter {
|
||||||
|
int id;
|
||||||
|
String title;
|
||||||
|
String summary;
|
||||||
|
String version;
|
||||||
|
String link;
|
||||||
|
|
||||||
|
public Filter(int id, String title, String summary, String version, String link) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.summary = summary;
|
||||||
|
this.version = version;
|
||||||
|
this.link = link;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Filter(JSONObject jsonObject) throws NullPointerException, JSONException {
|
||||||
|
this(
|
||||||
|
jsonObject.getInt("id"),
|
||||||
|
jsonObject.getString("title"),
|
||||||
|
jsonObject.getString("summary"),
|
||||||
|
jsonObject.getString("version"),
|
||||||
|
jsonObject.getString("link")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSummary() {
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSummary(String summary) {
|
||||||
|
this.summary = summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLink() {
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLink(String link) {
|
||||||
|
this.link = link;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package ru.vtosters.sponsorpost.data;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
public class Post {
|
||||||
|
long postId;
|
||||||
|
long ownerId;
|
||||||
|
long postDate;
|
||||||
|
long postAdded;
|
||||||
|
|
||||||
|
public Post(long postId, long ownerId, long postDate, long postAdded) {
|
||||||
|
this.postId = postId;
|
||||||
|
this.ownerId = ownerId;
|
||||||
|
this.postDate = postDate;
|
||||||
|
this.postAdded = postAdded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Post(JSONObject jsonObject) throws NullPointerException, JSONException {
|
||||||
|
this(
|
||||||
|
jsonObject.getLong("postId"),
|
||||||
|
jsonObject.getLong("ownerId"),
|
||||||
|
jsonObject.getLong("postDate"),
|
||||||
|
jsonObject.getLong("postAdded")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getPostId() {
|
||||||
|
return postId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPostId(long postId) {
|
||||||
|
this.postId = postId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getOwnerId() {
|
||||||
|
return ownerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOwnerId(long ownerId) {
|
||||||
|
this.ownerId = ownerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getPostDate() {
|
||||||
|
return postDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPostDate(long postDate) {
|
||||||
|
this.postDate = postDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getPostAdded() {
|
||||||
|
return postAdded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPostAdded(long postAdded) {
|
||||||
|
this.postAdded = postAdded;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
package ru.vtosters.sponsorpost.services;
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import ru.vtosters.lite.di.singleton.VtOkHttpClient;
|
||||||
|
import ru.vtosters.sponsorpost.data.Filter;
|
||||||
|
import ru.vtosters.sponsorpost.utils.ApiUtils;
|
||||||
|
import ru.vtosters.sponsorpost.utils.FiltersPreferences;
|
||||||
|
import ru.vtosters.sponsorpost.utils.GzipDecompressor;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class FilterService {
|
||||||
|
private static final OkHttpClient client = VtOkHttpClient.getInstance();
|
||||||
|
|
||||||
|
public static List<Filter> getFilters(List<Integer> ids) {
|
||||||
|
// Retrieves a list of filters
|
||||||
|
|
||||||
|
// Construct the API request URL
|
||||||
|
String requestUrl = ApiUtils.getURL() + "/lists/get";
|
||||||
|
|
||||||
|
if (ids != null && !ids.isEmpty()) requestUrl = requestUrl + "?ids=" + ids.stream()
|
||||||
|
.map(Object::toString)
|
||||||
|
.collect(Collectors.joining(","));
|
||||||
|
// for filters updates
|
||||||
|
|
||||||
|
// Create a GET request to the API endpoint
|
||||||
|
Request request = new Request.a()
|
||||||
|
.b(requestUrl)
|
||||||
|
.a("Content-Type", "application/json")
|
||||||
|
.a("Accept-Encoding", "gzip")
|
||||||
|
.a();
|
||||||
|
|
||||||
|
try (Response response = client.a(request).execute()) {
|
||||||
|
// Check if the response is successful
|
||||||
|
if (response.h()) {
|
||||||
|
// Determine the response encoding
|
||||||
|
String encoding = response.a("Content-Encoding");
|
||||||
|
String resp;
|
||||||
|
|
||||||
|
if (encoding != null && encoding.equals("gzip")) {
|
||||||
|
// Decompress the response body
|
||||||
|
resp = GzipDecompressor.decompress(response.a().b());
|
||||||
|
} else {
|
||||||
|
// Retrieve the response body directly
|
||||||
|
resp = response.a().g();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the response body as a JSONArray and extract filter objects
|
||||||
|
return parseJSON(new JSONArray(resp));
|
||||||
|
} else {
|
||||||
|
if (!FiltersPreferences.getAllFilterIds().isEmpty()) {
|
||||||
|
return FiltersPreferences.getAllDownloadedFilters(); // check for offline server to get local filters
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Failed to get filters: " + response.l());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException | JSONException e) {
|
||||||
|
if (!FiltersPreferences.getAllFilterIds().isEmpty()) {
|
||||||
|
return FiltersPreferences.getAllDownloadedFilters(); // check for offline server to get local filters
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> downloadFilter(String link) {
|
||||||
|
Request request = new Request.a()
|
||||||
|
.b(link)
|
||||||
|
.a();
|
||||||
|
|
||||||
|
try (Response response = client.a(request).execute()) {
|
||||||
|
if (response.h()) {
|
||||||
|
return stringToSet(response.a().g());
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Failed to download filter: " + response.l());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> stringToSet(String input) {
|
||||||
|
return Arrays.stream(input.split("\n"))
|
||||||
|
.map(String::toLowerCase)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Filter> parseJSON(JSONArray jsonArray) throws JSONException {
|
||||||
|
return IntStream.range(0, jsonArray.length())
|
||||||
|
.mapToObj(i -> {
|
||||||
|
try {
|
||||||
|
return new Filter(jsonArray.getJSONObject(i));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user