From 857e6c2f5fa1aa90a5dbdc558d82e9ef9b2e0e16 Mon Sep 17 00:00:00 2001 From: jtisserand <jtisserand@ippon.fr> Date: Wed, 9 May 2018 11:11:37 +0200 Subject: [PATCH] Set Java 8 compatibility Use DatabaseManagement to manage database instead of using static methods Clean database --- .idea/codeStyles/Project.xml | 29 ++++++ .idea/misc.xml | 2 +- .idea/vcs.xml | 6 ++ app/build.gradle | 6 +- .../article/clientmobile/ArticleActivity.java | 93 ++++++++++++------- ...hbaseLite.java => DatabaseManagement.java} | 74 +++++++-------- app/src/main/res/layout/activity_article.xml | 38 ++++++-- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 9 files changed, 166 insertions(+), 88 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/vcs.xml rename app/src/main/java/com/ippon/article/clientmobile/database/{CouchbaseLite.java => DatabaseManagement.java} (53%) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ +<component name="ProjectCodeStyleConfiguration"> + <code_scheme name="Project" version="173"> + <Objective-C-extensions> + <file> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" /> + </file> + <class> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" /> + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" /> + </class> + <extensions> + <pair source="cpp" header="h" fileNamingConvention="NONE" /> + <pair source="c" header="h" fileNamingConvention="NONE" /> + </extensions> + </Objective-C-extensions> + </code_scheme> +</component> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 3963879..75dac50 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ </value> </option> </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 391a158..c82e2f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,6 +16,10 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { @@ -25,5 +29,5 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - compile 'com.couchbase.lite:couchbase-lite-android:2.0.0' + api 'com.couchbase.lite:couchbase-lite-android:2.0.0' } diff --git a/app/src/main/java/com/ippon/article/clientmobile/ArticleActivity.java b/app/src/main/java/com/ippon/article/clientmobile/ArticleActivity.java index 24fdd33..5d0523c 100644 --- a/app/src/main/java/com/ippon/article/clientmobile/ArticleActivity.java +++ b/app/src/main/java/com/ippon/article/clientmobile/ArticleActivity.java @@ -3,15 +3,14 @@ package com.ippon.article.clientmobile; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; -import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; +import android.widget.TextView; import com.couchbase.lite.CouchbaseLiteException; -import com.couchbase.lite.Database; import com.couchbase.lite.Result; -import com.ippon.article.clientmobile.database.CouchbaseLite; +import com.ippon.article.clientmobile.database.DatabaseManagement; import java.net.URISyntaxException; import java.util.ArrayList; @@ -30,67 +29,91 @@ public class ArticleActivity extends AppCompatActivity { private final static String GATEWAY_PWD = "test"; - private Database database; + private final DatabaseManagement databaseManagement = new DatabaseManagement(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_article); + + TextView tag = findViewById(R.id.tag); + + tag.setText(GATEWAY_USER); } @Override protected void onStart() { super.onStart(); + + initDatabase(); + + updateArticleView(); + + initCleanButton(); + + } + + private void initCleanButton() { + Button clickButton = findViewById(R.id.clean); + clickButton.setOnClickListener(button -> { + try { + databaseManagement.deleteDatabase(); + + initDatabase(); + + updateArticleView(); + } catch (CouchbaseLiteException e) { + Log.e(TAG, "Database deletion", e); + } + + }); + } + + private void initDatabase() { // Init & Configure database try { - database = CouchbaseLite.openDatabase(this.getApplicationContext()); - - //CouchbaseLite.createDocument(database); + databaseManagement.openDatabase(this.getApplicationContext(), e -> updateArticleView()); - CouchbaseLite.configureReplication(database, GATEWAY_URL + GATEWAY_DB, GATEWAY_USER, GATEWAY_PWD); + databaseManagement.configureReplication(GATEWAY_URL + GATEWAY_DB, GATEWAY_USER, GATEWAY_PWD); } catch (CouchbaseLiteException e) { Log.e(TAG, "Application startup", e); } catch (URISyntaxException uri) { Log.e(TAG, "Gateway URL syntax problem", uri); } + } + private void updateArticleView() { + List<String> updatedItems = loadArticles(); + fillArticles(updatedItems); + } - Button clickButton = (Button) findViewById(R.id.refresh); - clickButton.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - List<Result> results = Collections.emptyList(); - - try { - results = CouchbaseLite.findAllDocuments(database, "com.ippon.article.couchbase.server.article.Article"); - } catch (CouchbaseLiteException e) { - Log.e(TAG, "Refresh documents from database", e); - } - - Log.i(TAG, "----------RESULTS---------" + results.size()); - List<String> items = new ArrayList<>(); - - for (Result result : results) { - Log.i(TAG, "------------------------"); - if (result.getString("content") != null) { - Log.i(TAG, result.getString("content")); - items.add(result.getString("content")); - } + private List<String> loadArticles() { + List<Result> results = Collections.emptyList(); + try { + results = databaseManagement.findAllDocuments("com.ippon.article.couchbase.server.article.Article"); + } catch (CouchbaseLiteException e) { + Log.e(TAG, "Refresh documents from database", e); + } - } + Log.i(TAG, "----------RESULTS---------" + results.size()); + List<String> items = new ArrayList<>(); - fillArticles(items); + for (Result result : results) { + Log.i(TAG, "------------------------"); + if (result.getString("content") != null) { + Log.i(TAG, result.getString("content")); + items.add(result.getString("content")); } - }); + } + return items; } private void fillArticles(List<String> items) { - ListView articleView = (ListView) findViewById(R.id.articles); + ListView articleView = findViewById(R.id.articles); ArrayAdapter<String> itemsAdapter = - new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); + new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items); articleView.setAdapter(itemsAdapter); } diff --git a/app/src/main/java/com/ippon/article/clientmobile/database/CouchbaseLite.java b/app/src/main/java/com/ippon/article/clientmobile/database/DatabaseManagement.java similarity index 53% rename from app/src/main/java/com/ippon/article/clientmobile/database/CouchbaseLite.java rename to app/src/main/java/com/ippon/article/clientmobile/database/DatabaseManagement.java index 6aa9b02..72c47f9 100644 --- a/app/src/main/java/com/ippon/article/clientmobile/database/CouchbaseLite.java +++ b/app/src/main/java/com/ippon/article/clientmobile/database/DatabaseManagement.java @@ -1,25 +1,22 @@ package com.ippon.article.clientmobile.database; import android.content.Context; -import android.support.annotation.Nullable; import android.util.Log; import com.couchbase.lite.BasicAuthenticator; import com.couchbase.lite.CouchbaseLiteException; import com.couchbase.lite.DataSource; import com.couchbase.lite.Database; +import com.couchbase.lite.DatabaseChangeListener; import com.couchbase.lite.DatabaseConfiguration; -import com.couchbase.lite.Document; import com.couchbase.lite.Endpoint; import com.couchbase.lite.Expression; +import com.couchbase.lite.ListenerToken; import com.couchbase.lite.LogDomain; import com.couchbase.lite.LogLevel; -import com.couchbase.lite.MutableDocument; import com.couchbase.lite.Query; import com.couchbase.lite.QueryBuilder; import com.couchbase.lite.Replicator; -import com.couchbase.lite.ReplicatorChange; -import com.couchbase.lite.ReplicatorChangeListener; import com.couchbase.lite.ReplicatorConfiguration; import com.couchbase.lite.Result; import com.couchbase.lite.ResultSet; @@ -34,42 +31,43 @@ import java.util.List; * Created by jeremie on 04/05/18. */ -public class CouchbaseLite { +public class DatabaseManagement { - private final static String TAG = "CouchbaseLite"; + private final static String TAG = "DatabaseManagement"; + private Database database; + private ListenerToken databaseListenerToken; + private Replicator replicator; + private ListenerToken replicatorListenerToken; - @Nullable - public static Database openDatabase(Context androidContext) throws CouchbaseLiteException { + public void openDatabase(Context androidContext, DatabaseChangeListener listener) throws CouchbaseLiteException { // Get the database (and create it if it doesn’t exist). DatabaseConfiguration config = new DatabaseConfiguration(androidContext); - return new Database("localdb", config); + database = new Database("localdb", config); + + databaseListenerToken = database.addChangeListener(listener); } - public static void createDocument(Database database) throws CouchbaseLiteException { - // Create a new document (i.e. a record) in the database. - MutableDocument mutableDoc = new MutableDocument() - .setFloat("version", 2.0F) - .setString("type", "SDK"); - - // Save it to the database. - database.save(mutableDoc); - - // Update a document. - mutableDoc = database.getDocument(mutableDoc.getId()).toMutable(); - mutableDoc.setString("language", "Java"); - try { - database.save(mutableDoc); - } catch (CouchbaseLiteException e) { - e.printStackTrace(); + public void deleteDatabase() throws CouchbaseLiteException { + + // Remove listeners + replicator.removeChangeListener(replicatorListenerToken); + database.removeChangeListener(databaseListenerToken); + + // Stop replication + replicator.stop(); + while (replicator.getStatus().getActivityLevel() != Replicator.ActivityLevel.STOPPED) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Log.e(TAG, "Replication stop", e); + } } - Document document = database.getDocument(mutableDoc.getId()); - // Log the document ID (generated by the database) and properties - Log.i(TAG, "Document ID :: " + document.getId()); - Log.i(TAG, "Learning " + document.getString("language")); + + database.delete(); } - public static List<Result> findAllDocuments(Database database, String javaClass) throws CouchbaseLiteException { + public List<Result> findAllDocuments(String javaClass) throws CouchbaseLiteException { // Create a query to fetch documents of type SDK. Query query = QueryBuilder.select(SelectResult.property("content")) .from(DataSource.database(database)) @@ -81,7 +79,7 @@ public class CouchbaseLite { return resultsList; } - public static void configureReplication(Database database, String gatewayUrl, String gatewayUser, String gatewayPwd) throws CouchbaseLiteException, URISyntaxException { + public void configureReplication(String gatewayUrl, String gatewayUser, String gatewayPwd) throws URISyntaxException { Database.setLogLevel(LogDomain.REPLICATOR, LogLevel.VERBOSE); Database.setLogLevel(LogDomain.NETWORK, LogLevel.VERBOSE); @@ -96,20 +94,18 @@ public class CouchbaseLite { replConfig.setContinuous(true); // Create replicator. - Replicator replicator = new Replicator(replConfig); + replicator = new Replicator(replConfig); // Listen to replicator change events. - replicator.addChangeListener(new ReplicatorChangeListener() { - @Override - public void changed(ReplicatorChange change) { - if (change.getStatus().getError() != null) { - Log.i(TAG, "Error code :: " + change.getStatus().getError().getCode()); - } + replicatorListenerToken = replicator.addChangeListener(change -> { + if (change.getStatus().getError() != null) { + Log.i(TAG, "Error code :: " + change.getStatus().getError().getCode()); } }); // Start replication. replicator.start(); + } } diff --git a/app/src/main/res/layout/activity_article.xml b/app/src/main/res/layout/activity_article.xml index 1efb9d7..7065e2f 100644 --- a/app/src/main/res/layout/activity_article.xml +++ b/app/src/main/res/layout/activity_article.xml @@ -7,6 +7,17 @@ tools:context="com.ippon.article.clientmobile.ArticleActivity" tools:layout_editor_absoluteY="81dp"> + <Button + android:id="@+id/clean" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:layout_marginTop="5dp" + android:text="Clean" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="spread_inside" /> + <ListView android:id="@+id/articles" android:layout_width="0dp" @@ -17,17 +28,26 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/refresh" /> + app:layout_constraintTop_toBottomOf="@+id/clean" /> - <Button - android:id="@+id/refresh" + <TextView + android:id="@+id/textView2" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="46dp" - android:layout_marginStart="8dp" - android:layout_marginTop="5dp" - android:text="Refresh" - app:layout_constraintBottom_toTopOf="@+id/articles" + android:layout_height="18dp" + android:layout_marginStart="16dp" + android:layout_marginTop="16dp" + android:text="Articles : " app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/tag" + android:layout_width="174dp" + android:layout_height="wrap_content" + android:layout_marginStart="12dp" + android:layout_marginTop="16dp" + android:text="TextView" + app:layout_constraintStart_toEndOf="@+id/textView2" + app:layout_constraintTop_toTopOf="parent" /> + </android.support.constraint.ConstraintLayout> diff --git a/build.gradle b/build.gradle index e6b32bc..1a3d812 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.1.2' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9f1e3ed..0669be9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu May 03 21:47:31 CEST 2018 +#Mon May 07 08:41:19 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip -- GitLab