diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 51575bb..a36d297 100644 --- a/.idea/caches/build_file_checksums.ser +++ b/.idea/caches/build_file_checksums.ser Binary files differ diff --git a/app/build.gradle b/app/build.gradle index 02b0f1a..9b72418 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,5 +39,5 @@ implementation 'com.android.support:cardview-v7:27.1.1' implementation 'com.google.android.gms:play-services-maps:15.0.1' implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0' - + implementation group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a083902..795735f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,26 +22,17 @@ android:theme="@style/AppTheme"> - + android:screenOrientation="landscape" + android:theme="@style/SplashTheme"> - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/Cactus.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/Cactus.java index c4a6c46..9ade637 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/Cactus.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/Cactus.java @@ -1,14 +1,19 @@ package org.ntlab.radishforandroidstudio.cactusClient; -import android.accounts.Account; + import android.app.Activity; import android.app.Application; import android.os.Bundle; +import org.ntlab.radishforandroidstudio.cactusClient.models.Account; +import org.ntlab.radishforandroidstudio.cactusClient.models.URIAddressedAccount; + public class Cactus extends Application { private Account myAccount = null; + private URIAddressedAccount addressedAccount; + public Cactus() { registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @@ -51,14 +56,21 @@ } //MyAccountの追加 - public Account getMyAccount(){ + public Account getMyAccount() { return myAccount; } - public void setMyAccount(Account ac){ + public void setMyAccount(Account ac) { myAccount = ac; } + public URIAddressedAccount getAddressedAccount() { + return addressedAccount; + } + + public void setAddressedAccount(URIAddressedAccount addressedAccount) { + this.addressedAccount = addressedAccount; + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java index ca51f9c..0e45aff 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/MainActivity.java @@ -5,7 +5,7 @@ import android.support.v7.app.AppCompatActivity; import org.ntlab.radishforandroidstudio.R; -import org.ntlab.radishforandroidstudio.cactusClient.views.LoginFragment; +import org.ntlab.radishforandroidstudio.cactusClient.views.StartFragment; public class MainActivity extends AppCompatActivity { @@ -13,12 +13,23 @@ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //splash + // ここで5秒間スリープし、スプラッシュを表示させたままにする。 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + setTheme(R.style.AppTheme_NoActionBar); setContentView(R.layout.activity_main); + //fragmentの設定 Fragment fragment; - fragment = new LoginFragment(); + fragment = new StartFragment(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_place, fragment).commit(); - + setContentView(R.layout.activity_main); } + } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/CharactersFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/CharactersFragmentConnection.java new file mode 100644 index 0000000..a6f7f9f --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/CharactersFragmentConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class CharactersFragmentConnection extends HttpAsyncConnection { + + public CharactersFragmentConnection(String instanceId) { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/"+ instanceId +"/characters"); + } + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/InstancesFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/InstancesFragmentConnection.java new file mode 100644 index 0000000..e67327e --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/InstancesFragmentConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class InstancesFragmentConnection extends HttpAsyncConnection { + + public InstancesFragmentConnection() { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances"); + } + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java index 282c22a..1085bbf 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/LoginFragmentConnection.java @@ -5,7 +5,7 @@ public class LoginFragmentConnection extends HttpAsyncConnection { public LoginFragmentConnection() { - super("http://nitta-lab-www2.is.konan-u.ac.jp:8080/CactusServer/rest/accounts"); + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/accounts"); } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/PlayersConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/PlayersConnection.java new file mode 100644 index 0000000..b55b956 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/PlayersConnection.java @@ -0,0 +1,11 @@ +package org.ntlab.radishforandroidstudio.cactusClient.connections; + +import org.ntlab.radishforandroidstudio.framework.network.HttpAsyncConnection; + +public class PlayersConnection extends HttpAsyncConnection { + + public PlayersConnection() { + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/instances/players"); + } + +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java index 790156d..6c70db3 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/connections/SignUpFragmentConnection.java @@ -5,7 +5,7 @@ public class SignUpFragmentConnection extends HttpAsyncConnection { public SignUpFragmentConnection() { - super("http://nitta-lab-www2.is.konan-u.ac.jp:8080/CactusServer/rest/accounts"); + super("http://nitta-lab-www.is.konan-u.ac.jp:8080/CactusServer/rest/accounts"); } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Account.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Account.java index 8fe2513..8e38502 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Account.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Account.java @@ -5,6 +5,8 @@ public class Account { private String id, name, token, pass, uniqueID; private boolean login = false; + private Account(){ + } public Account(String userID, String userName, String userPass, String uniqueID) { setId(userID); @@ -48,6 +50,11 @@ this.login = login; } + public void setToken(String token){ + this.token = token; + + } + public String getToken() { return token; } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Angle.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Angle.java new file mode 100644 index 0000000..2f4f0cf --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Angle.java @@ -0,0 +1,52 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +public class Angle { + private double vx; + private double vy; + private double vz; + private double a; + + private Angle() { + // JSONDecode時の呼び出し用 + } + + public Angle(double vx, double vy, double vz, double a) { + setVx(vx); + setVy(vy); + setVz(vz); + setA(a); + } + + public double getVx() { + return vx; + } + + public double getVy() { + return vy; + } + + public double getVz() { + return vz; + } + + public double getA() { + return a; + } + + public void setVx(double vx) { + this.vx = vx; + } + + public void setVy(double vy) { + this.vy = vy; + } + + public void setVz(double vz) { + this.vz = vz; + } + + public void setA(double a) { + this.a = a; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Area.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Area.java new file mode 100644 index 0000000..6b76158 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Area.java @@ -0,0 +1,83 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.util.HashSet; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; + +import net.arnx.jsonic.JSONHint; + +public class Area extends Entity { + private String name; + private Plain[] region; // 任意個の平面の方程式 + private HashSet permissions; // エリア内で可能なことの羅列 + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + @SuppressWarnings("unused") + private Area() { + // JSONDecode時の呼び出し用 + } + + public Area(String name, Plain[] region, HashSet permissions) { + setName(name); + setRegion(region); + setPermissions(permissions); + } + + public String getName() { + return name; + } + + public Plain[] getRegion() { + return region; + } + + public Plain getPlain(int index) { + return region[index]; + } + + public HashSet getPermissions() { + return permissions; + } + + public boolean isPermission(Allowed allowed) { + return permissions.contains(allowed); + } + + public boolean isSurroundingPosition(Position3D position) { + for (Plain plain : region) { + // ここで Plainのa,b,c,d と Characterのx,y,z を用いて, キャラクターが平面の裏にいるかどうかの判定を行う + double equation = (plain.getA() * position.getX()) + (plain.getB() * position.getY()) + + (plain.getC() * position.getZ()) + plain.getD(); + if (equation > 0) { + return false; + } + } + return true; + } + + public void setName(String name) { + this.name = name; + } + + public void setRegion(Plain[] region) { + this.region = region; + } + + public void setPermissions(HashSet permissions) { + this.permissions = permissions; + } + + public void addPermission(Allowed allowed) { + permissions.add(allowed); + } + + public void removePermission(Allowed allowed) { + permissions.remove(allowed); + } + + public static enum Allowed { + SHOOT, KILL; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CameraState.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CameraState.java new file mode 100644 index 0000000..04f22c3 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CameraState.java @@ -0,0 +1,52 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +public class CameraState { + private double distance; // キャラからの距離 + private Angle angle; + private double tilt; // チルト(rad) + private double fov; // 視野角(rad) + + private CameraState() { + // JSONDecode時の呼び出し用 + } + + public CameraState(double distance, Angle angle, double tilt, double fov) { + setDistance(distance); + setAngle(angle); + setTilt(tilt); + setFov(fov); + } + + public double getDistance() { + return distance; + } + + public Angle getAngle() { + return angle; + } + + public double getTilt() { + return tilt; + } + + public double getFov() { + return fov; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public void setAngle(Angle angle) { + this.angle = angle; + } + + public void setTilt(double tilt) { + this.tilt = tilt; + } + + public void setFov(double fov) { + this.fov = fov; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Character.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Character.java new file mode 100644 index 0000000..2c5dbf8 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Character.java @@ -0,0 +1,174 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.util.HashMap; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + + + +import net.arnx.jsonic.JSONHint; + +public class Character extends Entity { + private String accountURI; + private String areaURI; + private String name; + private Position3D position; + private Quaternion3D angle; + private int modelID; + + private HashMap itemMap = new HashMap<>(); + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Character() { + // JSONDecode時の呼び出し用 + } + + public Character(String instanceId, String accountURI, String name, Position3D position, Quaternion3D angle, + int modelID) { + setAccountURI(accountURI); + setName(name); + setPosition(position); + setQuaternion3D(angle); + setModelID(modelID); + initAreaURI(instanceId); + } + + public String getAccountURI() { + return accountURI; + } + + public String getName() { + return name; + } + + public Position3D getPosition() { + return position; + } + + public Quaternion3D getQuaternion3D() { + return angle; + } + + public int getModelID() { + return modelID; + } + + public String getAreaURI() { + return areaURI; + } + + @JSONHint(ignore = true) + public Item getItem(String itemId) { + return itemMap.get(itemId); + } + + @JSONHint(ignore = true) + public HashMap getItems() { + return itemMap; + } + + public void setAccountURI(String accountURI) { + this.accountURI = accountURI; + } + + public void setName(String name) { + this.name = name; + } + + public void setPosition(Position3D position) { + this.position = position; + } + + public void setQuaternion3D(Quaternion3D angle) { + this.angle = angle; + } + + public void setModelID(int modelID) { + this.modelID = modelID; + } + + public void setAreaURI(String areaURI) { + this.areaURI = areaURI; + } + + public HashMap createItem(String name, int amount) { + Item item = new Item(name, amount); + if (!hasItem(item)) { + String id = RandomStringGenerator.generateUniqueString(Item.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, itemMap.keySet()); + itemMap.put(id, item); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, item); + return returnedMap; + } + return null; + } + + public boolean hasItem(Item item) { + for (Item value : itemMap.values()) { + if (value.equals(item)) { + return true; + } + } + return false; + } + + public Item changeAmountOfItem(String itemId, int amountOfChange) { + Item item = itemMap.get(itemId).changeAmount(amountOfChange); + if (item.isEmpty()) { + destroyItem(itemId); + } + return item; + } + + private void initAreaURI(String instanceId) { + Instance instance = Instances.getInstance().getInstance(instanceId); + setAreaURI(findAreaURI(instance)); + } + + private String findAreaURI(Instance instance) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + for (String areaId : instance.getAreas().keySet()) { + Area area = instance.getArea(areaId); + if (area.isSurroundingPosition(position)) { + int subStringEndIndex = areaURI.length() - Area.UNIQUE_ID_LENGTH; + StringBuilder newAreaURI = new StringBuilder(); + return newAreaURI.append(areaURI.substring(0, subStringEndIndex)).append(areaId).toString(); + } + } + return ""; + } + + public void update(Position3D position, Quaternion3D angle, String modelID, String areaURI) { + setPosition(position); + setQuaternion3D(angle); + if (modelID != null) { + setModelID(Integer.parseInt(modelID)); + } + if (areaURI != null) { + setAreaURI(areaURI); + } else { + updateAreaURI(); + } + } + + private void updateAreaURI() { + String[] areaURISplit = areaURI.split("/"); // ……/instances/{instanceId}/areas/{areaId} + int splitSize = areaURISplit.length; + String instanceId = areaURISplit[splitSize - 3]; + String previousAreaId = areaURISplit[splitSize - 1]; + Instance instance = Instances.getInstance().getInstance(instanceId); + Area previousArea = instance.getArea(previousAreaId); + if (!previousArea.isSurroundingPosition(position)) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + setAreaURI(findAreaURI(instance)); + } + } + + public Item destroyItem(String itemId) { + return itemMap.remove(itemId); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CharacterModelManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CharacterModelManager.java new file mode 100644 index 0000000..07a4dc8 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/CharacterModelManager.java @@ -0,0 +1,83 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; + +import org.ntlab.radishforandroidstudio.framework.model3D.Model3D; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFileFormatException; + +public class CharacterModelManager { + private static CharacterModelManager theInstance = null; + private HashMap characterModels = new HashMap<>(); + private int nextKey = 0; + private static final String MODEL_PATH = "../../"; + + private CharacterModelManager() { + initCharacterModels(); + } + + private void initCharacterModels() { + String[] initCharacterModelFileNames = { "pocha.stl", "Head4.obj" }; + for (String fileName : initCharacterModelFileNames) { + addCharacterModel(fileName); + } + } + + public static CharacterModelManager getInstance() { + if (theInstance == null) { + theInstance = new CharacterModelManager(); + } + return theInstance; + } + + public Model3D getCharacterModel(int id) { + return characterModels.get(id); + } + + public int getCharacterModelCount() { + return characterModels.size(); + } + + public int addCharacterModel(String fileName) { + String path = createModelFilePath(MODEL_PATH + fileName); + characterModels.put(nextKey, loadModel(path)); + return nextKey++; + } + + private String createModelFilePath(String fileName) { + String path = getClass().getResource(fileName).getPath(); + try { + path = URLDecoder.decode(path, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return path; + } + + private Model3D loadModel(String fileName) { + /***************************************************************************************************** + try { + return ModelFactory.loadModel(fileName, null, false, true); + } catch (IOException | ModelFileFormatException e) { + e.printStackTrace(); + } + *****************************************************************************************************/ + return null; + } + + /** + * 現在のCharacterModelMapの中身の確認用 + */ + private void confirmModelMap() { + // 確認用 + System.out.println(getCharacterModelCount() + "個のマッピングが存在するよ!"); + for (Map.Entry entry : characterModels.entrySet()) { + System.out.println(entry.getKey() + ": " + entry.getValue()); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/EmoteState.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/EmoteState.java new file mode 100644 index 0000000..de81264 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/EmoteState.java @@ -0,0 +1,33 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +/** + * エモートの情報を表すクラス
+ * 内部にエモートの種類を表す列挙型も定義 + * @author r-isitani + * + */ +public class EmoteState { + private EmoteType emoteType; + + private EmoteState() { + // JSONDecode時の呼び出し用 + } + + public EmoteState(EmoteType emoteType) { + setEmoteType(emoteType); + } + + public EmoteType getEmoteType() { + return emoteType; + } + + public void setEmoteType(EmoteType emoteType) { + this.emoteType = emoteType; + } + + public static enum EmoteType { + // 開始するエモートの種類の列挙 + DUMMY; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity.java new file mode 100644 index 0000000..9507a22 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity.java @@ -0,0 +1,10 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +/** + * AddressedEntityクラスにて扱う実体を表す抽象クラス + * @author r-isitani + * + */ +public abstract class Entity { + +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity3D.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity3D.java new file mode 100644 index 0000000..351eec7 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Entity3D.java @@ -0,0 +1,28 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import org.ntlab.radishforandroidstudio.framework.model3D.Placeable; + +import net.arnx.jsonic.JSONHint; + +public abstract class Entity3D extends Entity { + private Placeable placeable; + + protected Entity3D() { + // JSONDecode時の呼び出し用 + } + + public Entity3D(Placeable placeable) { + setPlaceable(placeable); + } + + @JSONHint(ignore = true) + public Placeable getPlaceable() { + return placeable; + } + + @JSONHint(ignore = true) + public void setPlaceable(Placeable placeable) { + this.placeable = placeable; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java new file mode 100644 index 0000000..564e380 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instance.java @@ -0,0 +1,169 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import java.util.HashMap; +import java.util.HashSet; + +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Universe; +import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D; +import org.ntlab.radishforandroidstudio.framework.physics.Ground; +import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; + +import net.arnx.jsonic.JSONHint; + +/** + * インスタンス + * + * @author r-isitani + * + */ +public class Instance extends Entity { + private String name; + private State state; + private int stageID; + + private Universe universe; + private Ground stage; + private HashMap areaMap = new HashMap<>(); + private HashMap objMap = new HashMap<>(); + private HashMap characterMap = new HashMap<>(); + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Instance() { + // JSONDecode時の呼び出し用 + } + + public Instance(String name, int stageID) { + setName(name); + setState(Instance.State.AVAILABLE); + setStageID(stageID); + // initUniverse(); + } + + private void initUniverse() { + universe = new Universe(); + // ステージの3Dデータを読み込み配置する + Object3D stageObj = StageModelManager.getInstance().getStage(stageID).createObject(); + stage = new Ground(stageObj); + universe.place(stage); + } + + public String getName() { + return name; + } + + public State getState() { + return state; + } + + public int getStageID() { + return stageID; + } + + @JSONHint(ignore = true) + public Universe getUniverse() { + return universe; + } + + @JSONHint(ignore = true) + public HashMap getAreas() { + return areaMap; + } + + public Area getArea(String areaId) { + return areaMap.get(areaId); + } + + @JSONHint(ignore = true) + public HashMap getObjects() { + return objMap; + } + + public Object getObject(String objId) { + return objMap.get(objId); + } + + @JSONHint(ignore = true) + public HashMap getCharacters() { + return characterMap; + } + + public Character getCharacter(String characterId) { + return characterMap.get(characterId); + } + + public void setName(String name) { + this.name = name; + } + + public void setState(State state) { + this.state = state; + } + + public void setStageID(int stageURI) { + this.stageID = stageURI; + } + + public HashMap createArea(String name, Plain[] region, HashSet permissions) { + String id = RandomStringGenerator.generateUniqueString(Area.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet()); + Area area = new Area(name, region, permissions); + areaMap.put(id, area); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, area); + return returnedMap; + } + + public HashMap createObject(Position3D position, Velocity3D velocity, + AngularVelocity3D angularVelocity, Quaternion3D angle, Object.Attribute attribute, String model) { + String id = RandomStringGenerator.generateUniqueString(Object.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); + Object object = new Object(position, velocity, angularVelocity, angle, attribute, model); + objMap.put(id, object); + universe.place(object.getPlaceable()); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, object); + return returnedMap; + } + + public HashMap createCharacter(String instanceId, String accountURI, String name, + Position3D position, Quaternion3D angle, int modelID) { + String id = RandomStringGenerator.generateUniqueString(Character.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet()); + Character character = new Character(instanceId, accountURI, name, position, angle, modelID); + characterMap.put(id, character); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, character); + return returnedMap; + } + + public Instance update(Instance.State state) { + setState(state); + return this; + } + + public Character updateCharacter(String characterId, Position3D position, Quaternion3D angle, String modelID) { + Character character = characterMap.get(characterId); + character.update(position, angle, modelID, null); // areaURI(第4引数)の更新は呼び出し先で自動で行われる + return character; + } + + public Character destroyCharacter(String characterId) { + return characterMap.remove(characterId); + } + + public Area destroyArea(String areaId) { + return areaMap.remove(areaId); + } + + public Object destroyObject(String objId) { + return objMap.remove(objId); + } + + public static enum State { + AVAILABLE, MAINTENANCE; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instances.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instances.java new file mode 100644 index 0000000..ce0cf28 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Instances.java @@ -0,0 +1,120 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.util.HashMap; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + +/** + * インスタンスを管理するクラス + * + * @author r-isitani + * + */ +public class Instances { + private static Instances theInstance = null; + private HashMap instanceMap = new HashMap<>(); // instanceのIDと実体を管理 + private HashMap playerMap = new HashMap<>(); + + private Instances() { +// // ダミーコード +// instanceMap.put("test1", new Instance("test1", 0)); +// instanceMap.put("test2", new Instance("test2", 1)); + } + + /** + * Instancesクラスを取得する (シングルトン) + * + * @return + */ + public static Instances getInstance() { + if (theInstance == null) { + theInstance = new Instances(); + } + return theInstance; + } + + public HashMap createInstance(String name, int stageID) { + String id = RandomStringGenerator.generateUniqueString(Instance.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, instanceMap.keySet()); + Instance instance = new Instance(name, stageID); + instanceMap.put(id, instance); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, instance); + return returnedMap; + } + + public HashMap createPlayer(String instanceURI, String characterURI, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + String id = RandomStringGenerator.generateUniqueString(Player.UNIQUE_ID_LENGTH, + RandomStringGenerator.ALPHA_NUMERIC, playerMap.keySet()); + Player player = new Player(instanceURI, characterURI, cameraState, animationClassToStart); + playerMap.put(id, player); + HashMap returnedMap = new HashMap<>(); + returnedMap.put(id, player); + return returnedMap; + } + + public HashMap getInstances() { + return instanceMap; + } + + public Instance getInstance(String instanceId) { + return instanceMap.get(instanceId); + } + + /** + * 全playerを返す + */ + public HashMap getPlayers() { + return playerMap; + } + + /** + * IDに対応するinstanceにいる全playerを返す + * + * @param instanceId + */ + public HashMap getPlayers(String instanceId) { + if (instanceId == null || instanceId.isEmpty()) { + return getPlayers(); + } + HashMap responsePlayers = new HashMap<>(); + for (String id : playerMap.keySet()) { + Player player = playerMap.get(id); + String[] instanceURISplit = player.getInstanceID().split("/"); // …/instances/{instanceId} + if (instanceId.equals(instanceURISplit[instanceURISplit.length - 1])) { + responsePlayers.put(id, player); + } + } + return responsePlayers; + } + + public Player getPlayer(String playerId) { + return playerMap.get(playerId); + } + + public Instance updateInstance(String instanceId, Instance.State state) { + Instance instance = instanceMap.get(instanceId); + instance.update(state); + return instance; + } + + public Player updatePlayer(String playerId, String characterURI, Position3D position, Quaternion3D angle, + CameraState cameraState, EmoteState.EmoteType animationClassToStart) { + Player player = playerMap.get(playerId); + player.update(characterURI, position, angle, cameraState, animationClassToStart); + return player; + } + + public Instance destroyInstance(String instanceId) { + return instanceMap.remove(instanceId); + } + + public Player destroyPlayer(String playerId) { + Player player = playerMap.get(playerId); + player.destroy(); + return playerMap.remove(playerId); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Item.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Item.java new file mode 100644 index 0000000..ab0f447 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Item.java @@ -0,0 +1,66 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import net.arnx.jsonic.JSONHint; + +public class Item extends Entity { + private String name; + private int amount; + + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Item() { + // JSONDecode時の呼び出し用 + } + + public Item(String name, int amount) { + setName(name); + setAmount(amount); + } + + public String getName() { + return name; + } + + public int getAmount() { + return amount; + } + + public boolean isEmpty() { + return (amount == 0); + } + + public void setName(String name) { + this.name = name; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public Item changeAmount(int amountOfChange) { + amount = Math.max(amount + amountOfChange, 0); + return this; + } + + @Override + public int hashCode() { + int result = 17; + result = result * 31 + name.hashCode(); + return result; + } + + @Override + public boolean equals(java.lang.Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Item) { + Item item = (Item) obj; + if (this.name.equals(item.name)) { + return true; // 同名のアイテムは等価 + } + } + return false; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java new file mode 100644 index 0000000..5ee62ac --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Object.java @@ -0,0 +1,113 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; +import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D; +import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D; + +//import framework.model3D.Position3D; +//import framework.physics.AngularVelocity3D; +//import framework.physics.Velocity3D; +import net.arnx.jsonic.JSONHint; + +public class Object extends Entity3D { + private Position3D position; + private Velocity3D velocity; + private AngularVelocity3D angularVelocity; + private Quaternion3D angle; + private Attribute attribute; + private String model; + + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + @SuppressWarnings("unused") + private Object() { + // JSONDecode時の呼び出し用 + } + + public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Quaternion3D angle, + Attribute attribute, String model) { + setPosition(position); + setVelocity(velocity); + setAngularVelocity(angularVelocity); + setAngle(angle); + setAttribute(attribute); + setModel(model); + } + + public Position3D getPosition() { + return position; + } + + public Velocity3D getVelocity() { + return velocity; + } + + public AngularVelocity3D getAngularVelocity() { + return angularVelocity; + } + + public Quaternion3D getAngle() { + return angle; + } + + public Attribute getAttribute() { + return attribute; + } + + public String getModel() { + return model; + } + + public void setPosition(Position3D position) { + this.position = position; + } + + public void setVelocity(Velocity3D velocity) { + this.velocity = velocity; + } + + public void setAngularVelocity(AngularVelocity3D angularVelocity) { + this.angularVelocity = angularVelocity; + } + + public void setAngle(Quaternion3D angle) { + this.angle = angle; + } + + public void setAttribute(Attribute attribute) { + this.attribute = attribute; + } + + public void setModel(String model) { + this.model = model; + } + + public static class Attribute { + private boolean moveable; // 可動 + private double cof; // 摩擦係数 + + public Attribute(boolean moveable, double cof) { + setMoveable(moveable); + setCof(cof); + } + + public boolean isMoveable() { + return moveable; + } + + public double getCof() { + return cof; + } + + public void setMoveable(boolean moveable) { + this.moveable = moveable; + } + + public void setCof(double cof) { + this.cof = cof; + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Plain.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Plain.java new file mode 100644 index 0000000..9b92230 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Plain.java @@ -0,0 +1,52 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +public class Plain { + private double a; // 平面の方程式 ax+by+cz+d のa + private double b; // 平面の方程式 ax+by+cz+d のb + private double c; // 平面の方程式 ax+by+cz+d のc + private double d; // 平面の方程式 ax+by+cz+d のd + + private Plain() { + // JSONDecode時の呼び出し用 + } + + public Plain(double a, double b, double c, double d) { + setA(a); + setB(b); + setC(c); + setD(d); + } + + public double getA() { + return a; + } + + public double getB() { + return b; + } + + public double getC() { + return c; + } + + public double getD() { + return d; + } + + public void setA(double a) { + this.a = a; + } + + public void setB(double b) { + this.b = b; + } + + public void setC(double c) { + this.c = c; + } + + public void setD(double d) { + this.d = d; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Player.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Player.java new file mode 100644 index 0000000..c809e49 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/Player.java @@ -0,0 +1,180 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import org.ntlab.radishforandroidstudio.framework.gameMain.OvergroundActor; +import org.ntlab.radishforandroidstudio.framework.model3D.Object3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Position3D; +import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D; + +import net.arnx.jsonic.JSONHint; + +public class Player extends Entity3D { + private String instanceID; + private String characterID; + private String areaURI; + private Position3D position; + private Quaternion3D angle; + private CameraState cameraState; + private EmoteState emoteState; + @JSONHint(ignore = true) + public static final int UNIQUE_ID_LENGTH = 12; + + private Player() { + // JSONDecode時の呼び出し用 + } + + public Player(String instanceID, String characterID, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + setInstanceID(instanceID); + setCharacterID(characterID); + setCameraState(cameraState); + setAnimationClassToStart(animationClassToStart); + Character character = getCharacter(characterID); + readCharacterData(character); + initPlaceable(character.getModelID()); + } + + private void initPlaceable(int modelID) { + // こんな感じで当該コンストラクタの最後でplaceableの注入を行う + Object3D body = CharacterModelManager.getInstance().getCharacterModel(modelID).createObject(); + setPlaceable(new OvergroundActor(body, null)); + // 所属するInstanceが持つUniverseにplaceableを配置する + String[] instanceURISplit = instanceID.split("/"); // ……/instances/{instanceId} + String instanceId = instanceURISplit[instanceURISplit.length - 1]; + Instances.getInstance().getInstance(instanceId).getUniverse().place(this.getPlaceable()); + } + + public String getInstanceID() { + return instanceID; + } + + public String getCharacterID() { + return characterID; + } + + public String getAreaURI() { + return areaURI; + } + + public Position3D getPosition() { + return position; + } + + public Quaternion3D getQuaternion3D() { + return angle; + } + + public CameraState getCameraState() { + return cameraState; + } + + public EmoteState getEmoteState() { + return emoteState; + } + + public void setInstanceID(String instanceID) { + this.instanceID = instanceID; + } + + public void setCharacterID(String characterID) { + this.characterID = characterID; + } + + public void setAreaURI(String areaURI) { + this.areaURI = areaURI; + } + + public void setPosition(Position3D position) { + this.position = position; + } + + public void setQuaternion3D(Quaternion3D angle) { + this.angle = angle; + } + + public void setCameraState(CameraState cameraState) { + this.cameraState = cameraState; + } + + public void setEmoteState(EmoteState emoteState) { + this.emoteState = emoteState; + } + + public void setAnimationClassToStart(EmoteState.EmoteType animationClassToStart) { + setEmoteState(new EmoteState(animationClassToStart)); + } + + public Player update(String characterURI, Position3D position, Quaternion3D angle, CameraState cameraState, + EmoteState.EmoteType animationClassToStart) { + setCharacterID(characterURI); + setPosition(position); + setQuaternion3D(angle); + setCameraState(cameraState); + updateEmoteType(animationClassToStart); + updateAreaURI(); + return this; + } + + private void updateAreaURI() { + String[] areaURISplit = areaURI.split("/"); // ……/instances/{instanceId}/areas/{areaId} + int splitSize = areaURISplit.length; + String instanceId = areaURISplit[splitSize - 3]; + String previousAreaId = areaURISplit[splitSize - 1]; + Instance instance = Instances.getInstance().getInstance(instanceId); + Area previousArea = instance.getArea(previousAreaId); + if (!previousArea.isSurroundingPosition(position)) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + setAreaURI(findAreaURI(instance)); + } + } + + private String findAreaURI(Instance instance) { + // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する + for (String areaId : instance.getAreas().keySet()) { + Area area = instance.getArea(areaId); + if (area.isSurroundingPosition(position)) { + int subStringEndIndex = areaURI.length() - Area.UNIQUE_ID_LENGTH; // …/{instanceId}/areas/ まで + return areaURI.substring(0, subStringEndIndex) + areaId; + } + } + return ""; + } + + private void updateEmoteType(EmoteState.EmoteType animationClassToStart) { + emoteState.setEmoteType(animationClassToStart); + } + + public void changeCharacter(String characterURI) { + writeCharacterData(this.characterID); + readCharacterData(characterURI); + } + + public void destroy() { + writeCharacterData(characterID); + } + + private Character getCharacter(String characterURI) { + String[] characterURISplit = characterURI.split("/"); // ……/instances/{instanceId}/characters/{characterId} + int splitSize = characterURISplit.length; + String characterId = characterURISplit[splitSize - 1]; + String instanceId = characterURISplit[splitSize - 3]; + return Instances.getInstance().getInstance(instanceId).getCharacter(characterId); + } + + private void readCharacterData(Character character) { + setPosition(character.getPosition()); + setQuaternion3D(character.getQuaternion3D()); + setAreaURI(character.getAreaURI()); + setCharacterID(characterID); + } + + private void readCharacterData(String characterURI) { + Character character = getCharacter(characterURI); + readCharacterData(character); + } + + private void writeCharacterData(String characterURI) { + Character character = getCharacter(characterURI); + character.update(position, angle, null, areaURI); // model(第3引数)の更新は出来ない + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/StageModelManager.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/StageModelManager.java new file mode 100644 index 0000000..5287d4f --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/models/StageModelManager.java @@ -0,0 +1,45 @@ +package org.ntlab.radishforandroidstudio.cactusClient.models; + + +import java.io.IOException; +import java.util.HashMap; + +import org.ntlab.radishforandroidstudio.framework.model3D.Model3D; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFactory; +import org.ntlab.radishforandroidstudio.framework.model3D.ModelFileFormatException; + +public class StageModelManager { + private static StageModelManager theInstance = null; + private HashMap model = new HashMap<>(); + + private StageModelManager() { + /***************************************************************************************************** + try { + setStage(0, ModelFactory.loadModel(getClass().getResource("../../konan/konan.stl").getPath())); + setStage(1, ModelFactory.loadModel(getClass().getResource("../../konan/konan.stl").getPath())); + } catch (IOException | ModelFileFormatException e) { + e.printStackTrace(); + } + *******************************************************************************************************/ + } + + public static StageModelManager getInstance() { + if (theInstance == null) { + theInstance = new StageModelManager(); + } + return theInstance; + } + + public void setStage(int key, Model3D model3d) { + model.put(key, model3d); + } + + public Model3D getStage(int stageID) { + return model.get(stageID); + } + + public int getStageModelCount() { + return model.size(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java index 5b6d935..fac885d 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/SampleActivity.java @@ -6,6 +6,7 @@ import android.os.Bundle; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.views.StartFragment; public class SampleActivity extends AppCompatActivity { diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java deleted file mode 100644 index 39cb5fc..0000000 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/tests/StartFragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.ntlab.radishforandroidstudio.cactusClient.tests; - - -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; - -import org.ntlab.radishforandroidstudio.R; -import org.ntlab.radishforandroidstudio.cactusClient.views.PlayerFragment; - -public class StartFragment extends Fragment { - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_start, container, false); - } - - @Override - public void onStart() { - super.onStart(); - - Button button = getActivity().findViewById(R.id.start_button); - button.setOnClickListener(new View.OnClickListener(){ - @Override - public void onClick(View view) { - FragmentManager manager = getFragmentManager(); - FragmentTransaction transaction = manager.beginTransaction(); - transaction.replace(R.id.framelayout_field, new SampleUiFragment()); -// transaction.replace(R.id.framelayout_field, new SampleGameFragment()); -// transaction.replace(R.id.framelayout_field,new SampleGame2Fragment()); -// transaction.replace(R.id.framelayout_field,new PlayerFragment()); - transaction.addToBackStack(null); - transaction.commit(); - } - }); - } -} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java index fdbc2d5..124a776 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/CharactersFragment.java @@ -1,5 +1,6 @@ package org.ntlab.radishforandroidstudio.cactusClient.views; +import android.content.Context; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; @@ -7,58 +8,122 @@ import android.view.View; import android.view.ViewGroup; import android.support.v4.app.Fragment; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.Toast; +import android.widget.ListView; +import net.arnx.jsonic.JSON; +import net.arnx.jsonic.TypeReference; + import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.Cactus; +import org.ntlab.radishforandroidstudio.cactusClient.connections.CharactersFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.connections.PlayersConnection; +import org.ntlab.radishforandroidstudio.cactusClient.models.Account; +import org.ntlab.radishforandroidstudio.cactusClient.models.Character; +import org.ntlab.radishforandroidstudio.cactusClient.models.Player; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class CharactersFragment extends Fragment { + private CharactersFragmentConnection connection; + private String instanceId; + private Account account; + private Cactus cactus; + private ArrayList characterIds = new ArrayList<>(); + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - String test = getArguments().getString("test"); - Toast.makeText(getActivity(), test, Toast.LENGTH_SHORT).show(); + instanceId = getArguments().getString("instanceId"); + + cactus = (Cactus) getActivity().getApplication(); + account = cactus.getMyAccount(); + + connection = new CharactersFragmentConnection(instanceId); + // Inflate the layout for this fragment return inflater.inflate(R.layout.characters_fragment, container, false); } - public void onStart() { - super.onStart(); + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { Button button = (Button) getActivity().findViewById(R.id.chooseInstances); - //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show(); - FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); - transaction.replace(R.id.fragment_place, new InstancesFragment()); - transaction.commit(); } }); - Button Nobita = (Button) getActivity().findViewById(R.id.NOBITA); - //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ - Nobita.setOnClickListener(new View.OnClickListener() { + // ListViewをセット + final ArrayAdapter adapter = new ArrayAdapter(this.getContext(), android.R.layout.simple_list_item_1, characterIds); + ListView listView = (ListView) view.findViewById(R.id.list); + listView.setAdapter(adapter); + CharactersFragmentConnection con = new CharactersFragmentConnection(instanceId); +// con.addQueryParam("accountID", account.getUniqueID()); + con.setCallBack(new CallBack() { + private Context context; + public CallBack setContext(Context context) { + this.context = context; + return this; + } @Override - public void onClick(View v) { - //Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show(); + public void onResponse(String response) { + Map characters = JSON.decode(response, new TypeReference>(){}); + for (String characterId : characters.keySet()) { + characterIds.add(characterId); + final ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, characterIds); + ListView listView = (ListView)view.findViewById(R.id.list); + listView.setAdapter(adapter); + } + } + }.setContext(this.getContext())); + con.doGet(); + // セルを選択されたら詳細画面フラグメント呼び出す + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + private Context context; + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + PlayersConnection con = new PlayersConnection(); + con.addFormParam("instanceID", instanceId); + con.addFormParam("characterID", characterIds.get(position)); + con.setCallBack(new CallBack() { + @Override + public void onResponse(String response) { + Map player = JSON.decode(response, new TypeReference>(){}); +// Player character = JSON.decode(response, Player.class); + // プレイ画面へ + Bundle bundle = new Bundle(); + bundle.putSerializable("characterId", characterIds.get(position)); + PlayerFragmentLight fragment = new PlayerFragmentLight(); + fragment.setArguments(bundle); + // TODO: 型を上のMAPのやつを渡すようにする + fragment.setPlayer(player.values().iterator().next()); + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.replace(R.id.fragment_place, fragment); + transaction.addToBackStack(null); + characterIds.clear(); + transaction.commit(); + } + }); - FragmentManager manager = getFragmentManager(); - FragmentTransaction transaction = manager.beginTransaction(); - transaction.replace(R.id.fragment_place, new PlayerFragment()); - transaction.addToBackStack(null); - transaction.commit(); + con.doPost(); } }); - } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java index d8fed11..31c75d8 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/InstancesFragment.java @@ -12,60 +12,85 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; +import android.widget.Toast; +import net.arnx.jsonic.JSON; +import net.arnx.jsonic.TypeReference; + import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.Cactus; +import org.ntlab.radishforandroidstudio.cactusClient.connections.InstancesFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.connections.SignUpFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.models.Account; +import org.ntlab.radishforandroidstudio.cactusClient.models.Instance; +import org.ntlab.radishforandroidstudio.cactusClient.models.URIAddressedAccount; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class InstancesFragment extends Fragment { - + private InstancesFragmentConnection connection; + ArrayList> listInstances ; + ListView listView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - - //このあたりで、サーバーと通信して、インスタンスの情報をとってくる - //............................................................... - // - - // Inflate the layout for this fragment return inflater.inflate(R.layout.instances_fragment, container, false); } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { - // ListViewに表示するデータ - final ArrayList items = new ArrayList<>(); - items.add("データ1"); - items.add("データ2"); - items.add("データ3"); - // ListViewをセット - final ArrayAdapter adapter = new ArrayAdapter(this.getContext(), android.R.layout.simple_list_item_1, items); - ListView listView = (ListView) view.findViewById(R.id.list_view); - listView.setAdapter(adapter); - // セルを選択されたら詳細画面フラグメント呼び出す - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + connection = new InstancesFragmentConnection(); + connection.setCallBack(new CallBack() { @Override - public void onItemClick(AdapterView parent, View v, int position, long id) { + public void onResponse(String response) { + //通信した時の処理を書くのだよ + HashMap mapInstances = JSON.decode(response, new TypeReference>(){}); + System.out.println(response); +// for(Map.Entry entry : mapInstances.entrySet()){ +// listInstances.add(entry); +// } + listInstances = new ArrayList<>(mapInstances.entrySet()); + ArrayList listNames = new ArrayList<>(); + for(Map.Entry entry : listInstances) { + listNames.add(entry.getValue().getName()); + } + // ListViewをセット + ArrayAdapter adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, listNames); + listView = (ListView) view.findViewById(R.id.list_view); + listView.setAdapter(adapter); - //ここでサーバーに何番のインスタンスが選ばれたのかを送信して、受け取った値に応じてキャラクターを送信しなければならない - //................................................... - // + // セルを選択されたら詳細画面フラグメント呼び出す + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int InstanceNum, long id) { - FragmentManager manager = getFragmentManager(); - FragmentTransaction transaction = manager.beginTransaction(); - CharactersFragment fragment = new CharactersFragment(); - Bundle bundle = new Bundle(); - bundle.putSerializable("test","これはテストです"); - fragment.setArguments(bundle); - transaction.replace(R.id.fragment_place, fragment,"characters_fragment"); - transaction.commit(); + //ここでサーバーに何番のインスタンスが選ばれたのかを送信して、受け取った値に応じてキャラクターを送信しなければならない + //................................................... + //InstanceNum+で選ばれたインスタンスわかるで!数字は0からやで!例えば1はデータ2やで!やで + String[] s = listInstances.get(InstanceNum).getKey().split("/"); + + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + CharactersFragment fragment = new CharactersFragment(); + Bundle bundle = new Bundle(); + bundle.putSerializable("instanceId",s[s.length-1]); + fragment.setArguments(bundle); + transaction.replace(R.id.fragment_place, fragment,"characters_fragment"); + transaction.addToBackStack(null); + transaction.commit(); + } + }); } }); + connection.doGet(); } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java index 93f93d4..fff180f 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/LoginFragment.java @@ -9,19 +9,28 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.Toast; + +import net.arnx.jsonic.JSON; +import net.arnx.jsonic.TypeReference; + import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.Cactus; import org.ntlab.radishforandroidstudio.cactusClient.connections.LoginFragmentConnection; +import org.ntlab.radishforandroidstudio.cactusClient.models.Account; +import org.ntlab.radishforandroidstudio.cactusClient.models.URIAddressedAccount; +import org.ntlab.radishforandroidstudio.framework.network.CallBack; public class LoginFragment extends Fragment { private LoginFragmentConnection connection; + private Boolean testFlag = false; //trueにすると、通信せずにインスタンス画面へ遷移します。つまり、通信なしでテストするなら"true"にせい @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.login_fragment, container, false); - } @Override @@ -29,9 +38,7 @@ super.onStart(); Button button = (Button)getActivity().findViewById(R.id.signUP1); - //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ button.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { //Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show(); @@ -42,8 +49,6 @@ transaction.commit(); } }); - //↑↑↑↑↑画面遷移↑↑↑↑↑↑ - Button loginButton = (Button)getActivity().findViewById(R.id.login); loginButton.setOnClickListener(new View.OnClickListener() { @Override @@ -52,47 +57,49 @@ EditText passWord = (EditText)getActivity().findViewById(R.id.checkPassword); // /**************************************************************** -// テストするなら以下を実行するとパスの入力をしなくても画面遷移します - FragmentManager manager = getFragmentManager(); - FragmentTransaction transaction = manager.beginTransaction(); - - transaction.replace(R.id.fragment_place, new InstancesFragment()); - - transaction.commit(); + if(testFlag) { + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.replace(R.id.fragment_place, new InstancesFragment()); + transaction.commit(); + return; + } // **********************************************************************/ -// -// if (userName.getText().toString().isEmpty()) { -// Toast.makeText(getActivity(), "ユーザー名が未記入です", Toast.LENGTH_SHORT).show(); -// } else if(passWord.getText().toString().isEmpty()){ -// Toast.makeText(getActivity(), "パスワードが未記入です", Toast.LENGTH_SHORT).show(); -// } else { -// -// connection = new LoginFragmentConnection(); -// connection.setCallBack(new CallBack() { -// @Override -// public void onResponse(String response) { -// //通信した時の処理を書くのだよ -// URIAddressedEntity lac = JSON.decode(response, URIAddressedEntity.class); -// System.out.println("///////////////////////////////////////////////"); -// System.out.println(response); -// -// if(response.contains("\"login\":true,")){ -// Toast.makeText(getActivity(),"ログインに成功しました。", Toast.LENGTH_SHORT).show(); -// FragmentManager manager = getFragmentManager(); -// FragmentTransaction transaction = manager.beginTransaction(); -// transaction.replace(R.id.fragment_place, new InstancesFragment()); -// transaction.commit(); -// }else { -// Toast.makeText(getActivity(),"ログインに失敗しました。", Toast.LENGTH_SHORT).show(); -// } -// -// } -// }); -// connection.addFormParam("userID", userName.getText().toString()); -// connection.addFormParam("userPass", passWord.getText().toString()); -// connection.doPut(); -// } + + if (userName.getText().toString().isEmpty()) { + Toast.makeText(getActivity(), "ユーザー名が未記入です", Toast.LENGTH_SHORT).show(); + return; + } else if(passWord.getText().toString().isEmpty()){ + Toast.makeText(getActivity(), "パスワードが未記入です", Toast.LENGTH_SHORT).show(); + return; + } + + connection = new LoginFragmentConnection(); + connection.setCallBack(new CallBack() { + @Override + public void onResponse(String response) { + //通信した時の処理を書くのだよ + URIAddressedAccount lac = JSON.decode(response, new TypeReference(){}); +// System.out.println(response); + Account user = lac.getAccount(); + if(user.isLogin()){ + Toast.makeText(getActivity(),"ログインに成功しました。", Toast.LENGTH_SHORT).show(); + Cactus c = (Cactus) getActivity().getApplication(); + c.setMyAccount(user); + c.setAddressedAccount(lac); + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.replace(R.id.fragment_place, new InstancesFragment()); + transaction.commit(); + }else { + Toast.makeText(getActivity(),"ログインに失敗しました。", Toast.LENGTH_SHORT).show(); + } + } + }); + connection.addFormParam("userID", userName.getText().toString()); + connection.addFormParam("userPass", passWord.getText().toString()); + if(testFlag == false)connection.doPut(); } }); diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java index d019d30..9cadaf1 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragment.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.models.Player; import org.ntlab.radishforandroidstudio.framework.RWT.RWTPad; import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment; import org.ntlab.radishforandroidstudio.framework.animation.Animation3D; @@ -38,6 +39,7 @@ private float touchX = 0.0f; private float touchY = 0.0f; RWTPad pad = null; + private Player player; public PlayerFragment() { // Required empty public constructor @@ -157,6 +159,12 @@ pad.addListener((PadListener) this); } + /** + * TODO: 座標等はcharacter変数を使用するようにする + * + * @param event イベントの情報 + * @return + */ @Override public boolean onEvent(PadEvent event) { Vector3d charaVector3d = pocha.getDirection(); @@ -178,5 +186,9 @@ } return false; } + + public void setPlayer(Player player) { + this.player = player; + } } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragmentLight.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragmentLight.java new file mode 100644 index 0000000..46f3081 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/PlayerFragmentLight.java @@ -0,0 +1,99 @@ +package org.ntlab.radishforandroidstudio.cactusClient.views; + + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.ntlab.radishforandroidstudio.R; +import org.ntlab.radishforandroidstudio.cactusClient.models.Player; +import org.ntlab.radishforandroidstudio.framework.RWT.RWTPad; +import org.ntlab.radishforandroidstudio.framework.RWT.RWTUIFragment; +import org.ntlab.radishforandroidstudio.framework.event.PadEvent; +import org.ntlab.radishforandroidstudio.framework.gameMain.RealTime3DFragment; +import org.ntlab.radishforandroidstudio.framework.listener.PadListener; +import org.ntlab.radishforandroidstudio.java3d.AmbientLight; +import org.ntlab.radishforandroidstudio.java3d.Appearance; +import org.ntlab.radishforandroidstudio.java3d.Color3f; +import org.ntlab.radishforandroidstudio.java3d.DirectionalLight; +import org.ntlab.radishforandroidstudio.java3d.Material; +import org.ntlab.radishforandroidstudio.java3d.Vector3f; + +public class PlayerFragmentLight extends RealTime3DFragment implements PadListener { + private boolean isTouched = false; + private float touchX = 0.0f; + private float touchY = 0.0f; + RWTPad pad = null; + private Player player; + + public PlayerFragmentLight() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + //環境光 + AmbientLight amblight = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f)); + +// amblight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); + universe.placeLight(amblight); + + //平行光源 + DirectionalLight dirlight = new DirectionalLight( + new Color3f(1.0f, 1.0f, 1.0f), //光の色 + new Vector3f(0.0f, -1.0f, -0.5f) //光の方向ベクトル + ); +// dirlight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); + universe.placeLight(dirlight); + + Appearance ap1 = new Appearance(); + Material m = new Material(); + m.setDiffuseColor(0.0f, 0.3f, 1.0f); + m.setAmbientColor(0.0f, 0.0f, 0.0f); + m.setEmissiveColor(0.0f, 0.0f, 0.0f); + m.setSpecularColor(0.0f, 0.0f, 0.0f); + m.setShininess(5.0f); + ap1.setMaterial(m); + camera.setFieldOfView(1.5); + camera.setBackClipDistance(10000.0); + start(1000L, 50L, true); + } + + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + initGameWindowView(); + return parentView; + } + + @Override + protected void progress(long interval) { + } + + + //sampleUiFragmentからそのまま持ってきた + public void initGameWindowView() { + } + + public void onCreateFragmentEvent(RWTUIFragment f) { + pad = (RWTPad) f.findViewById(R.id.pad); + pad.addListener((PadListener) this); + } + + @Override + public boolean onEvent(PadEvent event) { + return false; + } + + public void setPlayer(Player player) { + this.player = player; + } +} + diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java index 938ade5..df08e52 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/SignUpFragment.java @@ -26,10 +26,8 @@ Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.sign_up_fragment, container, false); - } - //↓↓↓↓↓↓↓↓画面遷移↓↓↓↓↓↓↓↓ @Override public void onStart() { @@ -38,16 +36,12 @@ //ログインボタン Button button = (Button) getActivity().findViewById(R.id.LoginButton2); button.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { //Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show(); - FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); - transaction.addToBackStack(null); - //transaction.replace(R.id.fragment_place, new LoginFragment()); transaction.replace(R.id.fragment_place, new LoginFragment()); transaction.commit(); @@ -67,34 +61,36 @@ if(inputUserID.getText().toString().contains(" ") || inputUserID.getText().toString().contains(" ")){ Toast.makeText(getActivity(), "空白の含むIDは登録できません", Toast.LENGTH_SHORT).show(); + return; }else if (inputPassword.getText().toString().isEmpty()) { Toast.makeText(getActivity(), "パスワードを入力してください", Toast.LENGTH_SHORT).show(); + return; } else if (checkPassWord.getText().toString().isEmpty()) { Toast.makeText(getActivity(), "確認用パスワードを入力してください", Toast.LENGTH_SHORT).show(); + return; } else if (!inputPassword.getText().toString().equals(checkPassWord.getText().toString() )) { Toast.makeText(getActivity(), "パスワードが一致しません", Toast.LENGTH_SHORT).show(); - }else{ - - connection = new SignUpFragmentConnection(); - connection.setCallBack(new CallBack() { - @Override - public void onResponse(String response) { - //通信した時の処理を書くのだよ - URIAddressedAccount ac = JSON.decode(response, URIAddressedAccount.class); - URIAddressedAccount ac2 = JSON.decode(response, new TypeReference(){}); - System.out.println("JSON.decode(response, URIAddressedAccount.class);\n"+ac.getUri()); - System.out.println("JSON.decode(response, new TypeReference(){});\n"+ac2.getUri()); - System.out.println(response); - Toast.makeText(getActivity(),response, Toast.LENGTH_SHORT).show(); - } - }); - - connection.addFormParam("userID", inputUserID.getText().toString()); - connection.addFormParam("userPass", inputPassword.getText().toString()); - connection.addFormParam("userName", inputUserName.getText().toString()); - connection.doPost(); - + return; } + + connection = new SignUpFragmentConnection(); + connection.setCallBack(new CallBack() { + @Override + public void onResponse(String response) { + //通信した時の処理を書くのだよ +// URIAddressedAccount ac = JSON.decode(response,URIAddressedAccount.class); +// System.out.println("JSON.decode(response, URIAddressedAccount.class);\n"+ac.getUri()); + URIAddressedAccount ac2 = JSON.decode(response, new TypeReference(){}); + System.out.println("JSON.decode(response, new TypeReference(){});\n"+ac2.getUri()); + System.out.println(response); + Toast.makeText(getActivity(),"アカウントを作成しました。", Toast.LENGTH_SHORT).show(); + } + }); + + connection.addFormParam("userID", inputUserID.getText().toString()); + connection.addFormParam("userPass", inputPassword.getText().toString()); + connection.addFormParam("userName", inputUserName.getText().toString()); + connection.doPost(); } }); } diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/StartFragment.java b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/StartFragment.java new file mode 100644 index 0000000..a665386 --- /dev/null +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/cactusClient/views/StartFragment.java @@ -0,0 +1,39 @@ +package org.ntlab.radishforandroidstudio.cactusClient.views; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import org.ntlab.radishforandroidstudio.R; + +public class StartFragment extends Fragment { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_start, container, false); + } + + @Override + public void onStart() { + super.onStart(); + + Button button = getActivity().findViewById(R.id.start_button); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + FragmentManager manager = getFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.replace(R.id.fragment_place, new LoginFragment()); + transaction.commit(); + } + }); + } +} diff --git a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java index 1b17405..93d7617 100644 --- a/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java +++ b/app/src/main/java/org/ntlab/radishforandroidstudio/framework/network/HttpAsyncConnection.java @@ -5,7 +5,9 @@ import android.util.Log; import java.io.BufferedReader; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; @@ -120,21 +122,52 @@ // response public String doReceive() { BufferedReader reader; + InputStream in = null; try { - reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + System.out.println(conn.getResponseCode()); + in = conn.getInputStream(); + reader = new BufferedReader(new InputStreamReader(in)); String line; StringBuilder builder = new StringBuilder(); - while((line = reader.readLine()) != null) + while ((line = reader.readLine()) != null) builder.append(line); reader.close(); if (conn != null) conn.disconnect(); return builder.toString(); + } catch (FileNotFoundException e) { // IOException をキャッチするより先に FileNotFoundException をキャッチしないと IOException のキャッチブロックに行くのでこうする + System.err.println(e); + InputStream err = null; + try { + err = conn.getErrorStream(); + System.out.println(err.read()); + // 4xx または 5xx なレスポンスのボディーを読み取る + // ... + } catch (IOException e2) { + System.err.println(e2); + } finally { + if (err != null) { + try { + err.close(); + } catch (IOException e3) { + System.err.println(e3); + } + } + } } catch (IOException e) { - e.printStackTrace(); - if (conn != null) conn.disconnect(); - return null; + System.err.println(e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + System.err.println(e); + } + } + if (conn != null) { + conn.disconnect(); + } } - + return null; } public void notConnection(){}; diff --git a/app/src/main/res/drawable/nittalab.png b/app/src/main/res/drawable/nittalab.png new file mode 100644 index 0000000..94547b5 --- /dev/null +++ b/app/src/main/res/drawable/nittalab.png Binary files differ diff --git a/app/src/main/res/drawable/splash.xml b/app/src/main/res/drawable/splash.xml new file mode 100644 index 0000000..91a9688 --- /dev/null +++ b/app/src/main/res/drawable/splash.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ef10842..287a02e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,20 +4,29 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".cactusClient.MainActivity" - android:id="@+id/fragment_place" - tools:layout_editor_absoluteY="73dp"> + tools:context=".cactusClient.MainActivity"> - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/characters_fragment.xml b/app/src/main/res/layout/characters_fragment.xml index 41c4574..5b021d8 100644 --- a/app/src/main/res/layout/characters_fragment.xml +++ b/app/src/main/res/layout/characters_fragment.xml @@ -7,44 +7,29 @@ android:layout_height="match_parent">