From 370e7343d7e5b73b28dd4df845446f917e8c93d8 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 25 May 2017 10:00:56 -0400 Subject: [PATCH] Move commands to uhabits-core --- .../habits/list/ListHabitsScreen.java | 9 ++++-- .../uhabits/commands/CommandParser.java | 25 +++++++++++++++ .../org/isoron/uhabits/sync/SyncManager.java | 14 ++++++++- .../isoron/uhabits/utils/DatabaseUtils.java | 7 ----- .../activities/BaseActivityTest.java | 4 +-- .../activities/BaseScreenTest.java | 4 +-- .../habits/list/ListHabitsScreenTest.java | 8 +++-- uhabits-core/build.gradle | 1 + .../commands/ArchiveHabitsCommand.java | 13 -------- .../commands/ChangeHabitColorCommand.java | 13 -------- .../org/isoron/uhabits/commands/Command.java | 25 ++------------- .../uhabits/commands/CommandRunner.java | 0 .../uhabits/commands/CreateHabitCommand.java | 13 -------- .../commands/CreateRepetitionCommand.java | 0 .../uhabits/commands/DeleteHabitsCommand.java | 13 -------- .../uhabits/commands/EditHabitCommand.java | 13 -------- .../commands/ToggleRepetitionCommand.java | 0 .../commands/UnarchiveHabitsCommand.java | 13 -------- .../isoron/uhabits/commands/package-info.java | 0 .../org/isoron/uhabits/utils/StringUtils.java | 31 +++++++++++++++++++ 20 files changed, 90 insertions(+), 116 deletions(-) rename uhabits-android/src/test/java/org/isoron/{uhabits => androidbase}/activities/BaseActivityTest.java (98%) rename uhabits-android/src/test/java/org/isoron/{uhabits => androidbase}/activities/BaseScreenTest.java (98%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java (91%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java (92%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/Command.java (80%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/CommandRunner.java (100%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java (92%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java (100%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java (91%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java (93%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java (100%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java (91%) rename {uhabits-android => uhabits-core}/src/main/java/org/isoron/uhabits/commands/package-info.java (100%) create mode 100644 uhabits-core/src/main/java/org/isoron/uhabits/utils/StringUtils.java diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java index c26974e95..62c968a68 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java @@ -90,6 +90,9 @@ public class ListHabitsScreen extends BaseScreen @NonNull private Preferences prefs; + @NonNull + private final CommandParser commandParser; + @Inject public ListHabitsScreen(@NonNull BaseActivity activity, @NonNull CommandRunner commandRunner, @@ -99,9 +102,11 @@ public class ListHabitsScreen extends BaseScreen @NonNull ConfirmDeleteDialogFactory confirmDeleteDialogFactory, @NonNull ColorPickerDialogFactory colorPickerFactory, @NonNull EditHabitDialogFactory editHabitDialogFactory, - @NonNull Preferences prefs) + @NonNull Preferences prefs, + @NonNull CommandParser commandParser) { super(activity); + this.commandParser = commandParser; setRootView(rootView); this.prefs = prefs; this.colorPickerFactory = colorPickerFactory; @@ -122,7 +127,7 @@ public class ListHabitsScreen extends BaseScreen @Nullable Long refreshKey) { if(command.isRemote()) return; - showMessage(command.getExecuteStringId()); + showMessage(commandParser.getExecuteString(command)); } public void onDettached() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/CommandParser.java b/uhabits-android/src/main/java/org/isoron/uhabits/commands/CommandParser.java index 1adf190a4..370c43653 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/CommandParser.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/commands/CommandParser.java @@ -23,6 +23,7 @@ import android.support.annotation.*; import com.google.gson.*; +import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import org.json.*; @@ -42,6 +43,30 @@ public class CommandParser this.modelFactory = modelFactory; } + @StringRes + public Integer getExecuteString(@NonNull Command command) + { + if(command instanceof ArchiveHabitsCommand) + return R.string.toast_habit_archived; + + if(command instanceof ChangeHabitColorCommand) + return R.string.toast_habit_changed; + + if(command instanceof CreateHabitCommand) + return R.string.toast_habit_created; + + if(command instanceof DeleteHabitsCommand) + return R.string.toast_habit_deleted; + + if(command instanceof EditHabitCommand) + return R.string.toast_habit_changed; + + if(command instanceof UnarchiveHabitsCommand) + return R.string.toast_habit_unarchived; + + return null; + } + @NonNull public Command parse(@NonNull JSONObject json) throws JSONException { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java index 101786103..6bebe1a5d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java @@ -108,13 +108,25 @@ public class SyncManager implements CommandRunner.Listener connect(context, serverURL); } + private JSONObject toJSONObject(String json) + { + try + { + return new JSONObject(json); + } + catch (JSONException e) + { + throw new RuntimeException(e); + } + } + @Override public void onCommandExecuted(@NonNull Command command, @Nullable Long refreshKey) { if (command.isRemote()) return; - JSONObject msg = command.toJson(); + JSONObject msg = toJSONObject(command.toJson()); Long now = new Date().getTime(); Event e = new Event(command.getId(), now, msg.toString()); e.save(); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java index 146842e2c..f4e9445a3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java @@ -30,9 +30,7 @@ import org.isoron.uhabits.models.sqlite.records.*; import org.isoron.uhabits.sync.*; import java.io.*; -import java.math.*; import java.text.*; -import java.util.*; public abstract class DatabaseUtils { @@ -70,11 +68,6 @@ public abstract class DatabaseUtils return databaseFilename; } - public static String getRandomId() - { - return new BigInteger(260, new Random()).toString(32).substring(0, 32); - } - @SuppressWarnings("unchecked") public static void initializeActiveAndroid(Context context) { diff --git a/uhabits-android/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java b/uhabits-android/src/test/java/org/isoron/androidbase/activities/BaseActivityTest.java similarity index 98% rename from uhabits-android/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java rename to uhabits-android/src/test/java/org/isoron/androidbase/activities/BaseActivityTest.java index c3bef6aab..80fd4c592 100644 --- a/uhabits-android/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java +++ b/uhabits-android/src/test/java/org/isoron/androidbase/activities/BaseActivityTest.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.content.*; import android.os.*; @@ -27,8 +27,8 @@ import android.support.v7.widget.Toolbar; import android.view.*; import android.widget.*; -import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; import org.junit.*; import org.junit.runner.*; diff --git a/uhabits-android/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java b/uhabits-android/src/test/java/org/isoron/androidbase/activities/BaseScreenTest.java similarity index 98% rename from uhabits-android/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java rename to uhabits-android/src/test/java/org/isoron/androidbase/activities/BaseScreenTest.java index 0cbcee956..1b984d853 100644 --- a/uhabits-android/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java +++ b/uhabits-android/src/test/java/org/isoron/androidbase/activities/BaseScreenTest.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.content.*; import android.support.annotation.*; @@ -25,7 +25,6 @@ import android.support.v7.view.ActionMode; import android.support.v7.widget.*; import android.view.*; -import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; import org.junit.*; import org.junit.runner.*; @@ -38,6 +37,7 @@ import static android.view.View.*; import static junit.framework.Assert.assertNotNull; import static org.hamcrest.core.IsEqual.*; import static org.junit.Assert.*; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; import static org.robolectric.Robolectric.*; diff --git a/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java index 888c8eeba..5d5a68037 100644 --- a/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java @@ -71,6 +71,8 @@ public class ListHabitsScreenTest extends BaseUnitTest private Preferences prefs; + private CommandParser commandParser; + @Before @Override public void setUp() @@ -86,10 +88,11 @@ public class ListHabitsScreenTest extends BaseUnitTest colorPickerDialogFactory = mock(ColorPickerDialogFactory.class); dialogFactory = mock(EditHabitDialogFactory.class); prefs = mock(Preferences.class); + commandParser = mock(CommandParser.class); screen = spy(new ListHabitsScreen(activity, commandRunner, rootView, intentFactory, themeSwitcher, confirmDeleteDialogFactory, - colorPickerDialogFactory, dialogFactory, prefs)); + colorPickerDialogFactory, dialogFactory, prefs, commandParser)); doNothing().when(screen).showMessage(anyInt()); @@ -122,7 +125,8 @@ public class ListHabitsScreenTest extends BaseUnitTest public void testOnCommand() { Command c = mock(Command.class); - when(c.getExecuteStringId()).thenReturn(R.string.toast_habit_deleted); + when(commandParser.getExecuteString(c)).thenReturn( + R.string.toast_habit_deleted); screen.onCommandExecuted(c, null); verify(screen).showMessage(R.string.toast_habit_deleted); } diff --git a/uhabits-core/build.gradle b/uhabits-core/build.gradle index 914660c4c..ebdeef42e 100644 --- a/uhabits-core/build.gradle +++ b/uhabits-core/build.gradle @@ -26,6 +26,7 @@ dependencies { implementation 'com.google.auto.factory:auto-factory:1.0-beta3' implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation 'org.apache.commons:commons-lang3:3.5' + implementation 'com.google.code.gson:gson:2.7' implementation ('com.opencsv:opencsv:3.9') { exclude group: 'commons-logging', module: 'commons-logging' diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java similarity index 91% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java index 1d508356f..0773b64e7 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java @@ -21,7 +21,6 @@ package org.isoron.uhabits.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import java.util.*; @@ -50,18 +49,6 @@ public class ArchiveHabitsCommand extends Command habitList.update(selected); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_archived; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_unarchived; - } - @Override public void undo() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java similarity index 92% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java index ab1e4b7e3..b3683901f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java @@ -21,7 +21,6 @@ package org.isoron.uhabits.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import java.util.*; @@ -61,18 +60,6 @@ public class ChangeHabitColorCommand extends Command habitList.update(selected); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_changed; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_changed; - } - @NonNull @Override public Record toRecord() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/Command.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/Command.java similarity index 80% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/Command.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/Command.java index 6059845e9..721efde98 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/Command.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/Command.java @@ -24,7 +24,6 @@ import android.support.annotation.*; import com.google.gson.*; import org.isoron.uhabits.utils.*; -import org.json.*; /** * A Command represents a desired set of changes that should be performed on the @@ -43,7 +42,7 @@ public abstract class Command public Command() { - id = DatabaseUtils.getRandomId(); + id = StringUtils.getRandomId(); isRemote = false; } @@ -55,11 +54,6 @@ public abstract class Command public abstract void execute(); - public Integer getExecuteStringId() - { - return null; - } - public String getId() { return id; @@ -70,11 +64,6 @@ public abstract class Command this.id = id; } - public Integer getUndoStringId() - { - return null; - } - public boolean isRemote() { return isRemote; @@ -86,17 +75,9 @@ public abstract class Command } @NonNull - public JSONObject toJson() + public String toJson() { - try - { - String json = new GsonBuilder().create().toJson(toRecord()); - return new JSONObject(json); - } - catch (JSONException e) - { - throw new RuntimeException(e); - } + return new GsonBuilder().create().toJson(toRecord()); } @NonNull diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/CommandRunner.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/CommandRunner.java similarity index 100% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/CommandRunner.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/CommandRunner.java diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java similarity index 92% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java index c0800b8e6..61fbb9d4d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java @@ -23,7 +23,6 @@ import android.support.annotation.*; import com.google.auto.factory.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; /** @@ -62,18 +61,6 @@ public class CreateHabitCommand extends Command savedId = savedHabit.getId(); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_created; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_deleted; - } - @NonNull @Override public Record toRecord() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java similarity index 100% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java similarity index 91% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java index fbc74c257..082990c28 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java @@ -21,7 +21,6 @@ package org.isoron.uhabits.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import java.util.*; @@ -52,23 +51,11 @@ public class DeleteHabitsCommand extends Command habitList.remove(h); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_deleted; - } - public List getSelected() { return Collections.unmodifiableList(selected); } - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_restored; - } - @Override @NonNull public Record toRecord() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java similarity index 93% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java index 0f4ccb6aa..48c37ecc1 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java @@ -23,7 +23,6 @@ import android.support.annotation.*; import com.google.auto.factory.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; /** @@ -77,18 +76,6 @@ public class EditHabitCommand extends Command copyAttributes(this.modified); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_changed; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_changed_back; - } - @NonNull @Override public Record toRecord() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java similarity index 100% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java similarity index 91% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java index d66425348..a9e4f608c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java @@ -21,7 +21,6 @@ package org.isoron.uhabits.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import java.util.*; @@ -51,18 +50,6 @@ public class UnarchiveHabitsCommand extends Command habitList.update(selected); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_unarchived; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_archived; - } - @Override @NonNull public Record toRecord() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/commands/package-info.java b/uhabits-core/src/main/java/org/isoron/uhabits/commands/package-info.java similarity index 100% rename from uhabits-android/src/main/java/org/isoron/uhabits/commands/package-info.java rename to uhabits-core/src/main/java/org/isoron/uhabits/commands/package-info.java diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/utils/StringUtils.java b/uhabits-core/src/main/java/org/isoron/uhabits/utils/StringUtils.java new file mode 100644 index 000000000..2a22c78b6 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/utils/StringUtils.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.utils; + +import java.math.*; +import java.util.*; + +public class StringUtils +{ + public static String getRandomId() + { + return new BigInteger(260, new Random()).toString(32).substring(0, 32); + } +}