From e5659a16092dc90fd7b06f3659158ddae6e1edd3 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期一, 06 七月 2020 17:06:34 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- lib/src/main/java/com/anyun/exam/lib/SvrManager.java | 4 app/src/main/java/safeluck/drive/evaluation/fragment/VPFragment.java | 27 - app/src/main/java/safeluck/drive/evaluation/fragment/JiaXiaoFragment.java | 388 +++++++++++++++++++++++++ app/src/main/res/values/app_settings.xml | 4 app/src/main/java/safeluck/drive/evaluation/util/Utils.java | 85 +++++ app/src/main/assets/giscar.json | 35 ++ app/src/main/res/layout/layout_arc_gis.xml | 14 app/src/main/res/layout/layout_select_dlg.xml | 10 /dev/null | 0 app/src/main/java/safeluck/drive/evaluation/app.java | 61 ++- app/src/main/java/safeluck/drive/evaluation/bean/GisCarModel.java | 146 +++++++++ app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java | 36 +- build.gradle | 4 app/src/main/res/layout/profile_layout.xml | 9 app/src/main/java/safeluck/drive/evaluation/bean/CarModel.java | 43 ++ app/build.gradle | 3 app/src/main/res/values/dimens.xml | 1 17 files changed, 794 insertions(+), 76 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 85f7c62..c04999c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,6 +77,9 @@ implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofit_version" implementation "com.google.zxing:core:$rootProject.qrcode_version" implementation "com.squareup.picasso:picasso:2.5.2" + // *** ADD *** + implementation 'com.esri.arcgisruntime:arcgis-android:100.8.0' + } repositories { mavenCentral() diff --git a/app/libs/tbs_sdk_thirdapp_v4.3.0.3_43903_sharewithdownloadwithfile_withoutGame_obfs_20200402_121309.jar b/app/libs/tbs_sdk_thirdapp_v4.3.0.3_43903_sharewithdownloadwithfile_withoutGame_obfs_20200402_121309.jar deleted file mode 100644 index 87c40fa..0000000 --- a/app/libs/tbs_sdk_thirdapp_v4.3.0.3_43903_sharewithdownloadwithfile_withoutGame_obfs_20200402_121309.jar +++ /dev/null Binary files differ diff --git a/app/src/main/assets/giscar.json b/app/src/main/assets/giscar.json new file mode 100644 index 0000000..667ae34 --- /dev/null +++ b/app/src/main/assets/giscar.json @@ -0,0 +1,35 @@ +{ + "axial": [0, 25], + "body": [0, 1, 2, 3, 4, 5, 6, 7, 25, 26, 27, 28,29,30,31,32], + "left_front_tire": [8, 9], + "left_rear_tire": [10, 11], + "main_ant": [-9151.5063, 13030.5118], + "point": [-9149.6063, 13033.0768, -9149.9978, 13033.3124, -9150.3258, 13033.3485, -9150.8341, 13032.8985, -9151.7318, 13031.6639, -9152.3573, 13030.83, -9152.5214, 13030.5639, -9152.602, 13030.3105,-9150.8053, 13032.8843,-9150.6537, 13032.7602,-9152.3352, 13030.8124, -9152.221, 13030.7008, + + -9150.1005859,13032.423100000247000,-9150.8535156,13032.752900000662000,-9151.1162109,13032.073200000450000,-9150.5683594,13031.804300000891000, + -9151.5400391,13030.519500000402000,-9151.9570313,13030.962400000542000,-9152.3496094,13030.609099999070000,-9151.8574219,13030.100199999288000, + + -9151.0009766,13032.559200000018000,-9152.1943359,13030.980799999088000,-9151.9980469,13031.044099999592000,-9151.8066406,13031.161399999633000,-9151.2636719,13031.880100000650000, + + + -9152.092, 13029.7892, + + + -9151.4638, 13029.4333, -9151.2111, 13029.568, -9150.9808, 13029.8341, -9150.3546, 13030.6796, -9149.458, 13031.8642,-9149.1611, 13032.4276,-9149.2827, 13032.7653,-9149.4842, 13031.8708, -9149.6176, 13031.9937, -9151.0011,13029.8717, -9151.1367, 13029.9878, + + + -9150.1621094,13031.346100000665000,-9149.5800781,13031.784299999475000, + -9151.2343750,13029.761800000444000,-9151.0019531,13030.236099999398000, + + -9150.9208984,13030.012800000608000,-9149.7265625,13031.590900000185000,-9150.3085938,13031.153000000864000,-9150.8496094,13030.435100000352000,-9150.9160156,13030.213700000197000 + ], + "right_front_tire": [33, 34], + "right_rear_tire": [35, 36], + + "left_front_glass":[12,13,14,15], + "left_rear_glass":[16,17,18,19], + "left_center_glass":[20,21,22,23,24], + "right_front_glass":[37,38], + "right_rear_glass":[39,40], + "right_center_glass":[41,42,43,44,45] +} \ No newline at end of file diff --git a/app/src/main/java/safeluck/drive/evaluation/app.java b/app/src/main/java/safeluck/drive/evaluation/app.java index cef9ce9..3c2f9aa 100644 --- a/app/src/main/java/safeluck/drive/evaluation/app.java +++ b/app/src/main/java/safeluck/drive/evaluation/app.java @@ -26,7 +26,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.tencent.smtt.sdk.QbSdk; import org.json.JSONException; @@ -98,33 +97,20 @@ //鑰冭瘯鐘舵�� 锛屼竴浜涘垵濮嬬姸鎬侊紝app涓�浜涚姸鎬佸簲璇ュ厛鍒濆鍖栦竴涓� initData(); - QbSdk.initX5Environment(this,cb); } } - QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { - @Override - public void onViewInitFinished(boolean arg0) { - MyLog.i(" QbSdk onViewInitFinished is " + arg0); - } - @Override - public void onCoreInitFinished() { - MyLog.i("x5鍐呮牳onCoreInitFinished"); - } - }; - private void preinitX5WebCore() { - if (!QbSdk.isTbsCoreInited()) { - // preinit鍙渶瑕佽皟鐢ㄤ竴娆★紝濡傛灉宸茬粡瀹屾垚浜嗗垵濮嬪寲锛岄偅涔堝氨鐩存帴鏋勯�爒iew - QbSdk.preInit(this, null);// 璁剧疆X5鍒濆鍖栧畬鎴愮殑鍥炶皟鎺ュ彛 - MyLog.i(" QbSdk isTbsCoreInited " ); - } - } + private void initData() { CThreadPoolExecutor.runInBackground(()->{ + MyLog.i("寮�濮嬪垵濮嬪寲鏁版嵁鍙戦�佸湴鍥�/杞﹁締/mcu鍗囩骇鏂囦欢/鑰冭瘯鐘舵��"); int type = WorkRoomDataBase.getWorkRoomDataBase(getApplicationContext()).getExamStatusDao().getStartExamInt(); ExamPlatformData.getInstance().setExamType(type); + OneTimeWorkRequest examStatausOutWorker = OneTimeWorkRequest.from(ExamStatusOutWorker.class); + OneTimeWorkRequest mcuUpgradeWorker = OneTimeWorkRequest.from(MCUUpgradeWorker.class); + WorkManager.getInstance(getApplicationContext()).beginWith(examStatausOutWorker).then(mcuUpgradeWorker).enqueue(); }); } @@ -150,7 +136,6 @@ @Override public void callBackMsg(final int cmd, String json) { String strConent = String.format("鏀跺埌鍛戒护[%d],Json鍐呭涓�%s", cmd, json); - Log.i(TAG,strConent); if (strConent.equalsIgnoreCase(lastStr)){ }else{ @@ -160,9 +145,7 @@ } switch (cmd) { case Constant.NDK_START: - OneTimeWorkRequest examStatausOutWorker = OneTimeWorkRequest.from(ExamStatusOutWorker.class); - OneTimeWorkRequest mcuUpgradeWorker = OneTimeWorkRequest.from(MCUUpgradeWorker.class); - WorkManager.getInstance(getApplicationContext()).beginWith(examStatausOutWorker).then(mcuUpgradeWorker).enqueue(); + @@ -272,12 +255,35 @@ MyLog.i("鏀跺埌鑰冭瘯搴旂瓟閿欒鐮�="+errCode); switch (errCode){ case -1: -// sendMapInfo(); -// break; + if (ExamPlatformData.getInstance().getExamType()>ExamPlatformData.EXAM_TYPE_ChangKAO){ + if (TextUtils.isEmpty(ExamPlatformData.getInstance().getRoadMapPath())){ + MyLog.i("寮�濮嬭�冭瘯鍚庯紝杩滅▼鏈嶅姟缂哄皯璺�冨湴鍥撅紝浣嗗湴鍥剧‘瀹炰笉瀛樺湪鏃犳硶鍙戦�佺粰杩滅▼鏈嶅姟"); + CThreadPoolExecutor.runOnMainThread(() -> Toast.makeText(appContext, "缂哄皯璺�冨湴鍥撅紝璇峰墠寰�\"璁剧疆\"閫夋嫨鍦板浘", Toast.LENGTH_SHORT).show()); + + return; + } + } + if (ExamPlatformData.getInstance().getExamType()==ExamPlatformData.EXAM_TYPE_ChangKAO){ + if (TextUtils.isEmpty(ExamPlatformData.getInstance().getMapPath())){ + MyLog.i("寮�濮嬭�冭瘯鍚庯紝杩滅▼鏈嶅姟缂哄皯chang鑰冨湴鍥撅紝浣嗗湴鍥剧‘瀹炰笉瀛樺湪鏃犳硶鍙戦�佺粰杩滅▼鏈嶅姟"); + CThreadPoolExecutor.runOnMainThread(new Runnable() { + @Override + public void run() { + Toast.makeText(appContext, "缂哄皯鍦鸿�冨湴鍥撅紝璇峰墠寰�\"璁剧疆\"閫夋嫨鍦板浘", Toast.LENGTH_SHORT).show(); + + } + }); + + return; + } + } + + sendMapInfo(); + break; case -2: -// sendVechileInfo(); -// break; + sendVechileInfo(); + break; case -3: Data data = new Data.Builder().putInt(Constant.NEED_MAPS_CAR,1).build(); OneTimeWorkRequest examStatausOutWorker1 = new OneTimeWorkRequest.Builder(ExamStatusOutWorker.class) @@ -551,7 +557,6 @@ AYSdk.getInstance().sendCmd(Constant.PUSH_ROAD_MAP_INFO,str); }else{ MyLog.i(String.format("鏂囦欢:%s涓嶅瓨鍦�",roadmapPath)); - CThreadPoolExecutor.runOnMainThread(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/safeluck/drive/evaluation/bean/CarModel.java b/app/src/main/java/safeluck/drive/evaluation/bean/CarModel.java new file mode 100644 index 0000000..1408276 --- /dev/null +++ b/app/src/main/java/safeluck/drive/evaluation/bean/CarModel.java @@ -0,0 +1,43 @@ +package safeluck.drive.evaluation.bean; + +/** + * @ProjectName: DriveJudge + * @Package: safeluck.drive.evaluation.bean + * @ClassName: CarModel + * @Description: java绫讳綔鐢ㄦ弿杩� + * @Author: 鏉庡崰浼� + * @CreateDate: 2020-06-03 15:22 + * @UpdateUser: 鏇存柊鑰� + * @UpdateDate: 2020-06-03 15:22 + * @UpdateRemark: 鏇存柊璇存槑 + * @Version: 1.0 + */ + +public class CarModel { + private double distance; + private double angle; + + public CarModel(double distance, double angle) { + this.distance = distance; + this.angle = angle; + } + + public CarModel() { + } + + public double getDistance() { + return distance; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public double getAngle() { + return angle; + } + + public void setAngle(double angle) { + this.angle = angle; + } +} diff --git a/app/src/main/java/safeluck/drive/evaluation/bean/GisCarModel.java b/app/src/main/java/safeluck/drive/evaluation/bean/GisCarModel.java new file mode 100644 index 0000000..0c0422c --- /dev/null +++ b/app/src/main/java/safeluck/drive/evaluation/bean/GisCarModel.java @@ -0,0 +1,146 @@ +package safeluck.drive.evaluation.bean; + +import java.util.List; + +/** + * @ProjectName: DriveJudge + * @Package: safeluck.drive.evaluation.bean + * @ClassName: GisCarModel + * @Description: java绫讳綔鐢ㄦ弿杩� + * @Author: 鏉庡崰浼� + * @CreateDate: 2020-06-03 16:56 + * @UpdateUser: 鏇存柊鑰� + * @UpdateDate: 2020-06-03 16:56 + * @UpdateRemark: 鏇存柊璇存槑 + * @Version: 1.0 + */ + +public class GisCarModel { + + private List<Integer> axial; + private List<Integer> body; + private List<Integer> left_front_tire; + private List<Integer> left_rear_tire; + private List<Double> main_ant; + private List<Double> point; + private List<Integer> right_front_tire; + private List<Integer> right_rear_tire; + private List<Integer> left_front_glass; + private List<Integer> left_rear_glass; + private List<Integer> left_center_glass; + private List<Integer> right_front_glass; + private List<Integer> right_rear_glass; + private List<Integer> right_center_glass; + + public List<Integer> getAxial() { + return axial; + } + + public void setAxial(List<Integer> axial) { + this.axial = axial; + } + + public List<Integer> getBody() { + return body; + } + + public void setBody(List<Integer> body) { + this.body = body; + } + + public List<Integer> getLeft_front_tire() { + return left_front_tire; + } + + public void setLeft_front_tire(List<Integer> left_front_tire) { + this.left_front_tire = left_front_tire; + } + + public List<Integer> getLeft_rear_tire() { + return left_rear_tire; + } + + public void setLeft_rear_tire(List<Integer> left_rear_tire) { + this.left_rear_tire = left_rear_tire; + } + + public List<Double> getMain_ant() { + return main_ant; + } + + public void setMain_ant(List<Double> main_ant) { + this.main_ant = main_ant; + } + + public List<Double> getPoint() { + return point; + } + + public void setPoint(List<Double> point) { + this.point = point; + } + + public List<Integer> getRight_front_tire() { + return right_front_tire; + } + + public void setRight_front_tire(List<Integer> right_front_tire) { + this.right_front_tire = right_front_tire; + } + + public List<Integer> getRight_rear_tire() { + return right_rear_tire; + } + + public void setRight_rear_tire(List<Integer> right_rear_tire) { + this.right_rear_tire = right_rear_tire; + } + + public List<Integer> getLeft_front_glass() { + return left_front_glass; + } + + public void setLeft_front_glass(List<Integer> left_front_glass) { + this.left_front_glass = left_front_glass; + } + + public List<Integer> getLeft_rear_glass() { + return left_rear_glass; + } + + public void setLeft_rear_glass(List<Integer> left_rear_glass) { + this.left_rear_glass = left_rear_glass; + } + + public List<Integer> getLeft_center_glass() { + return left_center_glass; + } + + public void setLeft_center_glass(List<Integer> left_center_glass) { + this.left_center_glass = left_center_glass; + } + + public List<Integer> getRight_front_glass() { + return right_front_glass; + } + + public void setRight_front_glass(List<Integer> right_front_glass) { + this.right_front_glass = right_front_glass; + } + + public List<Integer> getRight_rear_glass() { + return right_rear_glass; + } + + public void setRight_rear_glass(List<Integer> right_rear_glass) { + this.right_rear_glass = right_rear_glass; + } + + public List<Integer> getRight_center_glass() { + return right_center_glass; + } + + public void setRight_center_glass(List<Integer> right_center_glass) { + this.right_center_glass = right_center_glass; + } +} diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java index 7a2a4d5..659e551 100644 --- a/app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java @@ -109,22 +109,28 @@ break; case R.id.exit_sys: - MyDialog myDialog = MyDialog.Companion.newInstance("鎮ㄥ皢閫�鍑虹郴缁�,璇风‘璁ゆ暟鎹凡淇濆瓨"); +// MyDialog myDialog = MyDialog.Companion.newInstance("鎮ㄥ皢閫�鍑虹郴缁�,璇风‘璁ゆ暟鎹凡淇濆瓨"); +// +// myDialog.setOnClick(new MyDialog.MyOnClickListener() { +// @Override +// public void onSure() { +// _mActivity.finish(); +// +// } +// +// @Override +// public void onCancle() { +// +// } +// }); +// +// myDialog.show(getFragmentManager(),"mydialog"); - myDialog.setOnClick(new MyDialog.MyOnClickListener() { - @Override - public void onSure() { - _mActivity.finish(); - - } - - @Override - public void onCancle() { - - } - }); - - myDialog.show(getFragmentManager(),"mydialog"); + JiaXiaoFragment jiaXiaoFragment = findFragment(JiaXiaoFragment.class); + if (jiaXiaoFragment == null) { + jiaXiaoFragment = (JiaXiaoFragment) JiaXiaoFragment.newInstance(); + } + start(jiaXiaoFragment); break; case R.id.system_setting: diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/JiaXiaoFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/JiaXiaoFragment.java index 2c09199..454809f 100644 --- a/app/src/main/java/safeluck/drive/evaluation/fragment/JiaXiaoFragment.java +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/JiaXiaoFragment.java @@ -1,16 +1,71 @@ package safeluck.drive.evaluation.fragment; +import android.graphics.Color; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.esri.arcgisruntime.ArcGISRuntimeEnvironment; +import com.esri.arcgisruntime.arcgisservices.ArcGISMapServiceInfo; +import com.esri.arcgisruntime.data.ServiceFeatureTable; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.PointCollection; +import com.esri.arcgisruntime.geometry.Polygon; +import com.esri.arcgisruntime.geometry.Polyline; +import com.esri.arcgisruntime.geometry.SpatialReference; +import com.esri.arcgisruntime.geometry.SpatialReferences; +import com.esri.arcgisruntime.layers.ArcGISMapImageLayer; +import com.esri.arcgisruntime.layers.ArcGISMapImageSublayer; +import com.esri.arcgisruntime.layers.ArcGISSublayer; +import com.esri.arcgisruntime.layers.ArcGISTiledLayer; +import com.esri.arcgisruntime.layers.ArcGISVectorTiledLayer; +import com.esri.arcgisruntime.layers.FeatureLayer; +import com.esri.arcgisruntime.layers.MobileBasemapLayer; +import com.esri.arcgisruntime.layers.SublayerList; +import com.esri.arcgisruntime.loadable.LoadStatus; +import com.esri.arcgisruntime.loadable.LoadStatusChangedEvent; +import com.esri.arcgisruntime.loadable.LoadStatusChangedListener; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.Viewpoint; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.MapView; +import com.esri.arcgisruntime.portal.Portal; +import com.esri.arcgisruntime.portal.PortalItem; +import com.esri.arcgisruntime.symbology.LineSymbol; +import com.esri.arcgisruntime.symbology.SimpleFillSymbol; +import com.esri.arcgisruntime.symbology.SimpleLineSymbol; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import me.yokeyword.fragmentation.SupportFragment; import safeluck.drive.evaluation.R; +import safeluck.drive.evaluation.app; +import safeluck.drive.evaluation.bean.GisCarModel; +import safeluck.drive.evaluation.util.CThreadPoolExecutor; +import safeluck.drive.evaluation.util.FileUtil; +import safeluck.drive.evaluation.util.Utils; /**椹炬牎淇℃伅UI * MyApplication2 @@ -22,13 +77,344 @@ public static SupportFragment newInstance(){ return new JiaXiaoFragment(); } + private static final String TAG = JiaXiaoFragment.class.getSimpleName(); + private MapView mMapView ; + private static final int MSG_CAR = 100; + double yaw = 0; + + GraphicsOverlay mGraphicsOverlay; + private int count =0; + private double startX = -8647.003,startY = 14590.7213; + private Handler mHandler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case MSG_CAR: + count++; + yaw +=count; + addGraphicLayer(yaw,startX+count,startY+count); + sendEmptyMessageDelayed(MSG_CAR,1000); + break; + } + } + }; + + PointCollection mPointCollection = new PointCollection(SpatialReference.create(4544)); @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.layout_jiaxiao_info,container,false); + View view = inflater.inflate(R.layout.layout_arc_gis,container,false); + mMapView = view.findViewById(R.id.mapView); + setupMap(); + addTrailheadsLayer(); +// addImageLayer(); + + mHandler.sendEmptyMessageDelayed(MSG_CAR,1000); + +// drawPolygon(); return view; } + private SublayerList mSublayersList; + private void setupMap() { + if (mMapView != null) { + ArcGISMap map = new ArcGISMap(); + mMapView.setMap(map); + + mGraphicsOverlay= new GraphicsOverlay(); + mMapView.getGraphicsOverlays().add(mGraphicsOverlay); + + } + } + private void addTrailheadsLayer() { + + + + String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MapServer/"; + ArcGISMapImageLayer arcGISMapImageLayer = new ArcGISMapImageLayer(url); + arcGISMapImageLayer.loadAsync(); + arcGISMapImageLayer.addLoadStatusChangedListener(loadStatusChangedEvent -> { + if (loadStatusChangedEvent.getNewLoadStatus() == LoadStatus.LOADED){ + SublayerList tables = arcGISMapImageLayer.getSublayers(); + + Log.i(TAG,"ServiceFeatureTables size = "+tables.size()); + for (int i = tables.size()-1; i >= 0; i--) { + ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(url+String.valueOf(i)); + + FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable); + ArcGISMap map = mMapView.getMap(); + map.getOperationalLayers().add(featureLayer); + } + } + }); + + + + + + } + + private void addGraphicLayer(double yaw,double x,double y){ + + SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.rgb(232,0,0), 0.5f); + SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,232,0,0), lineSymbol); + PointCollection points = new PointCollection(SpatialReference.create(4544)); + CThreadPoolExecutor.runInBackground(new Runnable() { + @Override + public void run() { + StringBuffer buffer= FileUtil.readAssetTxtFile(app.getAppContext(),"giscar.json"); + Log.i(TAG,"giscar="+buffer.toString()); + GisCarModel gisCarModel= new Gson().fromJson(buffer.toString(),GisCarModel.class); +// List<safeluck.drive.evaluation.bean.Point> carNew=Utils.getCarPoint(0,45,new safeluck.drive.evaluation.bean.Point(-8633.77199999988,14471.793700000271)); + List<safeluck.drive.evaluation.bean.Point> carNew=Utils.getCarPoint(0,yaw,new safeluck.drive.evaluation.bean.Point(x,y)); + List<Integer> bodys =gisCarModel.getBody(); + for (int i = 0; i <bodys.size(); i++) { + Log.i(TAG,String.format("杞﹁韩鐐逛綅缃細%d",bodys.get(i))); + Log.i(TAG,"鏂板潗鏍�"+carNew.get(bodys.get(i)).getX()+" Y="+carNew.get(bodys.get(i)).getY()); + points.add(carNew.get(bodys.get(i)).getX(),carNew.get(bodys.get(i)).getY()); + } + + CThreadPoolExecutor.runOnMainThread(new Runnable() { + @Override + public void run() { + Polygon polygon = new Polygon(points); + + Graphic graphic = new Graphic(polygon,simpleFillSymbol); + mGraphicsOverlay.getGraphics().clear(); + mGraphicsOverlay.getGraphics().add(graphic); + + drawrightCenterGls(gisCarModel,carNew); + + drawPoint(new Point(x,y)); + + } + }); + + + } + + + }); + } + + private void drawPoint(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.WHITE, 5); + + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + mGraphicsOverlay.getGraphics().add(graphic); + } + + private void drawrightCenterGls(GisCarModel gisCarModel, List<safeluck.drive.evaluation.bean.Point> carNew) { + + SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 0.5f); + SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,0,0,0), lineSymbol); + PointCollection points = new PointCollection(SpatialReference.create(4544)); + + drawGlses(carNew, simpleFillSymbol, points, gisCarModel.getRight_center_glass()); + drawGlses(carNew, simpleFillSymbol, points, gisCarModel.getLeft_center_glass()); + + List<Integer> frontCLs = new ArrayList<>(); + frontCLs.addAll(gisCarModel.getLeft_front_glass()); + frontCLs.addAll(gisCarModel.getRight_front_glass()); + drawGlses(carNew, simpleFillSymbol, points, frontCLs); + + frontCLs.clear(); + frontCLs.addAll(gisCarModel.getLeft_rear_glass()); + frontCLs.addAll(gisCarModel.getRight_rear_glass()); + drawGlses(carNew, simpleFillSymbol, points, frontCLs); + + + } + + private void drawGlses(List<safeluck.drive.evaluation.bean.Point> carNew, SimpleFillSymbol simpleFillSymbol, PointCollection points, List<Integer> left_center_glass) { + List<Integer> leftCenterGls = left_center_glass; + points.clear(); + for (int i = 0; i < leftCenterGls.size(); i++) { + int pos = leftCenterGls.get(i); + points.add(carNew.get(pos).getX(), carNew.get(pos).getY()); + + } + + Polygon polygon1 = new Polygon(points); + Graphic graphic1 = new Graphic(polygon1, simpleFillSymbol); + mGraphicsOverlay.getGraphics().add(graphic1); + } + + /** + * 缁樺埗闈� + */ + private void drawPolygon() { +// List<Point> points = new ArrayList<>(); +// points.add(new Point(21.21,21.32, SpatialReference.create("4544"))); +// PointCollection pointCollection = new PointCollection(points); + + mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + + mGraphicsOverlay.getGraphics().clear(); + Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()))); + mPointCollection.add(point); + + Polygon polygon = new Polygon(mPointCollection); + + if (mPointCollection.size() == 1) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol); + mGraphicsOverlay.getGraphics().add(pointGraphic); + } + + SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 3.0f); + SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.parseColor("#33e97676"), lineSymbol); + Graphic graphic = new Graphic(polygon, simpleFillSymbol); + mGraphicsOverlay.getGraphics().add(graphic); + + return super.onSingleTapConfirmed(e); + } + }); + } + + /** + * 缁樺埗鐐� + */ + private void drawPoint() { + mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()))); + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 20); + Graphic graphic = new Graphic(clickPoint, simpleMarkerSymbol); + //娓呴櫎涓婁竴涓偣 + mGraphicsOverlay.getGraphics().clear(); + mGraphicsOverlay.getGraphics().add(graphic); + + //浣跨敤娓叉煋鍣� + // Graphic graphic1 = new Graphic(clickPoint); + // SimpleRenderer simpleRenderer = new SimpleRenderer(simpleMarkerSymbol); + // mGraphicsOverlay.setRenderer(simpleRenderer); + // mGraphicsOverlay.getGraphics().clear(); + // mGraphicsOverlay.getGraphics().add(graphic1); + + return super.onSingleTapConfirmed(e); + } + }); + } + + /** + * 缁樺埗绾� + */ + private void drawPolyline() { + mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()))); + mPointCollection.add(point); + + Polyline polyline = new Polyline(mPointCollection); + + //鐐� + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol); + mGraphicsOverlay.getGraphics().add(pointGraphic); + + //绾� + SimpleLineSymbol simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 3); + Graphic graphic = new Graphic(polyline, simpleLineSymbol); + mGraphicsOverlay.getGraphics().add(graphic); + + return super.onSingleTapConfirmed(e); + } + }); + } + +private void addImageLayer(){ + String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MobileServer"; + // create a MapImageLayer with dynamically generated map images + final ArcGISMapImageLayer mapImageLayer = new ArcGISMapImageLayer(url); +// mapImageLayer.loadAsync(); + // Add a listener that is invoked when layer loading has completed. + mapImageLayer.addDoneLoadingListener(() -> { + if (mapImageLayer.getLoadStatus() == LoadStatus.LOADED) { + ArcGISMapServiceInfo mapServiceInfo = mapImageLayer.getMapServiceInfo(); + + Log.i(TAG, "addImageLayer: 鍔犺浇瀹屾垚銆傘�傘��"); + + // work with map service info here + } + }); + // create an empty map instance + ArcGISMap map = new ArcGISMap(); + // add map image layer as operational layer + map.getOperationalLayers().add(mapImageLayer); + // set the map to be displayed in this view + mMapView.setMap(map); +} + +private void addtiledLayer(){ +// String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MapServer"; + String url = "http://192.168.0.47:6080/arcgis/manager/service.html?name=SampleWorldCities.MapServer"; + // create a MapImageLayer with dynamically generated map images + final ArcGISTiledLayer arcGISTiledLayer = new ArcGISTiledLayer(url); + // Add a listener that is invoked when layer loading has completed. + arcGISTiledLayer.addDoneLoadingListener(() -> { + if (arcGISTiledLayer.getLoadStatus() == LoadStatus.LOADED) { + // work with map service info here + Log.i(TAG,"ArcGISTiledLayer鍔犺浇瀹屾垚"); + } + }); + Basemap basemap = new Basemap(arcGISTiledLayer); + // create a map with the basemap + ArcGISMap arcGISMap = new ArcGISMap(basemap); + // set the map to be displayed in this view + mMapView.setMap(arcGISMap); + +} +private void addVectorTiledLayer(){ + String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MapServer"; + // create a MapImageLayer with dynamically generated map images + final ArcGISVectorTiledLayer mVectorTiledLayer = new ArcGISVectorTiledLayer(url); + // Add a listener that is invoked when layer loading has completed. + mVectorTiledLayer.addDoneLoadingListener(() -> { + if (mVectorTiledLayer.getLoadStatus() == LoadStatus.LOADED) { + // work with map service info here + Log.i(TAG,"ArcGISTiledLayer鍔犺浇瀹屾垚"); + } + }); + Basemap basemap = new Basemap(mVectorTiledLayer); + // create a map with the basemap + ArcGISMap arcGISMap = new ArcGISMap(basemap); + + Viewpoint vp = new Viewpoint(47.606726, -122.335564, 72223.819286); + arcGISMap.setInitialViewpoint(vp); + + // set the map to be displayed in this view + mMapView.setMap(arcGISMap); + +} + + @Override + public void onPause() { + if (mMapView != null) { + mMapView.pause(); + } + super.onPause(); + } + + @Override + public void onResume() { + super.onResume(); + if (mMapView != null) { + mMapView.resume(); + } + } + + @Override + public void onDetach() { + if (mMapView != null) { + mMapView.dispose(); + } + super.onDetach(); + } } diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/VPFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/VPFragment.java index b4725bb..9bdb8f5 100644 --- a/app/src/main/java/safeluck/drive/evaluation/fragment/VPFragment.java +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/VPFragment.java @@ -7,18 +7,13 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.webkit.WebSettings; +import android.webkit.WebView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.anyun.exam.lib.MyLog; -import com.tencent.smtt.export.external.interfaces.SslError; -import com.tencent.smtt.export.external.interfaces.SslErrorHandler; -import com.tencent.smtt.export.external.interfaces.WebResourceRequest; -import com.tencent.smtt.export.external.interfaces.WebResourceResponse; -import com.tencent.smtt.sdk.WebSettings; -import com.tencent.smtt.sdk.WebView; -import com.tencent.smtt.sdk.WebViewClient; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -71,25 +66,7 @@ webSettings.setJavaScriptEnabled(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webView.loadUrl(url); - webView.setWebViewClient(new WebViewClient(){ - @Override - public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { - view.loadUrl(url); - return true; - } - @Override - public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { - super.onReceivedHttpError(view, request, errorResponse); - Log.i(TAG,errorResponse.getReasonPhrase()); - } - - @Override - public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) { - super.onReceivedSslError(webView, sslErrorHandler, sslError); - sslErrorHandler.proceed(); - } - }); return webView; } public static void hookWebView() { diff --git a/app/src/main/java/safeluck/drive/evaluation/util/Utils.java b/app/src/main/java/safeluck/drive/evaluation/util/Utils.java index b7e43f5..2c1ab57 100644 --- a/app/src/main/java/safeluck/drive/evaluation/util/Utils.java +++ b/app/src/main/java/safeluck/drive/evaluation/util/Utils.java @@ -8,6 +8,7 @@ import com.anyun.exam.lib.MyLog; import com.anyun.exam.lib.util.ByteUtil; +import com.google.gson.Gson; import com.safeluck.aykj.utils.BytesUtils; import java.io.File; @@ -37,7 +38,11 @@ import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; +import safeluck.drive.evaluation.app; +import safeluck.drive.evaluation.bean.CarModel; +import safeluck.drive.evaluation.bean.GisCarModel; import safeluck.drive.evaluation.bean.Point; +import safeluck.drive.evaluation.httpmodule.GsonConverterFactory; import static java.lang.Math.cos; import static java.lang.Math.pow; @@ -656,4 +661,84 @@ } } + + + public static List<CarModel> getCarModelData(Point basePoint, List<Integer> axial, List<Point> car){ + List<CarModel> carModelList = new ArrayList<>(); + double C02= (car.get(0).getX()-basePoint.getX())*(car.get(0).getX()-basePoint.getX()) + (car.get(0).getY()-basePoint.getY())*(car.get(0).getY()-basePoint.getY()); + double c0 = Math.sqrt(C02); + CarModel carModel = new CarModel(); + carModel.setDistance(c0); + carModel.setAngle(0.0); + carModelList.add(carModel); + + for (int i = 1; i < car.size(); ++i) { + double dis2 = (car.get(i).getX()-basePoint.getX())*(car.get(i).getX()-basePoint.getX()) + (car.get(i).getY()-basePoint.getY())*(car.get(i).getY()-basePoint.getY()); + double dis = Math.sqrt(dis2); + + CarModel c =new CarModel(); + c.setDistance(dis); + + c.setAngle(180 * Math.acos((dis2 + C02 - ((car.get(i).getX()-car.get(0).getX())*(car.get(i).getX()-car.get(0).getX()) + + (car.get(i).getY()-car.get(0).getY())*(car.get(i).getY()-car.get(0).getY())))/(2*c0*dis)) / Math.PI); + + if (i > axial.get(1)){ + c.setAngle( 360.0 - c.getAngle()); + } + carModelList.add(c); + } + return carModelList; + } + + public static List<Point> getCarPoint(double pitch,double yaw,Point point){ + pitch = 0; +// yaw = 45; + Point main_ant = point; + List<Point> carNew = new ArrayList<>(); + StringBuffer buffer=FileUtil.readAssetTxtFile(app.getAppContext(),"giscar.json"); + Log.i(TAG,"giscar="+buffer.toString()); + GisCarModel gisCarModel= new Gson().fromJson(buffer.toString(),GisCarModel.class); + List<Point> pointList = new ArrayList<Point>() ; + for (int i = 0; i < gisCarModel.getPoint().size(); i++) { + double x= gisCarModel.getPoint().get(i); + i++; + double y= gisCarModel.getPoint().get(i); + pointList.add(new Point(x,y)); + + + + } + double mainAnt_x = gisCarModel.getMain_ant().get(0); + double mainAnt_y = gisCarModel.getMain_ant().get(1); + List<CarModel> carModels = getCarModelData(new Point(mainAnt_x, mainAnt_y),gisCarModel.getAxial(),pointList); + if (carModels != null && carModels.size()>0){ + + for (int i = 0; i < carModels.size(); ++i) { + Log.i(TAG,String.format("浣嶇疆[%d],distance=%f,angle=%f",i,carModels.get(i).getDistance(),carModels.get(i).getAngle())); + double qrx = carModels.get(i).getDistance() * Math.sin(carModels.get(i).getAngle() * Math.PI / 180); + double qry = carModels.get(i).getDistance() * Math.cos(carModels.get(i).getAngle() * Math.PI / 180) * Math.cos(pitch * Math.PI / 180); + + double projectDistance = Math.sqrt(Math.pow(qrx, 2) + Math.pow(qry, 2)); + double projectAngle = Math.acos(qry / projectDistance) * 180 / Math.PI; + + if (carModels.get(i).getAngle() > 180) { + projectAngle = 360 - projectAngle; + } + + double X = + projectDistance * Math.sin(yaw * Math.PI / 180) * Math.cos(projectAngle * Math.PI / 180) - + projectDistance * Math.cos(yaw * Math.PI / 180) * Math.sin(projectAngle * Math.PI / 180) + + main_ant.getX(); + double Y = + projectDistance * Math.sin(yaw * Math.PI / 180) * Math.sin(projectAngle * Math.PI / 180) + + projectDistance * Math.cos(yaw * Math.PI / 180) * Math.cos(projectAngle * Math.PI / 180) + + main_ant.getY(); + carNew.add(new Point(X,Y)); + + } + } + return carNew; + + + } } diff --git a/app/src/main/res/layout/layout_arc_gis.xml b/app/src/main/res/layout/layout_arc_gis.xml new file mode 100644 index 0000000..8f56f7d --- /dev/null +++ b/app/src/main/res/layout/layout_arc_gis.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/activity_main" + android:layout_width="match_parent" + android:layout_height="match_parent" + > + + <com.esri.arcgisruntime.mapping.view.MapView + android:id="@+id/mapView" + android:layout_width="match_parent" + android:layout_height="match_parent" > + </com.esri.arcgisruntime.mapping.view.MapView> +</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_select_dlg.xml b/app/src/main/res/layout/layout_select_dlg.xml index a12674a..088f070 100644 --- a/app/src/main/res/layout/layout_select_dlg.xml +++ b/app/src/main/res/layout/layout_select_dlg.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="210dp" + android:layout_width="220dp" android:layout_height="210dp" android:gravity="center" @@ -13,12 +13,14 @@ android:layout_height="wrap_content" android:textSize="@dimen/network_train_textsize20px" android:textColor="@android:color/white" - android:layout_margin="@dimen/ui_margin_10dp" + android:padding="@dimen/ui_margin_10dp" + android:background="@drawable/bg_select_dlg" android:text="璇烽�夋嫨涓�涓」鐩細"/> <RadioGroup - android:background="@drawable/bg_rgb_dlg" + android:layout_width="match_parent" android:id="@+id/radiogroub" + android:layout_marginRight="@dimen/ui_margin_10dp" android:layout_height="wrap_content"> <RadioButton android:layout_width="match_parent" @@ -39,12 +41,12 @@ </RadioGroup> <Button + android:background="@drawable/bg_select_dlg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/ui_margin_10dp" android:text="纭畾" android:textSize="@dimen/network_train_textsize22px" - android:background="@null" android:textColor="@android:color/white" android:id="@+id/btn_sure_"/> </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/profile_layout.xml b/app/src/main/res/layout/profile_layout.xml index 93d32d4..acb67a2 100644 --- a/app/src/main/res/layout/profile_layout.xml +++ b/app/src/main/res/layout/profile_layout.xml @@ -8,6 +8,7 @@ <LinearLayout android:layout_width="457dp" android:layout_height="105dp" android:orientation="horizontal" + android:layout_weight="3" android:background="@drawable/stu_score_bg" > @@ -69,9 +70,10 @@ </LinearLayout> <LinearLayout android:layout_width="166dp" android:layout_height="105dp" + android:layout_weight="1" android:orientation="vertical" android:id="@+id/view_map" - android:layout_marginLeft="@dimen/ui_margin_10dp" + android:layout_marginLeft="@dimen/ui_margin_35dp" android:background="@drawable/view_map_bg" > <ImageView @@ -96,7 +98,8 @@ <LinearLayout android:layout_width="143dp" android:layout_height="105dp" - android:layout_marginLeft="10dp" + android:layout_weight="1" + android:layout_marginLeft="@dimen/ui_margin_35dp" android:orientation="vertical" > <LinearLayout @@ -130,7 +133,7 @@ /> </LinearLayout> <Button - android:layout_width="match_parent" + android:layout_width="143dp" android:layout_height="match_parent" android:textColor="#ffffff" android:background="@drawable/start_exam_bg" diff --git a/app/src/main/res/values/app_settings.xml b/app/src/main/res/values/app_settings.xml new file mode 100644 index 0000000..9a8f887 --- /dev/null +++ b/app/src/main/res/values/app_settings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="arcgis_license_key">YOUR_LICENSE_KEY</string> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 3267616..0252eb5 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -20,4 +20,5 @@ <dimen name="ui_margin_50dp">50dp</dimen> <dimen name="ui_margin_40dp">40dp</dimen> <dimen name="ui_margin_45dp">45dp</dimen> + <dimen name="ui_margin_35dp">35dp</dimen> </resources> \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5a5a0d6..ee4e1c6 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ jcenter() } + ext{ roomVersion ='2.2.1' workVersion ='2.2.0' @@ -28,6 +29,9 @@ repositories { google() jcenter() + maven { + url 'https://esri.bintray.com/arcgis' + } } } diff --git a/lib/src/main/java/com/anyun/exam/lib/SvrManager.java b/lib/src/main/java/com/anyun/exam/lib/SvrManager.java index f72ef4b..1583bb4 100644 --- a/lib/src/main/java/com/anyun/exam/lib/SvrManager.java +++ b/lib/src/main/java/com/anyun/exam/lib/SvrManager.java @@ -23,6 +23,7 @@ private static final String TAG = "SvrManager"; private MyServiceConn conn; private Intent intent; + private Context mContext; private IAYExamListener mCallback; @@ -55,6 +56,8 @@ } remoteInterface.asBinder().unlinkToDeath(mDeathRecipient,0); remoteInterface = null; + MyLog.i("妫�娴嬪埌杩滅▼鏈嶅姟寮傚父姝讳骸锛岄噸鏂扮粦瀹�"); + bindRemoteService(mContext); } }; @@ -110,6 +113,7 @@ } public void bindRemoteService(Context mContext){ + this.mContext = mContext; intent = new Intent(mContext,RemoteService.class); conn = new MyServiceConn(); mContext.bindService(intent,conn, Context.BIND_AUTO_CREATE); -- Gitblit v1.8.0