@ -0,0 +1,14 @@
|
|||||||
|
*.iml
|
||||||
|
.gradle
|
||||||
|
/local.properties
|
||||||
|
/.idea/caches
|
||||||
|
/.idea/libraries
|
||||||
|
/.idea/modules.xml
|
||||||
|
/.idea/workspace.xml
|
||||||
|
/.idea/navEditor.xml
|
||||||
|
/.idea/assetWizardSettings.xml
|
||||||
|
.DS_Store
|
||||||
|
/build
|
||||||
|
/captures
|
||||||
|
.externalNativeBuild
|
||||||
|
.cxx
|
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<bytecodeTargetLevel target="11" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,514 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DBNavigator.Project.DataEditorManager">
|
||||||
|
<record-view-column-sorting-type value="BY_INDEX" />
|
||||||
|
<value-preview-text-wrapping value="true" />
|
||||||
|
<value-preview-pinned value="false" />
|
||||||
|
</component>
|
||||||
|
<component name="DBNavigator.Project.DatabaseBrowserManager">
|
||||||
|
<autoscroll-to-editor value="false" />
|
||||||
|
<autoscroll-from-editor value="true" />
|
||||||
|
<show-object-properties value="true" />
|
||||||
|
<loaded-nodes />
|
||||||
|
</component>
|
||||||
|
<component name="DBNavigator.Project.DatabaseConsoleManager">
|
||||||
|
<connection id="634c05ec-5725-4682-9c1f-f355c89055a7">
|
||||||
|
<console name="Connection" type="STANDARD" schema="mysql" session="Main" />
|
||||||
|
</connection>
|
||||||
|
</component>
|
||||||
|
<component name="DBNavigator.Project.DatabaseEditorStateManager">
|
||||||
|
<last-used-providers />
|
||||||
|
</component>
|
||||||
|
<component name="DBNavigator.Project.DatabaseFileManager">
|
||||||
|
<open-files />
|
||||||
|
</component>
|
||||||
|
<component name="DBNavigator.Project.ObjectQuickFilterManager">
|
||||||
|
<last-used-operator value="EQUAL" />
|
||||||
|
<filters />
|
||||||
|
</component>
|
||||||
|
<component name="DBNavigator.Project.Settings">
|
||||||
|
<connections>
|
||||||
|
<connection id="634c05ec-5725-4682-9c1f-f355c89055a7" active="true" signed="true">
|
||||||
|
<database>
|
||||||
|
<name value="Connection" />
|
||||||
|
<description value="" />
|
||||||
|
<database-type value="MYSQL" />
|
||||||
|
<config-type value="BASIC" />
|
||||||
|
<database-version value="9999.0" />
|
||||||
|
<driver-source value="BUILTIN" />
|
||||||
|
<driver-library value="" />
|
||||||
|
<driver value="" />
|
||||||
|
<url-type value="DATABASE" />
|
||||||
|
<host value="localhost" />
|
||||||
|
<port value="3306" />
|
||||||
|
<database value="mysql" />
|
||||||
|
<type value="USER_PASSWORD" />
|
||||||
|
<user value="" />
|
||||||
|
<deprecated-pwd value="" />
|
||||||
|
</database>
|
||||||
|
<properties>
|
||||||
|
<auto-commit value="false" />
|
||||||
|
</properties>
|
||||||
|
<ssh-settings>
|
||||||
|
<active value="false" />
|
||||||
|
<proxy-host value="" />
|
||||||
|
<proxy-port value="22" />
|
||||||
|
<proxy-user value="" />
|
||||||
|
<deprecated-proxy-pwd value="" />
|
||||||
|
<auth-type value="PASSWORD" />
|
||||||
|
<key-file value="" />
|
||||||
|
<key-passphrase value="" />
|
||||||
|
</ssh-settings>
|
||||||
|
<ssl-settings>
|
||||||
|
<active value="false" />
|
||||||
|
<certificate-authority-file value="" />
|
||||||
|
<client-certificate-file value="" />
|
||||||
|
<client-key-file value="" />
|
||||||
|
</ssl-settings>
|
||||||
|
<details>
|
||||||
|
<charset value="UTF-8" />
|
||||||
|
<session-management value="true" />
|
||||||
|
<ddl-file-binding value="true" />
|
||||||
|
<database-logging value="true" />
|
||||||
|
<connect-automatically value="true" />
|
||||||
|
<restore-workspace value="true" />
|
||||||
|
<restore-workspace-deep value="false" />
|
||||||
|
<environment-type value="default" />
|
||||||
|
<connectivity-timeout value="10" />
|
||||||
|
<idle-time-to-disconnect value="30" />
|
||||||
|
<idle-time-to-disconnect-pool value="5" />
|
||||||
|
<credential-expiry-time value="10" />
|
||||||
|
<max-connection-pool-size value="7" />
|
||||||
|
<alternative-statement-delimiter value="" />
|
||||||
|
</details>
|
||||||
|
<object-filters hide-empty-schemas="false" hide-pseudo-columns="false">
|
||||||
|
<object-type-filter>
|
||||||
|
<object-type name="SCHEMA" enabled="true" />
|
||||||
|
<object-type name="USER" enabled="true" />
|
||||||
|
<object-type name="ROLE" enabled="true" />
|
||||||
|
<object-type name="PRIVILEGE" enabled="true" />
|
||||||
|
<object-type name="CHARSET" enabled="true" />
|
||||||
|
<object-type name="TABLE" enabled="true" />
|
||||||
|
<object-type name="VIEW" enabled="true" />
|
||||||
|
<object-type name="MATERIALIZED_VIEW" enabled="true" />
|
||||||
|
<object-type name="NESTED_TABLE" enabled="true" />
|
||||||
|
<object-type name="COLUMN" enabled="true" />
|
||||||
|
<object-type name="INDEX" enabled="true" />
|
||||||
|
<object-type name="CONSTRAINT" enabled="true" />
|
||||||
|
<object-type name="DATASET_TRIGGER" enabled="true" />
|
||||||
|
<object-type name="DATABASE_TRIGGER" enabled="true" />
|
||||||
|
<object-type name="SYNONYM" enabled="true" />
|
||||||
|
<object-type name="SEQUENCE" enabled="true" />
|
||||||
|
<object-type name="PROCEDURE" enabled="true" />
|
||||||
|
<object-type name="FUNCTION" enabled="true" />
|
||||||
|
<object-type name="PACKAGE" enabled="true" />
|
||||||
|
<object-type name="TYPE" enabled="true" />
|
||||||
|
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
|
||||||
|
<object-type name="ARGUMENT" enabled="true" />
|
||||||
|
<object-type name="DIMENSION" enabled="true" />
|
||||||
|
<object-type name="CLUSTER" enabled="true" />
|
||||||
|
<object-type name="DBLINK" enabled="true" />
|
||||||
|
</object-type-filter>
|
||||||
|
<object-name-filters />
|
||||||
|
</object-filters>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
<browser-settings>
|
||||||
|
<general>
|
||||||
|
<display-mode value="TABBED" />
|
||||||
|
<navigation-history-size value="100" />
|
||||||
|
<show-object-details value="false" />
|
||||||
|
</general>
|
||||||
|
<filters>
|
||||||
|
<object-type-filter>
|
||||||
|
<object-type name="SCHEMA" enabled="true" />
|
||||||
|
<object-type name="USER" enabled="true" />
|
||||||
|
<object-type name="ROLE" enabled="true" />
|
||||||
|
<object-type name="PRIVILEGE" enabled="true" />
|
||||||
|
<object-type name="CHARSET" enabled="true" />
|
||||||
|
<object-type name="TABLE" enabled="true" />
|
||||||
|
<object-type name="VIEW" enabled="true" />
|
||||||
|
<object-type name="MATERIALIZED_VIEW" enabled="true" />
|
||||||
|
<object-type name="NESTED_TABLE" enabled="true" />
|
||||||
|
<object-type name="COLUMN" enabled="true" />
|
||||||
|
<object-type name="INDEX" enabled="true" />
|
||||||
|
<object-type name="CONSTRAINT" enabled="true" />
|
||||||
|
<object-type name="DATASET_TRIGGER" enabled="true" />
|
||||||
|
<object-type name="DATABASE_TRIGGER" enabled="true" />
|
||||||
|
<object-type name="SYNONYM" enabled="true" />
|
||||||
|
<object-type name="SEQUENCE" enabled="true" />
|
||||||
|
<object-type name="PROCEDURE" enabled="true" />
|
||||||
|
<object-type name="FUNCTION" enabled="true" />
|
||||||
|
<object-type name="PACKAGE" enabled="true" />
|
||||||
|
<object-type name="TYPE" enabled="true" />
|
||||||
|
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
|
||||||
|
<object-type name="ARGUMENT" enabled="true" />
|
||||||
|
<object-type name="DIMENSION" enabled="true" />
|
||||||
|
<object-type name="CLUSTER" enabled="true" />
|
||||||
|
<object-type name="DBLINK" enabled="true" />
|
||||||
|
</object-type-filter>
|
||||||
|
</filters>
|
||||||
|
<sorting>
|
||||||
|
<object-type name="COLUMN" sorting-type="NAME" />
|
||||||
|
<object-type name="FUNCTION" sorting-type="NAME" />
|
||||||
|
<object-type name="PROCEDURE" sorting-type="NAME" />
|
||||||
|
<object-type name="ARGUMENT" sorting-type="POSITION" />
|
||||||
|
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
|
||||||
|
</sorting>
|
||||||
|
<default-editors>
|
||||||
|
<object-type name="VIEW" editor-type="SELECTION" />
|
||||||
|
<object-type name="PACKAGE" editor-type="SELECTION" />
|
||||||
|
<object-type name="TYPE" editor-type="SELECTION" />
|
||||||
|
</default-editors>
|
||||||
|
</browser-settings>
|
||||||
|
<navigation-settings>
|
||||||
|
<lookup-filters>
|
||||||
|
<lookup-objects>
|
||||||
|
<object-type name="SCHEMA" enabled="true" />
|
||||||
|
<object-type name="USER" enabled="false" />
|
||||||
|
<object-type name="ROLE" enabled="false" />
|
||||||
|
<object-type name="PRIVILEGE" enabled="false" />
|
||||||
|
<object-type name="CHARSET" enabled="false" />
|
||||||
|
<object-type name="TABLE" enabled="true" />
|
||||||
|
<object-type name="VIEW" enabled="true" />
|
||||||
|
<object-type name="MATERIALIZED VIEW" enabled="true" />
|
||||||
|
<object-type name="INDEX" enabled="true" />
|
||||||
|
<object-type name="CONSTRAINT" enabled="true" />
|
||||||
|
<object-type name="DATASET TRIGGER" enabled="true" />
|
||||||
|
<object-type name="DATABASE TRIGGER" enabled="true" />
|
||||||
|
<object-type name="SYNONYM" enabled="false" />
|
||||||
|
<object-type name="SEQUENCE" enabled="true" />
|
||||||
|
<object-type name="PROCEDURE" enabled="true" />
|
||||||
|
<object-type name="FUNCTION" enabled="true" />
|
||||||
|
<object-type name="PACKAGE" enabled="true" />
|
||||||
|
<object-type name="TYPE" enabled="true" />
|
||||||
|
<object-type name="DIMENSION" enabled="false" />
|
||||||
|
<object-type name="CLUSTER" enabled="false" />
|
||||||
|
<object-type name="DBLINK" enabled="true" />
|
||||||
|
</lookup-objects>
|
||||||
|
<force-database-load value="false" />
|
||||||
|
<prompt-connection-selection value="true" />
|
||||||
|
<prompt-schema-selection value="true" />
|
||||||
|
</lookup-filters>
|
||||||
|
</navigation-settings>
|
||||||
|
<dataset-grid-settings>
|
||||||
|
<general>
|
||||||
|
<enable-zooming value="true" />
|
||||||
|
<enable-column-tooltip value="true" />
|
||||||
|
</general>
|
||||||
|
<sorting>
|
||||||
|
<nulls-first value="true" />
|
||||||
|
<max-sorting-columns value="4" />
|
||||||
|
</sorting>
|
||||||
|
<audit-columns>
|
||||||
|
<column-names value="" />
|
||||||
|
<visible value="true" />
|
||||||
|
<editable value="false" />
|
||||||
|
</audit-columns>
|
||||||
|
</dataset-grid-settings>
|
||||||
|
<dataset-editor-settings>
|
||||||
|
<text-editor-popup>
|
||||||
|
<active value="false" />
|
||||||
|
<active-if-empty value="false" />
|
||||||
|
<data-length-threshold value="100" />
|
||||||
|
<popup-delay value="1000" />
|
||||||
|
</text-editor-popup>
|
||||||
|
<values-actions-popup>
|
||||||
|
<show-popup-button value="true" />
|
||||||
|
<element-count-threshold value="1000" />
|
||||||
|
<data-length-threshold value="250" />
|
||||||
|
</values-actions-popup>
|
||||||
|
<general>
|
||||||
|
<fetch-block-size value="100" />
|
||||||
|
<fetch-timeout value="30" />
|
||||||
|
<trim-whitespaces value="true" />
|
||||||
|
<convert-empty-strings-to-null value="true" />
|
||||||
|
<select-content-on-cell-edit value="true" />
|
||||||
|
<large-value-preview-active value="true" />
|
||||||
|
</general>
|
||||||
|
<filters>
|
||||||
|
<prompt-filter-dialog value="true" />
|
||||||
|
<default-filter-type value="BASIC" />
|
||||||
|
</filters>
|
||||||
|
<qualified-text-editor text-length-threshold="300">
|
||||||
|
<content-types>
|
||||||
|
<content-type name="Text" enabled="true" />
|
||||||
|
<content-type name="Properties" enabled="true" />
|
||||||
|
<content-type name="XML" enabled="true" />
|
||||||
|
<content-type name="DTD" enabled="true" />
|
||||||
|
<content-type name="HTML" enabled="true" />
|
||||||
|
<content-type name="XHTML" enabled="true" />
|
||||||
|
<content-type name="Java" enabled="true" />
|
||||||
|
<content-type name="SQL" enabled="true" />
|
||||||
|
<content-type name="PL/SQL" enabled="true" />
|
||||||
|
<content-type name="JSON" enabled="true" />
|
||||||
|
<content-type name="JSON5" enabled="true" />
|
||||||
|
<content-type name="Groovy" enabled="true" />
|
||||||
|
<content-type name="AIDL" enabled="true" />
|
||||||
|
<content-type name="YAML" enabled="true" />
|
||||||
|
<content-type name="Manifest" enabled="true" />
|
||||||
|
</content-types>
|
||||||
|
</qualified-text-editor>
|
||||||
|
<record-navigation>
|
||||||
|
<navigation-target value="VIEWER" />
|
||||||
|
</record-navigation>
|
||||||
|
</dataset-editor-settings>
|
||||||
|
<code-editor-settings>
|
||||||
|
<general>
|
||||||
|
<show-object-navigation-gutter value="false" />
|
||||||
|
<show-spec-declaration-navigation-gutter value="true" />
|
||||||
|
<enable-spellchecking value="true" />
|
||||||
|
<enable-reference-spellchecking value="false" />
|
||||||
|
</general>
|
||||||
|
<confirmations>
|
||||||
|
<save-changes value="false" />
|
||||||
|
<revert-changes value="true" />
|
||||||
|
</confirmations>
|
||||||
|
</code-editor-settings>
|
||||||
|
<code-completion-settings>
|
||||||
|
<filters>
|
||||||
|
<basic-filter>
|
||||||
|
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="function" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="schema" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="role" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="user" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="privilege" selected="true" />
|
||||||
|
<user-schema>
|
||||||
|
<filter-element type="OBJECT" id="table" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="index" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="constraint" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="trigger" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="synonym" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="sequence" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="procedure" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="function" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="package" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="type" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dimension" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="cluster" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dblink" selected="true" />
|
||||||
|
</user-schema>
|
||||||
|
<public-schema>
|
||||||
|
<filter-element type="OBJECT" id="table" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="view" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="materialized view" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="index" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="constraint" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="trigger" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="synonym" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="sequence" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="procedure" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="function" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="package" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="type" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="dimension" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="cluster" selected="false" />
|
||||||
|
<filter-element type="OBJECT" id="dblink" selected="false" />
|
||||||
|
</public-schema>
|
||||||
|
<any-schema>
|
||||||
|
<filter-element type="OBJECT" id="table" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="index" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="constraint" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="trigger" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="synonym" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="sequence" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="procedure" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="function" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="package" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="type" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dimension" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="cluster" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dblink" selected="true" />
|
||||||
|
</any-schema>
|
||||||
|
</basic-filter>
|
||||||
|
<extended-filter>
|
||||||
|
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="function" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
|
||||||
|
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="schema" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="user" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="role" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="privilege" selected="true" />
|
||||||
|
<user-schema>
|
||||||
|
<filter-element type="OBJECT" id="table" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="index" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="constraint" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="trigger" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="synonym" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="sequence" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="procedure" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="function" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="package" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="type" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dimension" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="cluster" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dblink" selected="true" />
|
||||||
|
</user-schema>
|
||||||
|
<public-schema>
|
||||||
|
<filter-element type="OBJECT" id="table" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="index" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="constraint" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="trigger" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="synonym" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="sequence" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="procedure" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="function" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="package" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="type" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dimension" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="cluster" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dblink" selected="true" />
|
||||||
|
</public-schema>
|
||||||
|
<any-schema>
|
||||||
|
<filter-element type="OBJECT" id="table" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="index" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="constraint" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="trigger" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="synonym" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="sequence" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="procedure" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="function" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="package" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="type" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dimension" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="cluster" selected="true" />
|
||||||
|
<filter-element type="OBJECT" id="dblink" selected="true" />
|
||||||
|
</any-schema>
|
||||||
|
</extended-filter>
|
||||||
|
</filters>
|
||||||
|
<sorting enabled="true">
|
||||||
|
<sorting-element type="RESERVED_WORD" id="keyword" />
|
||||||
|
<sorting-element type="RESERVED_WORD" id="datatype" />
|
||||||
|
<sorting-element type="OBJECT" id="column" />
|
||||||
|
<sorting-element type="OBJECT" id="table" />
|
||||||
|
<sorting-element type="OBJECT" id="view" />
|
||||||
|
<sorting-element type="OBJECT" id="materialized view" />
|
||||||
|
<sorting-element type="OBJECT" id="index" />
|
||||||
|
<sorting-element type="OBJECT" id="constraint" />
|
||||||
|
<sorting-element type="OBJECT" id="trigger" />
|
||||||
|
<sorting-element type="OBJECT" id="synonym" />
|
||||||
|
<sorting-element type="OBJECT" id="sequence" />
|
||||||
|
<sorting-element type="OBJECT" id="procedure" />
|
||||||
|
<sorting-element type="OBJECT" id="function" />
|
||||||
|
<sorting-element type="OBJECT" id="package" />
|
||||||
|
<sorting-element type="OBJECT" id="type" />
|
||||||
|
<sorting-element type="OBJECT" id="dimension" />
|
||||||
|
<sorting-element type="OBJECT" id="cluster" />
|
||||||
|
<sorting-element type="OBJECT" id="dblink" />
|
||||||
|
<sorting-element type="OBJECT" id="schema" />
|
||||||
|
<sorting-element type="OBJECT" id="role" />
|
||||||
|
<sorting-element type="OBJECT" id="user" />
|
||||||
|
<sorting-element type="RESERVED_WORD" id="function" />
|
||||||
|
<sorting-element type="RESERVED_WORD" id="parameter" />
|
||||||
|
</sorting>
|
||||||
|
<format>
|
||||||
|
<enforce-code-style-case value="true" />
|
||||||
|
</format>
|
||||||
|
</code-completion-settings>
|
||||||
|
<execution-engine-settings>
|
||||||
|
<statement-execution>
|
||||||
|
<fetch-block-size value="100" />
|
||||||
|
<execution-timeout value="20" />
|
||||||
|
<debug-execution-timeout value="600" />
|
||||||
|
<focus-result value="false" />
|
||||||
|
<prompt-execution value="false" />
|
||||||
|
</statement-execution>
|
||||||
|
<script-execution>
|
||||||
|
<command-line-interfaces />
|
||||||
|
<execution-timeout value="300" />
|
||||||
|
</script-execution>
|
||||||
|
<method-execution>
|
||||||
|
<execution-timeout value="30" />
|
||||||
|
<debug-execution-timeout value="600" />
|
||||||
|
<parameter-history-size value="10" />
|
||||||
|
</method-execution>
|
||||||
|
</execution-engine-settings>
|
||||||
|
<operation-settings>
|
||||||
|
<transactions>
|
||||||
|
<uncommitted-changes>
|
||||||
|
<on-project-close value="ASK" />
|
||||||
|
<on-disconnect value="ASK" />
|
||||||
|
<on-autocommit-toggle value="ASK" />
|
||||||
|
</uncommitted-changes>
|
||||||
|
<multiple-uncommitted-changes>
|
||||||
|
<on-commit value="ASK" />
|
||||||
|
<on-rollback value="ASK" />
|
||||||
|
</multiple-uncommitted-changes>
|
||||||
|
</transactions>
|
||||||
|
<session-browser>
|
||||||
|
<disconnect-session value="ASK" />
|
||||||
|
<kill-session value="ASK" />
|
||||||
|
<reload-on-filter-change value="false" />
|
||||||
|
</session-browser>
|
||||||
|
<compiler>
|
||||||
|
<compile-type value="KEEP" />
|
||||||
|
<compile-dependencies value="ASK" />
|
||||||
|
<always-show-controls value="false" />
|
||||||
|
</compiler>
|
||||||
|
<debugger>
|
||||||
|
<debugger-type value="ASK" />
|
||||||
|
<use-generic-runners value="true" />
|
||||||
|
</debugger>
|
||||||
|
</operation-settings>
|
||||||
|
<ddl-file-settings>
|
||||||
|
<extensions>
|
||||||
|
<mapping file-type-id="VIEW" extensions="vw" />
|
||||||
|
<mapping file-type-id="TRIGGER" extensions="trg" />
|
||||||
|
<mapping file-type-id="PROCEDURE" extensions="prc" />
|
||||||
|
<mapping file-type-id="FUNCTION" extensions="fnc" />
|
||||||
|
<mapping file-type-id="PACKAGE" extensions="pkg" />
|
||||||
|
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
|
||||||
|
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
|
||||||
|
<mapping file-type-id="TYPE" extensions="tpe" />
|
||||||
|
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
|
||||||
|
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
|
||||||
|
</extensions>
|
||||||
|
<general>
|
||||||
|
<lookup-ddl-files value="true" />
|
||||||
|
<create-ddl-files value="false" />
|
||||||
|
<synchronize-ddl-files value="true" />
|
||||||
|
<use-qualified-names value="false" />
|
||||||
|
<make-scripts-rerunnable value="true" />
|
||||||
|
</general>
|
||||||
|
</ddl-file-settings>
|
||||||
|
<general-settings>
|
||||||
|
<regional-settings>
|
||||||
|
<date-format value="MEDIUM" />
|
||||||
|
<number-format value="UNGROUPED" />
|
||||||
|
<locale value="SYSTEM_DEFAULT" />
|
||||||
|
<use-custom-formats value="false" />
|
||||||
|
</regional-settings>
|
||||||
|
<environment>
|
||||||
|
<environment-types>
|
||||||
|
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
|
||||||
|
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
|
||||||
|
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
|
||||||
|
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
|
||||||
|
</environment-types>
|
||||||
|
<visibility-settings>
|
||||||
|
<connection-tabs value="true" />
|
||||||
|
<dialog-headers value="true" />
|
||||||
|
<object-editor-tabs value="true" />
|
||||||
|
<script-editor-tabs value="false" />
|
||||||
|
<execution-result-tabs value="true" />
|
||||||
|
</visibility-settings>
|
||||||
|
</environment>
|
||||||
|
</general-settings>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="deploymentTargetDropDown">
|
||||||
|
<targetSelectedWithDropDown>
|
||||||
|
<Target>
|
||||||
|
<type value="QUICK_BOOT_TARGET" />
|
||||||
|
<deviceKey>
|
||||||
|
<Key>
|
||||||
|
<type value="VIRTUAL_DEVICE_PATH" />
|
||||||
|
<value value="C:\Users\86130\.android\avd\Pixel_4_API_30.avd" />
|
||||||
|
</Key>
|
||||||
|
</deviceKey>
|
||||||
|
</Target>
|
||||||
|
</targetSelectedWithDropDown>
|
||||||
|
<timeTargetWasSelectedWithDropDown value="2023-05-25T16:48:11.783527200Z" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="testRunner" value="GRADLE" />
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
<option value="$PROJECT_DIR$/app" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RemoteRepositoriesConfiguration">
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Maven Central repository" />
|
||||||
|
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="jboss.community" />
|
||||||
|
<option name="name" value="JBoss Community repository" />
|
||||||
|
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="BintrayJCenter" />
|
||||||
|
<option name="name" value="BintrayJCenter" />
|
||||||
|
<option name="url" value="https://jcenter.bintray.com/" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="Google" />
|
||||||
|
<option name="name" value="Google" />
|
||||||
|
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
|
||||||
|
</remote-repository>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectType">
|
||||||
|
<option name="id" value="Android" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1 @@
|
|||||||
|
/build
|
@ -0,0 +1,50 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'com.jakewharton.butterknife'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 29
|
||||||
|
buildToolsVersion "29.0.3"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.example.sparrownotes"
|
||||||
|
minSdkVersion 19
|
||||||
|
targetSdkVersion 29
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ButterKnife requires Java 8
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||||
|
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||||
|
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||||
|
implementation 'com.google.android.material:material:1.1.0'
|
||||||
|
// 黄油刀
|
||||||
|
implementation 'com.jakewharton:butterknife:10.2.1'
|
||||||
|
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
|
||||||
|
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||||
|
// 圆形头像
|
||||||
|
implementation 'de.hdodenhof:circleimageview:3.1.0'
|
||||||
|
// 黄油刀
|
||||||
|
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
|
||||||
|
testImplementation 'junit:junit:4.12'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
|
||||||
|
// Glide 图片加载框架
|
||||||
|
implementation 'com.github.bumptech.glide:glide:3.7.0'
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.example.sparrownotes;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
public void useAppContext() {
|
||||||
|
// Context of the app under test.
|
||||||
|
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||||
|
assertEquals("com.example.sparrownotes", appContext.getPackageName());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.example.sparrownotes">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/icon_sparrow"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:roundIcon="@drawable/icon_sparrow"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/AppTheme">
|
||||||
|
<activity android:name=".FindPwdActivity" />
|
||||||
|
<activity android:name=".RegisterActivity" />
|
||||||
|
<activity
|
||||||
|
android:name=".HomeActivity"
|
||||||
|
android:windowSoftInputMode="adjustPan" />
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:windowSoftInputMode="adjustPan">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
@ -0,0 +1,180 @@
|
|||||||
|
package com.example.sparrownotes;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.method.HideReturnsTransformationMethod;
|
||||||
|
import android.text.method.PasswordTransformationMethod;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import butterknife.OnClick;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找回密码
|
||||||
|
*/
|
||||||
|
public class FindPwdActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
@BindView(R.id.btn_confirm_find)
|
||||||
|
Button btnConfirmFind;
|
||||||
|
@BindView(R.id.btn_reset_find)
|
||||||
|
Button btnResetFind;
|
||||||
|
@BindView(R.id.edit_confirm_pwd_find)
|
||||||
|
EditText editConfirmPwdFind;
|
||||||
|
@BindView(R.id.edit_password_find)
|
||||||
|
EditText editPasswordFind;
|
||||||
|
@BindView(R.id.edit_email_find)
|
||||||
|
EditText editEmailFind;
|
||||||
|
@BindView(R.id.check_hide_pwd_find)
|
||||||
|
CheckBox checkHidePwdFind;
|
||||||
|
@BindView(R.id.check_hide_pwd_find2)
|
||||||
|
CheckBox checkHidePwdFind2;
|
||||||
|
|
||||||
|
private static final String TAG = "FindPwdActivity";
|
||||||
|
private UserDao userDao;
|
||||||
|
private String textPassword;
|
||||||
|
private String textConfirmPwd;
|
||||||
|
private String textEmail;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_find_pwd);
|
||||||
|
ButterKnife.bind(this);
|
||||||
|
userDao = new UserDao(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick({R.id.btn_confirm_find, R.id.btn_reset_find, R.id.check_hide_pwd_find, R.id.check_hide_pwd_find2})
|
||||||
|
public void onViewClicked(View view) {
|
||||||
|
switch (view.getId()) {
|
||||||
|
case R.id.btn_confirm_find:
|
||||||
|
// 检查非空
|
||||||
|
if (isNotEmpty()) {
|
||||||
|
// 获得用户输入
|
||||||
|
getEditText();
|
||||||
|
// 检查邮箱格式
|
||||||
|
if (checkEmail()) {
|
||||||
|
// 检查两次输入的密码是否一致
|
||||||
|
if (comparePwd()) {
|
||||||
|
// 更新密码
|
||||||
|
if (updatePwdFromDB()) {
|
||||||
|
// 跳转登录界面
|
||||||
|
Intent intent = new Intent(FindPwdActivity.this, MainActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
FindPwdActivity.this.finish();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "两次输入的密码不一致", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "邮箱格式错误", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "邮箱或密码不能为空", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.btn_reset_find:
|
||||||
|
// 清空输入
|
||||||
|
editPasswordFind.setText("");
|
||||||
|
editConfirmPwdFind.setText("");
|
||||||
|
editEmailFind.setText("");
|
||||||
|
break;
|
||||||
|
case R.id.check_hide_pwd_find:
|
||||||
|
if (checkHidePwdFind.isChecked()) {
|
||||||
|
// 将密码显示出来
|
||||||
|
editPasswordFind.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
|
||||||
|
} else {
|
||||||
|
// 隐藏密码
|
||||||
|
editPasswordFind.setTransformationMethod(PasswordTransformationMethod.getInstance());
|
||||||
|
}
|
||||||
|
// 将光标移动到文本最后
|
||||||
|
editPasswordFind.setSelection(editPasswordFind.getText().toString().length());
|
||||||
|
break;
|
||||||
|
case R.id.check_hide_pwd_find2:
|
||||||
|
if (checkHidePwdFind2.isChecked()) {
|
||||||
|
// 将密码显示出来
|
||||||
|
editConfirmPwdFind.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
|
||||||
|
} else {
|
||||||
|
// 隐藏密码
|
||||||
|
editConfirmPwdFind.setTransformationMethod(PasswordTransformationMethod.getInstance());
|
||||||
|
}
|
||||||
|
// 将光标移动到文本最后
|
||||||
|
editConfirmPwdFind.setSelection(editConfirmPwdFind.getText().toString().length());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检验输入非空
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isNotEmpty() {
|
||||||
|
return !"".equals(editPasswordFind.getText().toString()) &&
|
||||||
|
!"".equals(editConfirmPwdFind.getText().toString()) &&
|
||||||
|
!"".equals(editEmailFind.getText().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从控件中得到输入值
|
||||||
|
*/
|
||||||
|
public void getEditText() {
|
||||||
|
textPassword = editPasswordFind.getText().toString();
|
||||||
|
textConfirmPwd = editConfirmPwdFind.getText().toString();
|
||||||
|
textEmail = editEmailFind.getText().toString();
|
||||||
|
Log.d(TAG, "getEditText: " + textEmail);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查邮箱格式
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean checkEmail() {
|
||||||
|
Matcher emailMatcher = Constant.EMAIL_PATTERN.matcher(textEmail);
|
||||||
|
return emailMatcher.matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证两次输入的密码是否一致
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean comparePwd() {
|
||||||
|
return textPassword.equals(textConfirmPwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改数据库中的密码
|
||||||
|
*
|
||||||
|
* @return 邮箱是否存在
|
||||||
|
*/
|
||||||
|
public boolean updatePwdFromDB() {
|
||||||
|
List<UserBean> userBeans = userDao.queryForWhat("email", textEmail);
|
||||||
|
if (userBeans.size() != 0) {
|
||||||
|
UserBean user = userBeans.get(0);
|
||||||
|
user.setPassword(textPassword);
|
||||||
|
userDao.update(user);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "邮箱错误", Toast.LENGTH_SHORT).show();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,280 @@
|
|||||||
|
package com.example.sparrownotes;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.RadioButton;
|
||||||
|
import android.widget.RadioGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.ActionBar;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import androidx.core.view.GravityCompat;
|
||||||
|
import androidx.drawerlayout.widget.DrawerLayout;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.fragment.AddFragment;
|
||||||
|
import com.example.sparrownotes.fragment.AllFragment;
|
||||||
|
import com.example.sparrownotes.fragment.TopFragment;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.example.sparrownotes.util.DialogUtil;
|
||||||
|
import com.example.sparrownotes.util.SharedPreferenceUtil;
|
||||||
|
import com.google.android.material.navigation.NavigationView;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import butterknife.OnCheckedChanged;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主页
|
||||||
|
*/
|
||||||
|
public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
|
||||||
|
|
||||||
|
@BindView(R.id.toolbar)
|
||||||
|
Toolbar toolbar;
|
||||||
|
@BindView(R.id.btn_top)
|
||||||
|
RadioButton btnTop;
|
||||||
|
@BindView(R.id.btn_add)
|
||||||
|
RadioButton btnAdd;
|
||||||
|
@BindView(R.id.btn_all)
|
||||||
|
RadioButton btnAll;
|
||||||
|
@BindView(R.id.dock_radio_group)
|
||||||
|
RadioGroup dockRadioGroup;
|
||||||
|
@BindView(R.id.drawer_layout)
|
||||||
|
DrawerLayout drawerLayout;
|
||||||
|
@BindView(R.id.nav_view)
|
||||||
|
NavigationView navView;
|
||||||
|
|
||||||
|
private static final String TAG = "HomeActivity";
|
||||||
|
ActionBar actionBar;
|
||||||
|
Fragment fragment;
|
||||||
|
FragmentManager manager = getSupportFragmentManager();
|
||||||
|
FragmentTransaction transaction = manager.beginTransaction();
|
||||||
|
SharedPreferenceUtil spu;
|
||||||
|
private UserDao userDao;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_home);
|
||||||
|
ButterKnife.bind(this);
|
||||||
|
userDao = new UserDao(this);
|
||||||
|
spu = SharedPreferenceUtil.getInstance(this);
|
||||||
|
initView();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化控件
|
||||||
|
*/
|
||||||
|
public void initView() {
|
||||||
|
// 工具栏
|
||||||
|
toolbar.setTitle(R.string.app_name);
|
||||||
|
setTitleCenter(toolbar);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
|
actionBar = getSupportActionBar();
|
||||||
|
if (actionBar != null) {
|
||||||
|
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||||
|
actionBar.setHomeAsUpIndicator(R.drawable.icon_setting);
|
||||||
|
}
|
||||||
|
// 抽屉
|
||||||
|
ViewGroup.LayoutParams params = navView.getLayoutParams();
|
||||||
|
params.width = getResources().getDisplayMetrics().widthPixels / 2;
|
||||||
|
navView.setLayoutParams(params);
|
||||||
|
navView.setNavigationItemSelectedListener(this);
|
||||||
|
// 抽屉中的header
|
||||||
|
View headerView = navView.getHeaderView(0);
|
||||||
|
TextView textUserName = headerView.findViewById(R.id.header_user_name);
|
||||||
|
TextView textEmail = headerView.findViewById(R.id.header_email);
|
||||||
|
textUserName.setText(spu.getString(Constant.USER_NAME));
|
||||||
|
textEmail.setText(getEmail());
|
||||||
|
// 默认加载置顶Fragment
|
||||||
|
fragment = new TopFragment();
|
||||||
|
transaction.replace(R.id.view_pager, fragment, Constant.TOP_TAG);
|
||||||
|
transaction.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单选按钮监听器 用来切换Fragment
|
||||||
|
*
|
||||||
|
* @param view
|
||||||
|
* @param isChanged
|
||||||
|
*/
|
||||||
|
@OnCheckedChanged({R.id.btn_add, R.id.btn_all, R.id.btn_top})
|
||||||
|
public void onCheckedChanged(CompoundButton view, boolean isChanged) {
|
||||||
|
transaction = manager.beginTransaction();
|
||||||
|
switch (view.getId()) {
|
||||||
|
case R.id.btn_top:
|
||||||
|
if (isChanged) {
|
||||||
|
fragment = new TopFragment();
|
||||||
|
transaction.replace(R.id.view_pager, fragment, Constant.TOP_TAG);
|
||||||
|
transaction.commit();
|
||||||
|
Constant.PAGE_STATE = "top";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.btn_add:
|
||||||
|
if (isChanged) {
|
||||||
|
fragment = new AddFragment();
|
||||||
|
transaction.replace(R.id.view_pager, fragment, Constant.ADD_TAG);
|
||||||
|
transaction.commit();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.btn_all:
|
||||||
|
if (isChanged) {
|
||||||
|
fragment = new AllFragment();
|
||||||
|
transaction.replace(R.id.view_pager, fragment, Constant.LIST_TAG);
|
||||||
|
transaction.commit();
|
||||||
|
Constant.PAGE_STATE = "all";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得登录用户的邮箱
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getEmail() {
|
||||||
|
List<UserBean> userBeans = userDao
|
||||||
|
.queryByUserNameAndPassword(spu.getString(Constant.USER_NAME), spu.getString(Constant.PASSWORD));
|
||||||
|
return userBeans.get(0).getEmail();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抽屉中菜单的点击事件
|
||||||
|
*
|
||||||
|
* @param item
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
|
||||||
|
drawerLayout.closeDrawers();
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.nav_change_pwd:
|
||||||
|
DialogUtil.editInfoDialog(this, spu.getInt(Constant.USER_ID));
|
||||||
|
break;
|
||||||
|
case R.id.nav_dismiss:
|
||||||
|
DialogUtil.dismissDialog(this, spu.getInt(Constant.USER_ID));
|
||||||
|
break;
|
||||||
|
case R.id.nav_exit:
|
||||||
|
spu.putBoolean(Constant.AUTO_LOGIN, false);
|
||||||
|
Intent intent = new Intent(HomeActivity.this, MainActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ToolBar的menu
|
||||||
|
*
|
||||||
|
* @param menu
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
|
||||||
|
setIconsVisible(menu, true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重写ToolBar上菜单点击事件
|
||||||
|
* 按照条件查找
|
||||||
|
*
|
||||||
|
* @param item
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.search_title:
|
||||||
|
DialogUtil.searchTitleDialog(this);
|
||||||
|
break;
|
||||||
|
case R.id.search_content:
|
||||||
|
DialogUtil.searchContentDialog(this);
|
||||||
|
break;
|
||||||
|
case R.id.search_category:
|
||||||
|
DialogUtil.searchCategoryDialog(this);
|
||||||
|
break;
|
||||||
|
case android.R.id.home:
|
||||||
|
drawerLayout.openDrawer(GravityCompat.START);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ToolBar标题居中
|
||||||
|
*
|
||||||
|
* @param toolbar
|
||||||
|
*/
|
||||||
|
public void setTitleCenter(Toolbar toolbar) {
|
||||||
|
String title = "title";
|
||||||
|
final CharSequence originalTitle = toolbar.getTitle();
|
||||||
|
toolbar.setTitle(title);
|
||||||
|
for (int i = 0; i < toolbar.getChildCount(); i++) {
|
||||||
|
View view = toolbar.getChildAt(i);
|
||||||
|
if (view instanceof TextView) {
|
||||||
|
TextView textView = (TextView) view;
|
||||||
|
if (title.equals(textView.getText())) {
|
||||||
|
textView.setGravity(Gravity.CENTER);
|
||||||
|
Toolbar.LayoutParams params = new Toolbar.LayoutParams(Toolbar.LayoutParams.WRAP_CONTENT, Toolbar.LayoutParams.MATCH_PARENT);
|
||||||
|
params.gravity = Gravity.CENTER;
|
||||||
|
textView.setLayoutParams(params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toolbar.setTitle(originalTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* menu显示图标
|
||||||
|
*
|
||||||
|
* @param menu
|
||||||
|
* @param flag
|
||||||
|
*/
|
||||||
|
private void setIconsVisible(Menu menu, boolean flag) {
|
||||||
|
// 判断menu是否为空
|
||||||
|
if (menu != null) {
|
||||||
|
try {
|
||||||
|
// 如果不为空,就反射拿到menu的setOptionalIconsVisible方法
|
||||||
|
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
|
||||||
|
// 暴力访问该方法
|
||||||
|
method.setAccessible(true);
|
||||||
|
// 调用该方法显示icon
|
||||||
|
method.invoke(menu, flag);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,205 @@
|
|||||||
|
package com.example.sparrownotes;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.method.HideReturnsTransformationMethod;
|
||||||
|
import android.text.method.PasswordTransformationMethod;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.example.sparrownotes.util.SharedPreferenceUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import butterknife.OnClick;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录页面
|
||||||
|
*/
|
||||||
|
public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
@BindView(R.id.img_icon)
|
||||||
|
ImageView imgIcon;
|
||||||
|
@BindView(R.id.check_auto_login)
|
||||||
|
CheckBox checkAutoLogin;
|
||||||
|
@BindView(R.id.check_remember_pwd)
|
||||||
|
CheckBox checkRememberPwd;
|
||||||
|
@BindView(R.id.text_forget_pwd)
|
||||||
|
TextView textForgetPwd;
|
||||||
|
@BindView(R.id.btn_login)
|
||||||
|
Button btnLogin;
|
||||||
|
@BindView(R.id.edit_username)
|
||||||
|
EditText editUsername;
|
||||||
|
@BindView(R.id.edit_password)
|
||||||
|
EditText editPassword;
|
||||||
|
@BindView(R.id.text_register)
|
||||||
|
TextView textRegister;
|
||||||
|
@BindView(R.id.check_hide_pwd)
|
||||||
|
CheckBox checkHidePwd;
|
||||||
|
|
||||||
|
private static final String TAG = "MainActivity";
|
||||||
|
private UserDao userDao;
|
||||||
|
private String textUserName;
|
||||||
|
private String textPassword;
|
||||||
|
|
||||||
|
private static boolean REMEMBER_PWD = false;
|
||||||
|
private static boolean AUTO_LOGIN = false;
|
||||||
|
SharedPreferenceUtil spu;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
ButterKnife.bind(this);
|
||||||
|
userDao = new UserDao(this);
|
||||||
|
spu = SharedPreferenceUtil.getInstance(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
Intent intent = getIntent();
|
||||||
|
// 如果注册过
|
||||||
|
if (intent.getBooleanExtra(Constant.HAS_REGISTERED, false)) {
|
||||||
|
intent.removeExtra(Constant.HAS_REGISTERED);
|
||||||
|
editUsername.setText(spu.getString(Constant.USER_NAME));
|
||||||
|
editPassword.setText(spu.getString(Constant.PASSWORD));
|
||||||
|
} else {
|
||||||
|
// 如果勾选记住密码
|
||||||
|
if (spu.getBoolean(Constant.REMEMBER_PWD)) {
|
||||||
|
checkRememberPwd.setChecked(true);
|
||||||
|
editUsername.setText(spu.getString(Constant.USER_NAME));
|
||||||
|
editPassword.setText(spu.getString(Constant.PASSWORD));
|
||||||
|
} else {
|
||||||
|
editUsername.setText("");
|
||||||
|
editPassword.setText("");
|
||||||
|
}
|
||||||
|
// 如果勾选自动登录
|
||||||
|
if (spu.getBoolean(Constant.AUTO_LOGIN)) {
|
||||||
|
checkAutoLogin.setChecked(true);
|
||||||
|
Intent intentLogin = new Intent(MainActivity.this, HomeActivity.class);
|
||||||
|
startActivity(intentLogin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick({R.id.check_auto_login, R.id.check_remember_pwd, R.id.btn_login, R.id.text_forget_pwd, R.id.text_register, R.id.check_hide_pwd})
|
||||||
|
public void onViewClicked(View view) {
|
||||||
|
switch (view.getId()) {
|
||||||
|
case R.id.check_auto_login:
|
||||||
|
// 勾选自动登录时自动勾选记住密码
|
||||||
|
if (checkAutoLogin.isChecked()) {
|
||||||
|
checkRememberPwd.setChecked(true);
|
||||||
|
AUTO_LOGIN = true;
|
||||||
|
REMEMBER_PWD = true;
|
||||||
|
} else {
|
||||||
|
AUTO_LOGIN = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.check_remember_pwd:
|
||||||
|
// 勾掉记住密码时自动勾掉自动登录
|
||||||
|
if (!checkRememberPwd.isChecked()) {
|
||||||
|
checkAutoLogin.setChecked(false);
|
||||||
|
AUTO_LOGIN = false;
|
||||||
|
REMEMBER_PWD = false;
|
||||||
|
} else {
|
||||||
|
REMEMBER_PWD = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.btn_login:
|
||||||
|
// 检查非空
|
||||||
|
if (isNotEmpty()) {
|
||||||
|
// 获得用户输入
|
||||||
|
getEditText();
|
||||||
|
// 检查用户名密码
|
||||||
|
if (checkUser()) {
|
||||||
|
// 存入sp 用于接下来页面的显示
|
||||||
|
spu.putBoolean(Constant.REMEMBER_PWD, REMEMBER_PWD);
|
||||||
|
spu.putBoolean(Constant.AUTO_LOGIN, AUTO_LOGIN);
|
||||||
|
spu.putString(Constant.USER_NAME, textUserName);
|
||||||
|
spu.putString(Constant.PASSWORD, textPassword);
|
||||||
|
spu.putInt(Constant.USER_ID, getUserID());
|
||||||
|
Intent intentLogin = new Intent(MainActivity.this, HomeActivity.class);
|
||||||
|
startActivity(intentLogin);
|
||||||
|
finish();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.text_forget_pwd:
|
||||||
|
// 忘记密码
|
||||||
|
Intent intentFind = new Intent(MainActivity.this, FindPwdActivity.class);
|
||||||
|
startActivity(intentFind);
|
||||||
|
break;
|
||||||
|
case R.id.text_register:
|
||||||
|
// 注册
|
||||||
|
Intent intentRegister = new Intent(MainActivity.this, RegisterActivity.class);
|
||||||
|
startActivity(intentRegister);
|
||||||
|
break;
|
||||||
|
case R.id.check_hide_pwd:
|
||||||
|
if (checkHidePwd.isChecked()) {
|
||||||
|
// 将密码显示出来
|
||||||
|
editPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
|
||||||
|
} else {
|
||||||
|
// 隐藏密码
|
||||||
|
editPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
|
||||||
|
}
|
||||||
|
// 将光标移动到文本最后
|
||||||
|
editPassword.setSelection(editPassword.getText().toString().length());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检验输入非空
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isNotEmpty() {
|
||||||
|
return !"".equals(editUsername.getText().toString()) &&
|
||||||
|
!"".equals(editPassword.getText().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从控件中得到输入值
|
||||||
|
*/
|
||||||
|
public void getEditText() {
|
||||||
|
textUserName = editUsername.getText().toString();
|
||||||
|
textPassword = editPassword.getText().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证用户名密码
|
||||||
|
*/
|
||||||
|
public boolean checkUser() {
|
||||||
|
List<UserBean> userBeans = userDao.queryByUserNameAndPassword(textUserName, textPassword);
|
||||||
|
return userBeans.size() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得用户ID
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getUserID() {
|
||||||
|
List<UserBean> userBeans = userDao.queryByUserNameAndPassword(textUserName, textPassword);
|
||||||
|
return userBeans.get(0).getUserID();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,203 @@
|
|||||||
|
package com.example.sparrownotes;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.method.HideReturnsTransformationMethod;
|
||||||
|
import android.text.method.PasswordTransformationMethod;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.example.sparrownotes.util.SharedPreferenceUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import butterknife.OnClick;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册页面
|
||||||
|
*/
|
||||||
|
public class RegisterActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
@BindView(R.id.btn_register)
|
||||||
|
Button btnRegister;
|
||||||
|
@BindView(R.id.btn_reset)
|
||||||
|
Button btnReset;
|
||||||
|
@BindView(R.id.check_hide_pwd_reg)
|
||||||
|
CheckBox checkHidePwdReg;
|
||||||
|
@BindView(R.id.check_hide_pwd_reg2)
|
||||||
|
CheckBox checkHidePwdReg2;
|
||||||
|
@BindView(R.id.edit_username_reg)
|
||||||
|
EditText editUsernameReg;
|
||||||
|
@BindView(R.id.edit_confirm_pwd_reg)
|
||||||
|
EditText editConfirmPwdReg;
|
||||||
|
@BindView(R.id.edit_email_reg)
|
||||||
|
EditText editEmailReg;
|
||||||
|
@BindView(R.id.edit_password_reg)
|
||||||
|
EditText editPasswordReg;
|
||||||
|
|
||||||
|
SharedPreferenceUtil spu;
|
||||||
|
private static final String TAG = "RegisterActivity";
|
||||||
|
private UserDao userDao;
|
||||||
|
private String textUserName;
|
||||||
|
private String textPassword;
|
||||||
|
private String textConfirmPwd;
|
||||||
|
private String textEmail;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_register);
|
||||||
|
ButterKnife.bind(this);
|
||||||
|
userDao = new UserDao(this);
|
||||||
|
spu = SharedPreferenceUtil.getInstance(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick({R.id.btn_register, R.id.btn_reset, R.id.check_hide_pwd_reg, R.id.check_hide_pwd_reg2})
|
||||||
|
public void onViewClicked(View view) {
|
||||||
|
switch (view.getId()) {
|
||||||
|
case R.id.btn_register:
|
||||||
|
// 检验非空
|
||||||
|
if (isNotEmpty()) {
|
||||||
|
// 获得用户输入
|
||||||
|
getEditText();
|
||||||
|
// 检验密码
|
||||||
|
if (comparePwd()) {
|
||||||
|
// 检查邮箱格式
|
||||||
|
if (checkEmail()) {
|
||||||
|
// 检查邮箱是否可用
|
||||||
|
if (checkOnlyEmail()) {
|
||||||
|
insertUserIntoDB();
|
||||||
|
queryAll();
|
||||||
|
Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
|
||||||
|
intent.putExtra(Constant.HAS_REGISTERED, true);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "邮箱已经被使用", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "邮箱格式错误", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "两次输入的密码不一致", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R.id.btn_reset:
|
||||||
|
editUsernameReg.setText("");
|
||||||
|
editPasswordReg.setText("");
|
||||||
|
editConfirmPwdReg.setText("");
|
||||||
|
editEmailReg.setText("");
|
||||||
|
break;
|
||||||
|
case R.id.check_hide_pwd_reg:
|
||||||
|
if (checkHidePwdReg.isChecked()) {
|
||||||
|
// 将密码显示出来
|
||||||
|
editPasswordReg.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
|
||||||
|
} else {
|
||||||
|
// 隐藏密码
|
||||||
|
editPasswordReg.setTransformationMethod(PasswordTransformationMethod.getInstance());
|
||||||
|
}
|
||||||
|
// 将光标移动到文本最后
|
||||||
|
editPasswordReg.setSelection(editPasswordReg.getText().toString().length());
|
||||||
|
break;
|
||||||
|
case R.id.check_hide_pwd_reg2:
|
||||||
|
if (checkHidePwdReg2.isChecked()) {
|
||||||
|
// 将密码显示出来
|
||||||
|
editConfirmPwdReg.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
|
||||||
|
} else {
|
||||||
|
// 隐藏密码
|
||||||
|
editConfirmPwdReg.setTransformationMethod(PasswordTransformationMethod.getInstance());
|
||||||
|
}
|
||||||
|
// 将光标移动到文本最后
|
||||||
|
editConfirmPwdReg.setSelection(editConfirmPwdReg.getText().toString().length());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检验输入非空
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isNotEmpty() {
|
||||||
|
return !"".equals(editUsernameReg.getText().toString()) &&
|
||||||
|
!"".equals(editPasswordReg.getText().toString()) &&
|
||||||
|
!"".equals(editConfirmPwdReg.getText().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从控件中得到输入值
|
||||||
|
*/
|
||||||
|
public void getEditText() {
|
||||||
|
textUserName = editUsernameReg.getText().toString();
|
||||||
|
textPassword = editPasswordReg.getText().toString();
|
||||||
|
textConfirmPwd = editConfirmPwdReg.getText().toString();
|
||||||
|
textEmail = editEmailReg.getText().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查邮箱是否可用
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean checkOnlyEmail() {
|
||||||
|
List<UserBean> userBeans = userDao.queryForWhat("email", textEmail);
|
||||||
|
return userBeans.size() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证两次输入的密码是否一致
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean comparePwd() {
|
||||||
|
return textPassword.equals(textConfirmPwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查邮箱格式
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean checkEmail() {
|
||||||
|
Matcher emailMatcher = Constant.EMAIL_PATTERN.matcher(textEmail);
|
||||||
|
return emailMatcher.matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向数据库表插入数据
|
||||||
|
*/
|
||||||
|
public void insertUserIntoDB() {
|
||||||
|
UserBean userBean = new UserBean(textUserName, textPassword, textEmail);
|
||||||
|
userDao.insert(userBean);
|
||||||
|
// 同时存到SP中
|
||||||
|
spu.putString(Constant.USER_NAME, textUserName);
|
||||||
|
spu.putString(Constant.PASSWORD, textPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询表中所有数据
|
||||||
|
*/
|
||||||
|
public void queryAll() {
|
||||||
|
List<UserBean> userBeans = userDao.queryAll();
|
||||||
|
for (int i = 0; i < userBeans.size(); i++) {
|
||||||
|
Log.d(TAG, "queryAll: " + userBeans.get(i).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,136 @@
|
|||||||
|
package com.example.sparrownotes.bean;
|
||||||
|
|
||||||
|
import com.j256.ormlite.field.DatabaseField;
|
||||||
|
import com.j256.ormlite.table.DatabaseTable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 笔记实体类
|
||||||
|
* noteID 笔记ID 主键
|
||||||
|
* title 标题
|
||||||
|
* content 内容
|
||||||
|
* category 类别
|
||||||
|
* time 创建时间
|
||||||
|
* imgResource 图片资源(int)
|
||||||
|
* isTop 是否置顶
|
||||||
|
*/
|
||||||
|
@DatabaseTable(tableName = "tb_note")
|
||||||
|
public class NoteBean {
|
||||||
|
|
||||||
|
@DatabaseField(generatedId = true, columnName = "note_id")
|
||||||
|
private int noteID;
|
||||||
|
|
||||||
|
@DatabaseField(columnName = "user_id")
|
||||||
|
private int userID;
|
||||||
|
|
||||||
|
@DatabaseField(defaultValue = "无标题")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@DatabaseField(defaultValue = "空")
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@DatabaseField(defaultValue = "未分类")
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
@DatabaseField(defaultValue = "未知")
|
||||||
|
private String time;
|
||||||
|
|
||||||
|
@DatabaseField(columnName = "img_resource")
|
||||||
|
private int imgResource;
|
||||||
|
|
||||||
|
@DatabaseField(defaultValue = "0", columnName = "is_top")
|
||||||
|
private String isTop;
|
||||||
|
|
||||||
|
public NoteBean() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public NoteBean(int userID, String title, String content, String category, String time) {
|
||||||
|
this.userID = userID;
|
||||||
|
this.title = title;
|
||||||
|
this.content = content;
|
||||||
|
this.category = category;
|
||||||
|
this.time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NoteBean(int userID, String title, String content, String category, String time, int imgResource) {
|
||||||
|
this.userID = userID;
|
||||||
|
this.title = title;
|
||||||
|
this.content = content;
|
||||||
|
this.category = category;
|
||||||
|
this.time = time;
|
||||||
|
this.imgResource = imgResource;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "NoteBean{" +
|
||||||
|
"noteID=" + noteID +
|
||||||
|
"userID=" + userID +
|
||||||
|
", title='" + title + '\'' +
|
||||||
|
", content='" + content + '\'' +
|
||||||
|
", category='" + category + '\'' +
|
||||||
|
", time='" + time + '\'' +
|
||||||
|
", imgResource='" + imgResource + '\'' +
|
||||||
|
", isTop='" + isTop + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getUserID() {
|
||||||
|
return userID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserID(int userID) {
|
||||||
|
this.userID = userID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTop() {
|
||||||
|
return isTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTop(String isTop) {
|
||||||
|
this.isTop = isTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNoteID() {
|
||||||
|
return noteID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContent(String content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCategory() {
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCategory(String category) {
|
||||||
|
this.category = category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTime() {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTime(String time) {
|
||||||
|
this.time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getImgResource() {
|
||||||
|
return imgResource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImgResource(int imgResource) {
|
||||||
|
this.imgResource = imgResource;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
package com.example.sparrownotes.bean;
|
||||||
|
|
||||||
|
import com.j256.ormlite.field.DatabaseField;
|
||||||
|
import com.j256.ormlite.table.DatabaseTable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户实体类
|
||||||
|
* userID 用户ID
|
||||||
|
* userName 用户名
|
||||||
|
* password 密码
|
||||||
|
* email 邮箱
|
||||||
|
*/
|
||||||
|
@DatabaseTable(tableName = "tb_user")
|
||||||
|
public class UserBean {
|
||||||
|
|
||||||
|
@DatabaseField(generatedId = true, columnName = "user_id")
|
||||||
|
private int userID;
|
||||||
|
|
||||||
|
@DatabaseField(columnName = "user_name")
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
@DatabaseField
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@DatabaseField
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public UserBean() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserBean(String userName, String password, String email) {
|
||||||
|
this.userName = userName;
|
||||||
|
this.password = password;
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "UserBean{" +
|
||||||
|
"userID=" + userID +
|
||||||
|
", userName='" + userName + '\'' +
|
||||||
|
", password='" + password + '\'' +
|
||||||
|
", email='" + email + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getUserID() {
|
||||||
|
return userID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserName(String userName) {
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.example.sparrownotes.bean.adapter;
|
||||||
|
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.viewpager.widget.PagerAdapter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ViewPager适配器
|
||||||
|
*/
|
||||||
|
public class MyPagerAdapter extends PagerAdapter {
|
||||||
|
|
||||||
|
private List<View> views;
|
||||||
|
|
||||||
|
public MyPagerAdapter(List<View> views) {
|
||||||
|
this.views = views;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
||||||
|
View view = views.get(position);
|
||||||
|
container.addView(view);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
|
||||||
|
container.removeView(views.get(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return views.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
|
||||||
|
return view == object;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,221 @@
|
|||||||
|
package com.example.sparrownotes.bean.adapter;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.view.menu.MenuPopupHelper;
|
||||||
|
import androidx.appcompat.widget.PopupMenu;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.example.sparrownotes.R;
|
||||||
|
import com.example.sparrownotes.bean.NoteBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.example.sparrownotes.util.DialogUtil;
|
||||||
|
import com.example.sparrownotes.util.SharedPreferenceUtil;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RecyclerView适配器
|
||||||
|
*/
|
||||||
|
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.ViewHolder> {
|
||||||
|
private List<NoteBean> notesList;
|
||||||
|
private Context context;
|
||||||
|
private NoteDao noteDao;
|
||||||
|
SharedPreferenceUtil spu;
|
||||||
|
|
||||||
|
static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
View noteView;
|
||||||
|
View itemLayout;
|
||||||
|
ImageView itemCateImage;
|
||||||
|
ImageView itemMenu;
|
||||||
|
TextView itemTitle;
|
||||||
|
TextView itemId;
|
||||||
|
TextView itemContent;
|
||||||
|
TextView itemTime;
|
||||||
|
TextView itemCategory;
|
||||||
|
|
||||||
|
public ViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
noteView = itemView;
|
||||||
|
itemId = itemView.findViewById(R.id.item_id);
|
||||||
|
itemTitle = itemView.findViewById(R.id.item_title);
|
||||||
|
itemContent = itemView.findViewById(R.id.item_content);
|
||||||
|
itemCategory = itemView.findViewById(R.id.item_category);
|
||||||
|
itemTime = itemView.findViewById(R.id.item_time);
|
||||||
|
itemMenu = itemView.findViewById(R.id.item_menu);
|
||||||
|
itemLayout = itemView.findViewById(R.id.item_layout);
|
||||||
|
itemCateImage = itemView.findViewById(R.id.item_cate_img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public NoteAdapter(List<NoteBean> notesList, Context context) {
|
||||||
|
this.notesList = notesList;
|
||||||
|
this.context = context;
|
||||||
|
noteDao = new NoteDao(context);
|
||||||
|
spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("RestrictedApi")
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(parent.getContext())
|
||||||
|
.inflate(R.layout.note_item, parent, false);
|
||||||
|
final ViewHolder holder = new ViewHolder(view);
|
||||||
|
|
||||||
|
holder.itemMenu.setOnClickListener(v -> {
|
||||||
|
// 根据页面显示不同的菜单
|
||||||
|
if ("all".equals(Constant.PAGE_STATE)) {
|
||||||
|
PopupMenu popupMenu = new PopupMenu(v.getContext(), v, Gravity.RIGHT);
|
||||||
|
popupMenu.getMenuInflater().inflate(R.menu.item_menu_all, popupMenu.getMenu());
|
||||||
|
// 弹出式菜单的菜单项点击事件
|
||||||
|
popupMenu.setOnMenuItemClickListener(item -> {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.delete_all:
|
||||||
|
// 删除
|
||||||
|
removeData(holder.getAdapterPosition());
|
||||||
|
Toast.makeText(v.getContext(), "删除成功", Toast.LENGTH_SHORT).show();
|
||||||
|
break;
|
||||||
|
case R.id.top_all:
|
||||||
|
//置顶
|
||||||
|
setTop(holder.getAdapterPosition());
|
||||||
|
Toast.makeText(v.getContext(), "已置顶", Toast.LENGTH_SHORT).show();
|
||||||
|
break;
|
||||||
|
case R.id.edit_all:
|
||||||
|
//编辑
|
||||||
|
DialogUtil.editNoteDialog(context, notesList.get(holder.getAdapterPosition()).getNoteID());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
setIconsVisible(popupMenu, true);
|
||||||
|
popupMenu.show();
|
||||||
|
} else {
|
||||||
|
PopupMenu popupMenu = new PopupMenu(v.getContext(), v, Gravity.RIGHT);
|
||||||
|
popupMenu.getMenuInflater().inflate(R.menu.item_menu_top, popupMenu.getMenu());
|
||||||
|
// 弹出式菜单的菜单项点击事件
|
||||||
|
popupMenu.setOnMenuItemClickListener(item -> {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.delete_top:
|
||||||
|
// 删除
|
||||||
|
removeData(holder.getAdapterPosition());
|
||||||
|
Toast.makeText(v.getContext(), "删除成功", Toast.LENGTH_SHORT).show();
|
||||||
|
break;
|
||||||
|
case R.id.top_top:
|
||||||
|
// 取消置顶
|
||||||
|
notSetTop(holder.getAdapterPosition());
|
||||||
|
Toast.makeText(v.getContext(), "取消置顶", Toast.LENGTH_SHORT).show();
|
||||||
|
break;
|
||||||
|
case R.id.edit_top:
|
||||||
|
// 编辑
|
||||||
|
DialogUtil.editNoteDialog(context, notesList.get(holder.getAdapterPosition()).getNoteID());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
// 使弹出菜单的图标可见
|
||||||
|
setIconsVisible(popupMenu, true);
|
||||||
|
popupMenu.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
|
||||||
|
NoteBean noteItem = notesList.get(position);
|
||||||
|
holder.itemId.setText(String.valueOf(noteItem.getNoteID()));
|
||||||
|
holder.itemTitle.setText(noteItem.getTitle());
|
||||||
|
holder.itemContent.setText(noteItem.getContent());
|
||||||
|
holder.itemCategory.setText(noteItem.getCategory());
|
||||||
|
holder.itemTime.setText(noteItem.getTime());
|
||||||
|
int imgResource = noteItem.getImgResource();
|
||||||
|
/*
|
||||||
|
* 通过Glide获取图片资源
|
||||||
|
* 这里本来做的是获取tomcat中的图片url, 考虑到每次运行都要启动tomcat
|
||||||
|
* 就改成了本地的方式
|
||||||
|
* 等到交作业的时候再弄一个网络的版本
|
||||||
|
*/
|
||||||
|
Glide.with(context).load(imgResource).into(holder.itemCateImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return notesList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除一条数据
|
||||||
|
*
|
||||||
|
* @param position
|
||||||
|
*/
|
||||||
|
public void removeData(int position) {
|
||||||
|
// 从数据库删除
|
||||||
|
noteDao.delete(notesList.get(position).getNoteID());
|
||||||
|
// 从List中删除
|
||||||
|
notesList.remove(position);
|
||||||
|
notifyItemRemoved(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改一条数据(置顶)
|
||||||
|
*
|
||||||
|
* @param position
|
||||||
|
*/
|
||||||
|
public void setTop(int position) {
|
||||||
|
NoteBean noteItem = noteDao.queryById(notesList.get(position).getNoteID(), spu.getInt(Constant.USER_ID));
|
||||||
|
noteItem.setTop("1");
|
||||||
|
noteDao.update(noteItem);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改一条数据(取消置顶)
|
||||||
|
*
|
||||||
|
* @param position
|
||||||
|
*/
|
||||||
|
public void notSetTop(int position) {
|
||||||
|
NoteBean noteItem = noteDao.queryById(notesList.get(position).getNoteID(), spu.getInt(Constant.USER_ID));
|
||||||
|
noteItem.setTop("0");
|
||||||
|
noteDao.update(noteItem);
|
||||||
|
notesList.remove(position);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* menu显示图标
|
||||||
|
*
|
||||||
|
* @param popupMenu
|
||||||
|
* @param flag
|
||||||
|
*/
|
||||||
|
@SuppressLint("RestrictedApi")
|
||||||
|
private void setIconsVisible(PopupMenu popupMenu, boolean flag) {
|
||||||
|
//判断menu是否为空
|
||||||
|
if (popupMenu != null) {
|
||||||
|
try {
|
||||||
|
Field field = popupMenu.getClass().getDeclaredField("mPopup");
|
||||||
|
field.setAccessible(true);
|
||||||
|
MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popupMenu);
|
||||||
|
mHelper.setForceShowIcon(flag);
|
||||||
|
} catch (IllegalAccessException | NoSuchFieldException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,210 @@
|
|||||||
|
package com.example.sparrownotes.dao;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.NoteBean;
|
||||||
|
import com.example.sparrownotes.util.DBHelper;
|
||||||
|
import com.j256.ormlite.dao.Dao;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 笔记操作类
|
||||||
|
*
|
||||||
|
* @author Horsen
|
||||||
|
*/
|
||||||
|
public class NoteDao {
|
||||||
|
private Dao<NoteBean, Integer> dao;
|
||||||
|
|
||||||
|
public NoteDao(Context context) {
|
||||||
|
try {
|
||||||
|
this.dao = DBHelper.getInstance(context).getDao(NoteBean.class);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建数据
|
||||||
|
*
|
||||||
|
* @param data 数据
|
||||||
|
*/
|
||||||
|
public void create(NoteBean data) {
|
||||||
|
try {
|
||||||
|
dao.createOrUpdate(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建数据集合
|
||||||
|
*
|
||||||
|
* @param datas 数据集合
|
||||||
|
*/
|
||||||
|
public void createList(List<NoteBean> datas) {
|
||||||
|
try {
|
||||||
|
dao.create(datas);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向note表中添加一条数据
|
||||||
|
* create:插入一条数据或集合
|
||||||
|
* createIfNotExists:如果不存在则插入
|
||||||
|
* createOrUpdate:如果指定id则更新
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void insert(NoteBean data) {
|
||||||
|
try {
|
||||||
|
dao.createIfNotExists(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过id删除指定数据
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
public void delete(int id) {
|
||||||
|
try {
|
||||||
|
dao.deleteById(id);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除表中的一条数据
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void delete(NoteBean data) {
|
||||||
|
try {
|
||||||
|
dao.delete(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除表中数据集合
|
||||||
|
*
|
||||||
|
* @param datas
|
||||||
|
*/
|
||||||
|
public void deleteList(List<NoteBean> datas) {
|
||||||
|
try {
|
||||||
|
dao.delete(datas);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清空数据
|
||||||
|
*/
|
||||||
|
public void deleteAll() {
|
||||||
|
try {
|
||||||
|
dao.delete(dao.queryForAll());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改表中的一条数据
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void update(NoteBean data) {
|
||||||
|
try {
|
||||||
|
dao.update(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询表中的所有数据
|
||||||
|
*
|
||||||
|
* @return 返回查询结果集
|
||||||
|
*/
|
||||||
|
public List<NoteBean> queryAll(int userID) {
|
||||||
|
List<NoteBean> notes = null;
|
||||||
|
try {
|
||||||
|
notes = dao.queryBuilder()
|
||||||
|
.orderBy("note_id", false)
|
||||||
|
.where().eq("user_id", userID)
|
||||||
|
.query();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据ID取出笔记信息
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public NoteBean queryById(int id, int userID) {
|
||||||
|
NoteBean note = null;
|
||||||
|
try {
|
||||||
|
note = dao.queryBuilder()
|
||||||
|
.where().eq("note_id", id)
|
||||||
|
.and().eq("user_id", userID)
|
||||||
|
.queryForFirst();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return note;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过列名和数据查找
|
||||||
|
*
|
||||||
|
* @param columnName 列名
|
||||||
|
* @param data 数据
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<NoteBean> queryForWhat(String columnName, String data, int userID) {
|
||||||
|
List<NoteBean> notes = null;
|
||||||
|
try {
|
||||||
|
notes = dao.queryBuilder()
|
||||||
|
.orderBy("note_id", false)
|
||||||
|
.where().eq(columnName, data)
|
||||||
|
.and().eq("user_id", userID)
|
||||||
|
.query();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模糊查询
|
||||||
|
*
|
||||||
|
* @param columnName
|
||||||
|
* @param data
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<NoteBean> queryLikeWhat(String columnName, String data, int userID) {
|
||||||
|
List<NoteBean> notes = null;
|
||||||
|
try {
|
||||||
|
notes = dao.queryBuilder()
|
||||||
|
.orderBy("note_id", false)
|
||||||
|
.where().like(columnName, "%" + data + "%")
|
||||||
|
.and().eq("user_id", userID)
|
||||||
|
.query();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return notes;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,200 @@
|
|||||||
|
package com.example.sparrownotes.dao;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.util.DBHelper;
|
||||||
|
import com.j256.ormlite.dao.Dao;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户操作类
|
||||||
|
*
|
||||||
|
* @author Horsen
|
||||||
|
*/
|
||||||
|
public class UserDao {
|
||||||
|
private Dao<UserBean, Integer> dao;
|
||||||
|
|
||||||
|
public UserDao(Context context) {
|
||||||
|
try {
|
||||||
|
this.dao = DBHelper.getInstance(context).getDao(UserBean.class);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建数据
|
||||||
|
*
|
||||||
|
* @param data 数据
|
||||||
|
*/
|
||||||
|
public void create(UserBean data) {
|
||||||
|
try {
|
||||||
|
dao.createOrUpdate(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建数据集合
|
||||||
|
*
|
||||||
|
* @param datas 数据集合
|
||||||
|
*/
|
||||||
|
public void createList(List<UserBean> datas) {
|
||||||
|
try {
|
||||||
|
dao.create(datas);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向user表中添加一条数据
|
||||||
|
* create:插入一条数据或集合
|
||||||
|
* createIfNotExists:如果不存在则插入
|
||||||
|
* createOrUpdate:如果指定id则更新
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void insert(UserBean data) {
|
||||||
|
try {
|
||||||
|
dao.createIfNotExists(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过id删除指定数据
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
public void delete(int id) {
|
||||||
|
try {
|
||||||
|
dao.deleteById(id);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除表中的一条数据
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void delete(UserBean data) {
|
||||||
|
try {
|
||||||
|
dao.delete(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除表中数据集合
|
||||||
|
*
|
||||||
|
* @param datas
|
||||||
|
*/
|
||||||
|
public void deleteList(List<UserBean> datas) {
|
||||||
|
try {
|
||||||
|
dao.delete(datas);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清空数据
|
||||||
|
*/
|
||||||
|
public void deleteAll() {
|
||||||
|
try {
|
||||||
|
dao.delete(dao.queryForAll());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改表中的一条数据
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public void update(UserBean data) {
|
||||||
|
try {
|
||||||
|
dao.update(data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询表中的所有数据
|
||||||
|
*
|
||||||
|
* @return 返回查询结果集
|
||||||
|
*/
|
||||||
|
public List<UserBean> queryAll() {
|
||||||
|
List<UserBean> users = null;
|
||||||
|
try {
|
||||||
|
users = dao.queryForAll();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据ID取出用户信息
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public UserBean queryById(int id) {
|
||||||
|
UserBean user = null;
|
||||||
|
try {
|
||||||
|
user = dao.queryForId(id);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过列名和数据查找
|
||||||
|
*
|
||||||
|
* @param columnName 列名
|
||||||
|
* @param data 数据
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<UserBean> queryForWhat(String columnName, String data) {
|
||||||
|
List<UserBean> users = null;
|
||||||
|
try {
|
||||||
|
users = dao.queryForEq(columnName, data);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过条件查询集合
|
||||||
|
*
|
||||||
|
* @param userName 用户名
|
||||||
|
* @param password 密码
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<UserBean> queryByUserNameAndPassword(String userName, String password) {
|
||||||
|
List<UserBean> users = null;
|
||||||
|
try {
|
||||||
|
users = dao.queryBuilder()
|
||||||
|
.orderBy("user_id", true)
|
||||||
|
.where().eq("user_name", userName)
|
||||||
|
.and().eq("password", password)
|
||||||
|
.query();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,115 @@
|
|||||||
|
package com.example.sparrownotes.fragment;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.R;
|
||||||
|
import com.example.sparrownotes.bean.adapter.NoteAdapter;
|
||||||
|
import com.example.sparrownotes.bean.NoteBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.example.sparrownotes.util.SharedPreferenceUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示所有note
|
||||||
|
*/
|
||||||
|
public class AllFragment extends Fragment {
|
||||||
|
RecyclerView recyclerView;
|
||||||
|
SwipeRefreshLayout swipeRefresh;
|
||||||
|
NoteAdapter adapter;
|
||||||
|
private List<NoteBean> notesList = new ArrayList<>();
|
||||||
|
private NoteDao noteDao;
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(getActivity());
|
||||||
|
|
||||||
|
public AllFragment() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
return inflater.inflate(R.layout.fragment_all, container, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
noteDao = new NoteDao(getActivity());
|
||||||
|
initData();
|
||||||
|
initView();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化界面
|
||||||
|
*/
|
||||||
|
@SuppressLint("ResourceAsColor")
|
||||||
|
public void initView() {
|
||||||
|
// 下拉刷新组件
|
||||||
|
swipeRefresh = getActivity().findViewById(R.id.swipe_refresh_all);
|
||||||
|
swipeRefresh.setColorSchemeColors(R.color.colorPrimary);
|
||||||
|
swipeRefresh.setOnRefreshListener(this::refreshNotes);
|
||||||
|
// 替代ListView
|
||||||
|
recyclerView = getActivity().findViewById(R.id.recycler_view_all);
|
||||||
|
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
|
||||||
|
recyclerView.setLayoutManager(layoutManager);
|
||||||
|
adapter = new NoteAdapter(notesList, getActivity());
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化数据
|
||||||
|
*/
|
||||||
|
public void initData() {
|
||||||
|
List<NoteBean> noteBeams = noteDao.queryAll(spu.getInt(Constant.USER_ID));
|
||||||
|
notesList.addAll(noteBeams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新数据
|
||||||
|
*/
|
||||||
|
public void updateData() {
|
||||||
|
notesList.clear();
|
||||||
|
// 获得sp中的查询条件 更新数据源
|
||||||
|
String column = spu.getString(Constant.SEARCH_FOR_WHAT);
|
||||||
|
String value = spu.getString(Constant.SEARCH_VALUE);
|
||||||
|
if (column != "" && value != "") {
|
||||||
|
List<NoteBean> noteBeans = noteDao.queryLikeWhat(column, value,spu.getInt(Constant.USER_ID));
|
||||||
|
notesList.addAll(noteBeans);
|
||||||
|
// 用后即删
|
||||||
|
spu.removeKey(Constant.SEARCH_FOR_WHAT);
|
||||||
|
spu.removeKey(Constant.SEARCH_VALUE);
|
||||||
|
} else {
|
||||||
|
initData();
|
||||||
|
}
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉刷新
|
||||||
|
*/
|
||||||
|
public void refreshNotes() {
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
Thread.sleep(500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
getActivity().runOnUiThread(() -> {
|
||||||
|
updateData();
|
||||||
|
swipeRefresh.setRefreshing(false);
|
||||||
|
});
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,162 @@
|
|||||||
|
package com.example.sparrownotes.fragment;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.R;
|
||||||
|
import com.example.sparrownotes.bean.adapter.NoteAdapter;
|
||||||
|
import com.example.sparrownotes.bean.NoteBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.example.sparrownotes.util.SharedPreferenceUtil;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示置顶note
|
||||||
|
*/
|
||||||
|
public class TopFragment extends Fragment {
|
||||||
|
|
||||||
|
RecyclerView recyclerView;
|
||||||
|
SwipeRefreshLayout swipeRefresh;
|
||||||
|
NoteAdapter adapter;
|
||||||
|
TextView textTime, textGreeting;
|
||||||
|
private List<NoteBean> notesList = new ArrayList<>();
|
||||||
|
private static final String TAG = "TopFragment";
|
||||||
|
private NoteDao noteDao;
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(getActivity());
|
||||||
|
|
||||||
|
public TopFragment() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
return inflater.inflate(R.layout.fragment_top, container, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
noteDao = new NoteDao(getActivity());
|
||||||
|
initData();
|
||||||
|
initView();
|
||||||
|
updateData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
// 发送消息 更新时间
|
||||||
|
handler.sendEmptyMessage(Constant.UPDATE_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
// 停止更新时间
|
||||||
|
handler.removeCallbacksAndMessages(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化界面
|
||||||
|
*/
|
||||||
|
@SuppressLint("ResourceAsColor")
|
||||||
|
public void initView() {
|
||||||
|
// 下拉刷新组件
|
||||||
|
swipeRefresh = getActivity().findViewById(R.id.swipe_refresh_top);
|
||||||
|
swipeRefresh.setColorSchemeColors(R.color.colorPrimary);
|
||||||
|
swipeRefresh.setOnRefreshListener(this::refreshNotes);
|
||||||
|
// 代替ListView
|
||||||
|
recyclerView = getActivity().findViewById(R.id.recycler_view_top);
|
||||||
|
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
|
||||||
|
recyclerView.setLayoutManager(layoutManager);
|
||||||
|
adapter = new NoteAdapter(notesList, getActivity());
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
textTime = getActivity().findViewById(R.id.text_time);
|
||||||
|
textGreeting = getActivity().findViewById(R.id.text_greeting);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化数据
|
||||||
|
*/
|
||||||
|
public void initData() {
|
||||||
|
List<NoteBean> noteBeans = noteDao.queryForWhat("is_top", "1", spu.getInt(Constant.USER_ID));
|
||||||
|
notesList.addAll(noteBeans);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新数据(假更新)
|
||||||
|
*/
|
||||||
|
public void updateData() {
|
||||||
|
notesList.clear();
|
||||||
|
initData();
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉刷新
|
||||||
|
*/
|
||||||
|
public void refreshNotes() {
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
Thread.sleep(500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
getActivity().runOnUiThread(() -> {
|
||||||
|
updateData();
|
||||||
|
swipeRefresh.setRefreshing(false);
|
||||||
|
});
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得今天的日期
|
||||||
|
*
|
||||||
|
* @return 日期字符串
|
||||||
|
*/
|
||||||
|
public String getToday() {
|
||||||
|
// 日期格式
|
||||||
|
SimpleDateFormat weekFormat = new SimpleDateFormat("EEEE");
|
||||||
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
|
||||||
|
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
|
||||||
|
//获取当前时间
|
||||||
|
Date dateTime = new Date(System.currentTimeMillis());
|
||||||
|
String week = weekFormat.format(dateTime);
|
||||||
|
String date = dateFormat.format(dateTime);
|
||||||
|
String time = timeFormat.format(dateTime);
|
||||||
|
return week + "\n" + date + "\n" + time;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实现主线程和子线程之间的通信
|
||||||
|
* 通知时间更新
|
||||||
|
*/
|
||||||
|
@SuppressLint("HandlerLeak")
|
||||||
|
private Handler handler = new Handler() {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(@NonNull Message msg) {
|
||||||
|
if (msg.what == Constant.UPDATE_TIME) {
|
||||||
|
textTime.setText(getToday());
|
||||||
|
sendEmptyMessageDelayed(Constant.UPDATE_TIME, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.example.sparrownotes.util;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.R;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class Constant {
|
||||||
|
// 数据库名和版本号
|
||||||
|
public static final String DB_NAME = "sparrow.db";
|
||||||
|
public static final int DB_VERSION = 1;
|
||||||
|
// 用来判断邮箱格式的正则表达式
|
||||||
|
public static final String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
|
||||||
|
public static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX);
|
||||||
|
// 用来存储用户登录操作的键
|
||||||
|
public static final String HAS_REGISTERED = "has_registered";
|
||||||
|
public static final String REMEMBER_PWD = "remember_pwd";
|
||||||
|
public static final String AUTO_LOGIN = "auto_login";
|
||||||
|
public static final String USER_NAME = "user_name";
|
||||||
|
public static final String PASSWORD = "password";
|
||||||
|
public static final String USER_ID = "userId";
|
||||||
|
// 用来标记fragment的键
|
||||||
|
public static final String TOP_TAG = "top";
|
||||||
|
public static final String ADD_TAG = "add";
|
||||||
|
public static final String LIST_TAG = "list";
|
||||||
|
// 标记当前显示的页面
|
||||||
|
public static String PAGE_STATE = "top";
|
||||||
|
// 用来更新时间的消息
|
||||||
|
public static final int UPDATE_TIME = 1;
|
||||||
|
// 网络地址前后缀
|
||||||
|
public static final String PREFIX_URL = "http://192.168.0.110:8080/sparrow_notes/cate_";
|
||||||
|
public static final String SUFFIX_URL = ".png";
|
||||||
|
// 存储查找条件的键
|
||||||
|
public static final String SEARCH_FOR_WHAT = "what";
|
||||||
|
public static final String SEARCH_VALUE = "value";
|
||||||
|
// 不同的添加布局 图片地址 图片资源(int)
|
||||||
|
public static final int[] LAYOUTS = {R.layout.add_note, R.layout.add_link, R.layout.add_location, R.layout.add_bill,
|
||||||
|
R.layout.add_date, R.layout.add_mood, R.layout.add_account, R.layout.add_question};
|
||||||
|
public static final String[] IMG_URLS = {"note", "link", "location", "bill", "date", "mood", "account", "question"};
|
||||||
|
public static final int[] IMG_RESOURCES = {R.drawable.cate_note, R.drawable.cate_link, R.drawable.cate_location,
|
||||||
|
R.drawable.cate_bill, R.drawable.cate_date, R.drawable.cate_mood, R.drawable.cate_account, R.drawable.cate_question};
|
||||||
|
}
|
@ -0,0 +1,109 @@
|
|||||||
|
package com.example.sparrownotes.util;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.util.ArrayMap;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.bean.NoteBean;
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.util.Constant;
|
||||||
|
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
|
||||||
|
import com.j256.ormlite.dao.Dao;
|
||||||
|
import com.j256.ormlite.support.ConnectionSource;
|
||||||
|
import com.j256.ormlite.table.TableUtils;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据库帮助类
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("AlibabaRemoveCommentedCode")
|
||||||
|
public class DBHelper extends OrmLiteSqliteOpenHelper {
|
||||||
|
/**
|
||||||
|
* 防止多线程同时操作, 实现单例模式, 并锁定线程
|
||||||
|
* 数组存储App中所有的Dao对象的Map集合
|
||||||
|
*/
|
||||||
|
private static DBHelper dbHelper = null;
|
||||||
|
private ArrayMap<String, Dao> daos = new ArrayMap<>();
|
||||||
|
|
||||||
|
public static synchronized DBHelper getInstance(Context context) {
|
||||||
|
if (dbHelper == null) {
|
||||||
|
synchronized (DBHelper.class) {
|
||||||
|
if (dbHelper == null) {
|
||||||
|
dbHelper = new DBHelper(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dbHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DBHelper(Context context) {
|
||||||
|
super(context, Constant.DB_NAME, null, Constant.DB_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 包含创建表的语句
|
||||||
|
*
|
||||||
|
* @param sqLiteDatabase
|
||||||
|
* @param connectionSource
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
|
||||||
|
try {
|
||||||
|
TableUtils.createTable(connectionSource, UserBean.class);
|
||||||
|
TableUtils.createTable(connectionSource, NoteBean.class);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 包含新建表的语句
|
||||||
|
* 就是删了再创罢了
|
||||||
|
*
|
||||||
|
* @param sqLiteDatabase
|
||||||
|
* @param connectionSource
|
||||||
|
* @param i
|
||||||
|
* @param i1
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
|
||||||
|
try {
|
||||||
|
TableUtils.dropTable(connectionSource, UserBean.class, false);
|
||||||
|
TableUtils.dropTable(connectionSource, NoteBean.class, false);
|
||||||
|
onCreate(sqLiteDatabase, connectionSource);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据传入的Dao路径获取这个Dao的单例对象, 要么从daos中获取, 要么新建一个存入daos
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public synchronized Dao getDao(Class clazz) throws SQLException {
|
||||||
|
Dao dao = null;
|
||||||
|
String className = clazz.getSimpleName();
|
||||||
|
if (daos.containsKey(className)) {
|
||||||
|
dao = daos.get(className);
|
||||||
|
}
|
||||||
|
if (dao == null) {
|
||||||
|
dao = super.getDao(clazz);
|
||||||
|
daos.put(className, dao);
|
||||||
|
}
|
||||||
|
return dao;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 释放资源
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
super.close();
|
||||||
|
for (String key : daos.keySet()) {
|
||||||
|
Dao dao = daos.get(key);
|
||||||
|
dao = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,228 @@
|
|||||||
|
package com.example.sparrownotes.util;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.example.sparrownotes.MainActivity;
|
||||||
|
import com.example.sparrownotes.R;
|
||||||
|
import com.example.sparrownotes.bean.NoteBean;
|
||||||
|
import com.example.sparrownotes.bean.UserBean;
|
||||||
|
import com.example.sparrownotes.dao.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义对话框
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DialogUtil {
|
||||||
|
/**
|
||||||
|
* 查找标题消息框
|
||||||
|
*
|
||||||
|
* @param context 上下文
|
||||||
|
*/
|
||||||
|
public static void searchTitleDialog(Context context) {
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
// 获得布局管理器
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
// 将布局转换成View
|
||||||
|
View view = inflater.inflate(R.layout.search_title_dialog, null);
|
||||||
|
final EditText editText = view.findViewById(R.id.edit);
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("按标题查找")
|
||||||
|
.setView(view)
|
||||||
|
.setIcon(R.drawable.search_icon_title)
|
||||||
|
.setPositiveButton("确定", (dialog, which) -> {
|
||||||
|
// 搜索条件传入sp
|
||||||
|
spu.putString(Constant.SEARCH_FOR_WHAT, "title");
|
||||||
|
spu.putString(Constant.SEARCH_VALUE, editText.getText().toString());
|
||||||
|
// 提醒用户下拉刷新
|
||||||
|
Toast.makeText(context, "下拉刷新", Toast.LENGTH_SHORT).show();
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", (dialog, which) -> {
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查找内容消息框
|
||||||
|
*
|
||||||
|
* @param context 上下文
|
||||||
|
*/
|
||||||
|
public static void searchContentDialog(Context context) {
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
// 获得布局管理器
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
// 将布局转换成View
|
||||||
|
View view = inflater.inflate(R.layout.search_content_dialog, null);
|
||||||
|
final EditText editText = view.findViewById(R.id.edit);
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("按内容查找")
|
||||||
|
.setView(view)
|
||||||
|
.setIcon(R.drawable.search_icon_content)
|
||||||
|
.setPositiveButton("确定", (dialog, which) -> {
|
||||||
|
// 搜索条件传入sp
|
||||||
|
spu.putString(Constant.SEARCH_FOR_WHAT, "content");
|
||||||
|
spu.putString(Constant.SEARCH_VALUE, editText.getText().toString());
|
||||||
|
// 提醒用户下拉刷新
|
||||||
|
Toast.makeText(context, "下拉刷新", Toast.LENGTH_SHORT).show();
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", (dialog, which) -> {
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查找分类消息框
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*/
|
||||||
|
public static void searchCategoryDialog(final Context context) {
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
final String[] categories = new String[]{"便签", "链接", "位置", "消费", "日子", "心情", "账户", "三省"};
|
||||||
|
final String[] category = new String[1];
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("按分类查找")
|
||||||
|
.setIcon(R.drawable.search_icon_category)
|
||||||
|
.setSingleChoiceItems(categories, 0, (dialog, which) -> category[0] = categories[which])
|
||||||
|
.setPositiveButton("确认", (dialog, which) -> {
|
||||||
|
// 搜索条件传入sp
|
||||||
|
spu.putString(Constant.SEARCH_FOR_WHAT, "category");
|
||||||
|
spu.putString(Constant.SEARCH_VALUE, category[0]);
|
||||||
|
// 提醒用户下拉刷新
|
||||||
|
Toast.makeText(context, "下拉刷新", Toast.LENGTH_SHORT).show();
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改note消息框
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*/
|
||||||
|
public static void editNoteDialog(final Context context, int noteID) {
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
NoteDao noteDao = new NoteDao(context);
|
||||||
|
NoteBean noteItem = noteDao.queryById(noteID, spu.getInt(Constant.USER_ID));
|
||||||
|
// 获得布局管理器
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
// 将布局转换成View
|
||||||
|
View view = inflater.inflate(R.layout.edit_note_dialog, null);
|
||||||
|
final EditText editTile, editContent;
|
||||||
|
editTile = view.findViewById(R.id.edit_title);
|
||||||
|
editContent = view.findViewById(R.id.edit_content);
|
||||||
|
// 将原本的值显示出来
|
||||||
|
editTile.setText(noteItem.getTitle());
|
||||||
|
editContent.setText(noteItem.getContent());
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("编辑")
|
||||||
|
.setView(view)
|
||||||
|
.setIcon(R.drawable.icon_edit)
|
||||||
|
.setPositiveButton("确认", (dialog, which) -> {
|
||||||
|
// 将用户输入存入数据库
|
||||||
|
noteItem.setTitle(editTile.getText().toString().trim());
|
||||||
|
noteItem.setContent(editContent.getText().toString().trim());
|
||||||
|
noteDao.update(noteItem);
|
||||||
|
// 提醒用户下拉刷新
|
||||||
|
Toast.makeText(context, "下拉刷新", Toast.LENGTH_SHORT).show();
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改信息
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*/
|
||||||
|
public static void editInfoDialog(final Context context, int userID) {
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
UserDao userDao = new UserDao(context);
|
||||||
|
UserBean userItem = userDao.queryById(userID);
|
||||||
|
// 获得布局管理器
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
// 将布局转换成View
|
||||||
|
View view = inflater.inflate(R.layout.edit_info_dialog, null);
|
||||||
|
final EditText editUsername, editPassword, editEmail;
|
||||||
|
editUsername = view.findViewById(R.id.edit_username_info);
|
||||||
|
editPassword = view.findViewById(R.id.edit_password_info);
|
||||||
|
editEmail = view.findViewById(R.id.edit_email_info);
|
||||||
|
// 将原本的值显示出来
|
||||||
|
editUsername.setText(userItem.getUserName());
|
||||||
|
editPassword.setText(userItem.getPassword());
|
||||||
|
editEmail.setText(userItem.getEmail());
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("修改信息")
|
||||||
|
.setView(view)
|
||||||
|
.setIcon(R.drawable.icon_gear)
|
||||||
|
.setPositiveButton("确认", (dialog, which) -> {
|
||||||
|
// 将用户输入存入数据库
|
||||||
|
userItem.setUserName(editUsername.getText().toString().trim());
|
||||||
|
userItem.setPassword(editPassword.getText().toString().trim());
|
||||||
|
userItem.setEmail(editEmail.getText().toString().trim());
|
||||||
|
userDao.update(userItem);
|
||||||
|
// 跳转回登录页面并且清除勾选
|
||||||
|
spu.putBoolean(Constant.AUTO_LOGIN, false);
|
||||||
|
spu.putBoolean(Constant.REMEMBER_PWD, false);
|
||||||
|
Intent intent = new Intent(context, MainActivity.class);
|
||||||
|
context.startActivity(intent);
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改问候语
|
||||||
|
* 实现失败了 功能砍掉了 方法先留着
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*/
|
||||||
|
public static void editGreetingDialog(final Context context) {
|
||||||
|
// 获得布局管理器
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
// 将布局转换成View
|
||||||
|
View view = inflater.inflate(R.layout.edit_greeting_dialog, null);
|
||||||
|
final EditText editText;
|
||||||
|
final TextView textView;
|
||||||
|
editText = view.findViewById(R.id.edit);
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("修改问候语")
|
||||||
|
.setView(view)
|
||||||
|
.setIcon(R.drawable.icon_smile)
|
||||||
|
.setPositiveButton("确认", (dialog, which) -> {
|
||||||
|
|
||||||
|
editText.getText().toString();
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注销账户
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*/
|
||||||
|
public static void dismissDialog(final Context context, int userID) {
|
||||||
|
SharedPreferenceUtil spu = SharedPreferenceUtil.getInstance(context);
|
||||||
|
UserDao userDao = new UserDao(context);
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle("提示")
|
||||||
|
.setMessage("是否要注销账户")
|
||||||
|
.setIcon(R.drawable.icon_warning)
|
||||||
|
.setPositiveButton("确认", (dialog, which) -> {
|
||||||
|
userDao.delete(userID);
|
||||||
|
// 跳转回登录页面并且清除勾选
|
||||||
|
spu.putBoolean(Constant.AUTO_LOGIN, false);
|
||||||
|
spu.putBoolean(Constant.REMEMBER_PWD, false);
|
||||||
|
Intent intent = new Intent(context, MainActivity.class);
|
||||||
|
context.startActivity(intent);
|
||||||
|
})
|
||||||
|
.setNegativeButton("取消", null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,161 @@
|
|||||||
|
package com.example.sparrownotes.util;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 以键值对的方式提供本地文件存储
|
||||||
|
*/
|
||||||
|
public class SharedPreferenceUtil {
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
*/
|
||||||
|
private static final String NAME = "sparrow_share";
|
||||||
|
private Context context;
|
||||||
|
private SharedPreferences.Editor editor;
|
||||||
|
private SharedPreferences share;
|
||||||
|
private static SharedPreferenceUtil sharedPreferenceUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造方法获取SharedPreferences
|
||||||
|
*
|
||||||
|
* @param context 上下文
|
||||||
|
*/
|
||||||
|
@SuppressLint("CommitPrefEdits")
|
||||||
|
private SharedPreferenceUtil(Context context) {
|
||||||
|
this.context = context;
|
||||||
|
if (context != null) {
|
||||||
|
share = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
|
||||||
|
editor = share.edit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SharedPreferenceUtil getInstance(Context con) {
|
||||||
|
if (sharedPreferenceUtil == null) {
|
||||||
|
sharedPreferenceUtil = new SharedPreferenceUtil(con);
|
||||||
|
}
|
||||||
|
return sharedPreferenceUtil;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存String类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @param value 保存的值
|
||||||
|
*/
|
||||||
|
public void putString(String key, String value) {
|
||||||
|
if (null == value) {
|
||||||
|
value = "";
|
||||||
|
}
|
||||||
|
editor.putString(key, value);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存int类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @param value 保存的值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void putInt(String key, int value) {
|
||||||
|
editor.putInt(key, value);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存Float类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @param value 保存的值
|
||||||
|
*/
|
||||||
|
public void putFloat(String key, float value) {
|
||||||
|
editor.putFloat(key, value);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存boolean类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @param value 保存的值
|
||||||
|
*/
|
||||||
|
public void putBoolean(String key, boolean value) {
|
||||||
|
editor.putBoolean(key, value);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存Long类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @param value 保存的值
|
||||||
|
*/
|
||||||
|
public void putLong(String key, long value) {
|
||||||
|
editor.putLong(key, value);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取String类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
*/
|
||||||
|
public String getString(String key) {
|
||||||
|
return share.getString(key, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取int类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @return 返回的int型数据
|
||||||
|
*/
|
||||||
|
public int getInt(String key) {
|
||||||
|
return share.getInt(key, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Float类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @return 返回的float型数据
|
||||||
|
*/
|
||||||
|
public float getFloat(String key) {
|
||||||
|
return share.getFloat(key, 0.00f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Long类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @return 返回的long型数据
|
||||||
|
*/
|
||||||
|
public long getLong(String key) {
|
||||||
|
return share.getLong(key, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取boolean类型的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
* @return 返回的boolean型数据
|
||||||
|
*/
|
||||||
|
public boolean getBoolean(String key) {
|
||||||
|
return share.getBoolean(key, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除不需要的数据
|
||||||
|
*
|
||||||
|
* @param key 键名称
|
||||||
|
*/
|
||||||
|
public void removeKey(String key) {
|
||||||
|
editor.remove(key);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<translate
|
||||||
|
android:duration="@string/duration_time"
|
||||||
|
android:fromXDelta="0"
|
||||||
|
android:toXDelta="-100%p" />
|
||||||
|
</set>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<translate
|
||||||
|
android:duration="@string/duration_time"
|
||||||
|
android:fromXDelta="100%p"
|
||||||
|
android:toXDelta="0" />
|
||||||
|
</set>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<translate
|
||||||
|
android:duration="@string/duration_time"
|
||||||
|
android:fromXDelta="-100.0%p"
|
||||||
|
android:toXDelta="0.0" />
|
||||||
|
</set>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<translate
|
||||||
|
android:duration="@string/duration_time"
|
||||||
|
android:fromXDelta="0.0"
|
||||||
|
android:toXDelta="100.0%p" />
|
||||||
|
</set>
|
@ -0,0 +1,30 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="85.84757"
|
||||||
|
android:endY="92.4963"
|
||||||
|
android:startX="42.9492"
|
||||||
|
android:startY="49.59793"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#44000000"
|
||||||
|
android:offset="0.0" />
|
||||||
|
<item
|
||||||
|
android:color="#00000000"
|
||||||
|
android:offset="1.0" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||||
|
android:strokeWidth="1"
|
||||||
|
android:strokeColor="#00000000" />
|
||||||
|
</vector>
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 847 B |
After Width: | Height: | Size: 919 B |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 924 B |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 606 B |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 552 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 540 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 686 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 919 B |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 606 B |
After Width: | Height: | Size: 290 KiB |
After Width: | Height: | Size: 146 KiB |
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
|
||||||
|
<!-- 圆角的半径 -->
|
||||||
|
<corners android:radius="10dp"/>
|
||||||
|
|
||||||
|
<!-- 填充颜色 -->
|
||||||
|
<solid android:color="@color/button_light_black"/>
|
||||||
|
|
||||||
|
</shape>
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- 正常状态 -->
|
||||||
|
<item android:drawable="@drawable/btn_cancel_normal" android:state_pressed="false"/>
|
||||||
|
|
||||||
|
<!-- 按下状态 -->
|
||||||
|
<item android:drawable="@drawable/btn_login_pressed" android:state_pressed="true"/>
|
||||||
|
|
||||||
|
</selector>
|
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
|
||||||
|
<!-- 圆角的半径 -->
|
||||||
|
<corners android:radius="10dp"/>
|
||||||
|
|
||||||
|
<!-- 填充颜色 -->
|
||||||
|
<solid android:color="@color/button_black"/>
|
||||||
|
|
||||||
|
</shape>
|
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
|
||||||
|
<!-- 圆角的半径 -->
|
||||||
|
<corners android:radius="10dp"/>
|
||||||
|
|
||||||
|
<!-- 填充颜色 -->
|
||||||
|
<solid android:color="@color/button_grey"/>
|
||||||
|
|
||||||
|
</shape>
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- 正常状态 -->
|
||||||
|
<item android:drawable="@drawable/btn_login_normal" android:state_pressed="false"/>
|
||||||
|
|
||||||
|
<!-- 按下状态 -->
|
||||||
|
<item android:drawable="@drawable/btn_login_pressed" android:state_pressed="true"/>
|
||||||
|
|
||||||
|
</selector>
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- 正常状态 -->
|
||||||
|
<item android:drawable="@drawable/eye_closed" android:state_checked="false"/>
|
||||||
|
|
||||||
|
<!-- 选中状态 -->
|
||||||
|
<item android:drawable="@drawable/eye_open" android:state_checked="true"/>
|
||||||
|
|
||||||
|
</selector>
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@drawable/dock_add_fill" android:state_checked="true" />
|
||||||
|
<item android:drawable="@drawable/dock_add_line" android:state_checked="false" />
|
||||||
|
</selector>
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@drawable/dock_list_fill" android:state_checked="true" />
|
||||||
|
<item android:drawable="@drawable/dock_list_line" android:state_checked="false" />
|
||||||
|
</selector>
|
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@drawable/dock_top_fill" android:state_checked="true" />
|
||||||
|
<item android:drawable="@drawable/dock_top_line" android:state_checked="false" />
|
||||||
|
</selector>
|
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 12 KiB |