Procházet zdrojové kódy

초기 코드 업로드

jglee před 2 roky
rodič
revize
ea7db61ae6
100 změnil soubory, kde provedl 1987 přidání a 0 odebrání
  1. binární
      10_Release/AutoPicture.apk
  2. binární
      10_Release/LogOutputService.apk
  3. binární
      10_Release/ManagerSetting.apk
  4. binární
      10_Release/WallPadAddService.apk
  5. binární
      10_Release/WallPadConfig.apk
  6. binární
      10_Release/WallPadDevService.apk
  7. binární
      10_Release/WallPadEmergency.apk
  8. binární
      10_Release/WallPadEnergyCtrl.apk
  9. binární
      10_Release/WallPadGlobalButton.apk
  10. binární
      10_Release/WallPadGlobalScreen.apk
  11. binární
      10_Release/WallPadHomeCtrl.apk
  12. binární
      10_Release/WallPadKeyBoard.apk
  13. binární
      10_Release/WallPadMain.apk
  14. binární
      10_Release/WallPadOutModeRun.apk
  15. binární
      10_Release/WallPadSecurity.apk
  16. 80 0
      AutoPicture/build.gradle
  17. binární
      AutoPicture/libs/WallPadAPI.jar
  18. binární
      AutoPicture/libs/WallPadSupport.jar
  19. binární
      AutoPicture/src/debug/ic_launcher-web.png
  20. binární
      AutoPicture/src/debug/res/mipmap-hdpi/ic_launcher.png
  21. binární
      AutoPicture/src/debug/res/mipmap-mdpi/ic_launcher.png
  22. binární
      AutoPicture/src/debug/res/mipmap-xhdpi/ic_launcher.png
  23. binární
      AutoPicture/src/debug/res/mipmap-xxhdpi/ic_launcher.png
  24. binární
      AutoPicture/src/debug/res/mipmap-xxxhdpi/ic_launcher.png
  25. 28 0
      AutoPicture/src/main/AndroidManifest.xml
  26. binární
      AutoPicture/src/main/ic_launcher-web.png
  27. 915 0
      AutoPicture/src/main/java/kr/co/icontrols/autopicture/MainActivity.java
  28. 397 0
      AutoPicture/src/main/java/kr/co/icontrols/v40ioctl/V40IF.java
  29. 29 0
      AutoPicture/src/main/java/kr/co/icontrols/v40ioctl/V40IOInterface.java
  30. 201 0
      AutoPicture/src/main/java/kr/co/icontrols/v40ioctl/V40IOInterface2.java
  31. binární
      AutoPicture/src/main/jniLibs/armeabi-v7a/libgle.so
  32. binární
      AutoPicture/src/main/jniLibs/armeabi-v7a/libserial_port.so
  33. binární
      AutoPicture/src/main/jniLibs/armeabi-v7a/libwpd_a20interface-jni.so
  34. binární
      AutoPicture/src/main/jniLibs/armeabi-v7a/libwpd_v40interface-jni.so
  35. binární
      AutoPicture/src/main/jniLibs/armeabi-v7a/libwpd_v40interface2-jni.so
  36. binární
      AutoPicture/src/main/jniLibs/armeabi-v7a/libwpddevctr.so
  37. binární
      AutoPicture/src/main/jniLibs/armeabi/libgle.so
  38. binární
      AutoPicture/src/main/jniLibs/armeabi/libserial_port.so
  39. binární
      AutoPicture/src/main/jniLibs/armeabi/libwpd_a20interface-jni.so
  40. binární
      AutoPicture/src/main/jniLibs/armeabi/libwpd_v40interface-jni.so
  41. binární
      AutoPicture/src/main/jniLibs/armeabi/libwpd_v40interface2-jni.so
  42. binární
      AutoPicture/src/main/jniLibs/armeabi/libwpddevctr.so
  43. 8 0
      AutoPicture/src/main/res/anim/anim_in.xml
  44. 8 0
      AutoPicture/src/main/res/anim/anim_in_downup.xml
  45. 8 0
      AutoPicture/src/main/res/anim/anim_in_updown.xml
  46. 8 0
      AutoPicture/src/main/res/anim/anim_out.xml
  47. 8 0
      AutoPicture/src/main/res/anim/anim_out_downup.xml
  48. 8 0
      AutoPicture/src/main/res/anim/anim_out_updown.xml
  49. binární
      AutoPicture/src/main/res/drawable-hdpi/ic_launcher.png
  50. binární
      AutoPicture/src/main/res/drawable-mdpi/bg_popupalarm.png
  51. binární
      AutoPicture/src/main/res/drawable-mdpi/but_ok.png
  52. binární
      AutoPicture/src/main/res/drawable-mdpi/but_ok_p.png
  53. binární
      AutoPicture/src/main/res/drawable-mdpi/but_popup_cancel.png
  54. binární
      AutoPicture/src/main/res/drawable-mdpi/but_popup_cancel_p.png
  55. binární
      AutoPicture/src/main/res/drawable-mdpi/ic_launcher.png
  56. binární
      AutoPicture/src/main/res/drawable-mdpi/icon_recording.png
  57. binární
      AutoPicture/src/main/res/drawable-xhdpi/ic_launcher.png
  58. binární
      AutoPicture/src/main/res/drawable-xxhdpi/ic_launcher.png
  59. 17 0
      AutoPicture/src/main/res/layout/activity_main.xml
  60. 9 0
      AutoPicture/src/main/res/menu/main.xml
  61. binární
      AutoPicture/src/main/res/mipmap-hdpi/ic_launcher.png
  62. binární
      AutoPicture/src/main/res/mipmap-mdpi/ic_launcher.png
  63. binární
      AutoPicture/src/main/res/mipmap-xhdpi/ic_launcher.png
  64. binární
      AutoPicture/src/main/res/mipmap-xxhdpi/ic_launcher.png
  65. binární
      AutoPicture/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  66. 8 0
      AutoPicture/src/main/res/values-sw600dp/dimens.xml
  67. 9 0
      AutoPicture/src/main/res/values-sw720dp-land/dimens.xml
  68. 11 0
      AutoPicture/src/main/res/values-v11/styles.xml
  69. 12 0
      AutoPicture/src/main/res/values-v14/styles.xml
  70. 7 0
      AutoPicture/src/main/res/values/dimens.xml
  71. 8 0
      AutoPicture/src/main/res/values/strings.xml
  72. 26 0
      AutoPicture/src/main/res/values/styles.xml
  73. binární
      AutoPicture/src/release/hdc_icon-web.png
  74. binární
      AutoPicture/src/release/ic_launcher-web.png
  75. binární
      AutoPicture/src/release/res/mipmap-hdpi/hdc_icon.png
  76. binární
      AutoPicture/src/release/res/mipmap-hdpi/ic_launcher.png
  77. binární
      AutoPicture/src/release/res/mipmap-mdpi/hdc_icon.png
  78. binární
      AutoPicture/src/release/res/mipmap-mdpi/ic_launcher.png
  79. binární
      AutoPicture/src/release/res/mipmap-xhdpi/hdc_icon.png
  80. binární
      AutoPicture/src/release/res/mipmap-xhdpi/ic_launcher.png
  81. binární
      AutoPicture/src/release/res/mipmap-xxhdpi/hdc_icon.png
  82. binární
      AutoPicture/src/release/res/mipmap-xxhdpi/ic_launcher.png
  83. binární
      AutoPicture/src/release/res/mipmap-xxxhdpi/hdc_icon.png
  84. binární
      AutoPicture/src/release/res/mipmap-xxxhdpi/ic_launcher.png
  85. binární
      HDC_HN_RELEASE_KEY.jks
  86. 88 0
      LogOutputService/build.gradle
  87. binární
      LogOutputService/libs/WallPadAPI.jar
  88. binární
      LogOutputService/libs/WallPadAPIforSVC.jar
  89. binární
      LogOutputService/libs/WallPadSupport.jar
  90. 28 0
      LogOutputService/src/main/AndroidManifest.xml
  91. binární
      LogOutputService/src/main/ic_launcher-web.png
  92. 66 0
      LogOutputService/src/main/java/com/artncore/apps/ic_wallpad/service/log/LogOutputService.java
  93. binární
      LogOutputService/src/main/res/drawable-hdpi/ic_launcher.png
  94. binární
      LogOutputService/src/main/res/drawable-mdpi/ic_launcher.png
  95. binární
      LogOutputService/src/main/res/drawable-xhdpi/ic_launcher.png
  96. binární
      LogOutputService/src/main/res/mipmap-hdpi/ic_launcher.png
  97. binární
      LogOutputService/src/main/res/mipmap-mdpi/ic_launcher.png
  98. binární
      LogOutputService/src/main/res/mipmap-xhdpi/ic_launcher.png
  99. binární
      LogOutputService/src/main/res/mipmap-xxhdpi/ic_launcher.png
  100. binární
      LogOutputService/src/main/res/mipmap-xxxhdpi/ic_launcher.png

binární
10_Release/AutoPicture.apk


binární
10_Release/LogOutputService.apk


binární
10_Release/ManagerSetting.apk


binární
10_Release/WallPadAddService.apk


binární
10_Release/WallPadConfig.apk


binární
10_Release/WallPadDevService.apk


binární
10_Release/WallPadEmergency.apk


binární
10_Release/WallPadEnergyCtrl.apk


binární
10_Release/WallPadGlobalButton.apk


binární
10_Release/WallPadGlobalScreen.apk


binární
10_Release/WallPadHomeCtrl.apk


binární
10_Release/WallPadKeyBoard.apk


binární
10_Release/WallPadMain.apk


binární
10_Release/WallPadOutModeRun.apk


binární
10_Release/WallPadSecurity.apk


+ 80 - 0
AutoPicture/build.gradle

@@ -0,0 +1,80 @@
+// This buildscript{} block configures the code driving the build
+buildscript {
+    /**
+     * The nested repositories{} block declares that this build uses the
+     * jcenter repository.
+     */
+    repositories {
+        jcenter()
+        google()
+    }
+
+    /**
+     * This block declares a dependency on the 2.3.3 version
+     * of the Gradle plugin for the buildscript.
+     */
+    dependencies {
+        classpath 'com.android.tools.build:gradle:4.1.1'
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+        google()
+    }
+}
+
+apply plugin: 'com.android.application'
+
+android {
+    lintOptions {
+        disable "ResourceType"
+        checkReleaseBuilds false
+    }
+
+    compileSdkVersion 28
+
+    signingConfigs {
+        config {
+            keyAlias 'HDC_HN_RELEASE_KEY'
+            keyPassword 'hdchnsys1776'
+            storeFile file('../HDC_HN_RELEASE_KEY.jks')
+            storePassword 'hdchnsys1776'
+        }
+    }
+
+    defaultConfig {
+        applicationId "kr.co.icontrols.autopicture"
+        minSdkVersion 17
+        targetSdkVersion 17
+    }
+
+    applicationVariants.all { variant ->
+        variant.outputs.all { output ->
+            outputFileName = new File("../", "AutoPicture.apk");
+        }
+    }
+
+    buildTypes {
+        release {
+            signingConfig signingConfigs.config
+//            minifyEnabled true
+//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+        release_secured {
+            signingConfig signingConfigs.config
+            minifyEnabled true
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+        debug {
+            signingConfig signingConfigs.config
+        }
+    }
+}
+
+dependencies {
+    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+    implementation files('libs/WallPadAPI.jar')
+    implementation files('libs/WallPadSupport.jar')
+}

binární
AutoPicture/libs/WallPadAPI.jar


binární
AutoPicture/libs/WallPadSupport.jar


binární
AutoPicture/src/debug/ic_launcher-web.png


binární
AutoPicture/src/debug/res/mipmap-hdpi/ic_launcher.png


binární
AutoPicture/src/debug/res/mipmap-mdpi/ic_launcher.png


binární
AutoPicture/src/debug/res/mipmap-xhdpi/ic_launcher.png


binární
AutoPicture/src/debug/res/mipmap-xxhdpi/ic_launcher.png


binární
AutoPicture/src/debug/res/mipmap-xxxhdpi/ic_launcher.png


+ 28 - 0
AutoPicture/src/main/AndroidManifest.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="kr.co.icontrols.autopicture"
+    android:versionCode="17"
+    android:versionName="2021.06.04.01">
+
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:name="kr.co.icontrols.autopicture.MainActivity"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+    </application>
+
+</manifest>

binární
AutoPicture/src/main/ic_launcher-web.png


+ 915 - 0
AutoPicture/src/main/java/kr/co/icontrols/autopicture/MainActivity.java

@@ -0,0 +1,915 @@
+package kr.co.icontrols.autopicture;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import com.artncore.WallPadDataMgr.WallpadStatusData;
+import com.artncore.commons.define;
+import com.util.LogUtil;
+//import com.util.LogUtil;
+
+import android.Manifest;
+import android.content.pm.PackageManager;
+import android.graphics.Matrix;
+import android.graphics.drawable.BitmapDrawable;
+import android.media.ExifInterface;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.Point;
+import android.util.Log;
+import android.view.Display;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.view.WindowManager;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageView;
+import android.widget.ViewFlipper;
+
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+
+import kr.co.icontrols.v40ioctl.V40IF;
+import kr.co.icontrols.wallpadsupport.Version;
+
+/**
+ * @description App 시작 방법<br>
+ * Intent intent = new Intent(Intent.ACTION_MAIN);<br>
+ * intent.setComponent(new ComponentName("kr.co.icontrols.autopicture",
+ * "kr.co.icontrols.autopicture.MainActivity"));<br>
+ * intent.putExtra("IMAGE_NEXTSHOW_TIME_UNIT_SEC", AUTOPIC_SETTING_VALUE_SEC);<br>
+ * intent.putExtra("IMAGE_NEXTSHOW_ANIMATION", AUTOPIC_SETTING_VALUE_TYPE);     <br>
+ * startActivity(intent);<br><br>
+ * $AUTOPIC_SETTING_VALUE_SEC 은 이미지 전환 기준 초수<br>
+ * $AUTOPIC_SETTING_VALUE_TYPE 은 이미지 전환 에니메이션 효과<br>
+ * &nbsp&nbsp$$1. 그 자리에서 서서히 사라지기<br>
+ * &nbsp&nbsp$$2. 왼쪽에서 오른쪽으로<br>
+ * &nbsp&nbsp$$3. 아래에서 위로 <br>
+ * &nbsp&nbsp$$4. 위에서 아래로<br><br>
+ * App 종료 방법<br>
+ * Intent intent = new Intent();<br>
+ * intent.setAction("kr.co.icontrols.autopicture.BR_APP_FINISH");<br>
+ * sendBroadcast(intent);<br>
+ */
+public class MainActivity extends Activity implements OnTouchListener {
+
+    private final static String TAG = "AutoPictureApp";
+
+    private final boolean DEBUG_LOG_ON = true;
+
+    private void DebugLogOutput(String s) {
+        if (DEBUG_LOG_ON) Log.d(TAG, s);
+    }
+
+    //[DB]
+    WallpadStatusData DBMGR;
+
+    //[Time]
+    Calendar mCal;
+
+    // [Show Picture]
+    ViewFlipper mFlipper;
+
+    ImageView View0;
+    ImageView View1;
+
+    Bitmap mPhotoBitmapNext;
+    Bitmap mPhotoBitmapCenter;
+
+    int mIntCenter;
+    int mIndexOfFillpper = 0;
+
+    List<String> filesList = new ArrayList<String>();
+
+    CounterDown timerAutoPicture = null;
+    TimerAutoPictureChanger mTimerAutoPictureChanger = null;
+
+    int AnimationSec;
+    int AnimationType;
+    boolean isTestShow = false;
+
+    int displayWidth;
+    int displayHeight;
+
+    Boolean PictureMorethanZero = false;
+    private BroadcastReceiver mWpadNotifyBR = null;
+    private final String BR_APP_FINISH = "kr.co.icontrols.wallpad.BR_APP_FINISH";
+
+    V40IF mV40IF;
+
+    // PopupActivityRun
+    private static boolean PopupActivityRun = false;
+
+    public static boolean getPopupActivityRun() {
+        return PopupActivityRun;
+    }
+
+    public static void setPopupActivityRun(boolean run) {
+        PopupActivityRun = run;
+    }
+
+    private static final int REQUEST_EXTERNAL_STORAGE = 100;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        PopupActivityRun = false;
+
+        Log.d(TAG, "[START - AutoPictureApp] --------------------------------------------");
+        if (Version.getPlatformType() == Version.PLATFORM_TYPE.A40i) mV40IF = new V40IF();
+        else Log.w(TAG, "[onCreate] Not Supported PLATFORM_TYPE [" + Version.getPlatformType() + "]");
+
+        // 9. Check Permission
+        DebugLogOutput("[Create] - Step1 : Permission Check");
+        boolean hasPermission = (ContextCompat.checkSelfPermission(this,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
+        Log.d(TAG, "[onCreate] hasPermission: " + hasPermission);
+        if (!hasPermission) {
+            LogUtil.SetConsole();
+        }
+
+        Intent intent = getIntent();
+        if (intent != null) {
+            AnimationSec = intent.getIntExtra("IMAGE_NEXTSHOW_TIME_UNIT_SEC", -1);
+            if (AnimationSec < 0) {
+                AnimationSec = 5;
+            }
+            AnimationType = intent.getIntExtra("IMAGE_NEXTSHOW_ANIMATION", -1);
+            if (AnimationType < 0) {
+                AnimationType = 1;
+            }
+            isTestShow = intent.getBooleanExtra("TEST_SHOW", false);
+            Log.d(TAG, "isTestShow : " + isTestShow);
+            if (isTestShow == true) {
+                ctrlLCDOnOff(true);
+            }
+        }
+
+        ctrlLCDOnOff(true);
+
+        DBMGR = new WallpadStatusData(getApplicationContext());
+        mCal = Calendar.getInstance();
+
+        mWpadNotifyBR = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                Log.d(TAG, "Receive BR " + intent.getAction());
+                String ActionName = intent.getAction();
+                if (ActionName.equals(BR_APP_FINISH)) {
+                    Log.i(TAG, "AutoPicture finish - BR_APP_FINISH");
+                    finish();
+                } else BrReceive(intent);
+            }
+        };
+
+        IntentFilter filter = new IntentFilter(BR_APP_FINISH);
+        registerReceiver(mWpadNotifyBR, filter);
+
+        Display display = getWindowManager().getDefaultDisplay();
+        Point size = new Point();
+        display.getSize(size);
+
+        displayWidth = size.x;
+        displayHeight = size.y;
+
+        //사진 표시
+        mFlipper = new ViewFlipper(this);
+        mFlipper.setBackgroundColor(Color.BLACK);
+
+        View0 = new ImageView(this);
+        View1 = new ImageView(this);
+
+        File dirUsb = new File("/storage/usb0");
+        File dirInternal = new File(define.ALBUM_PICTURE_LOCATION);
+        if (!dirInternal.isDirectory()) dirInternal.mkdir();
+
+        try {
+            if (dirInternal.isDirectory()) {
+                Log.d(TAG, dirInternal + " is Directory!!");
+                printfiles(dirInternal);
+            }
+            printfiles(dirUsb);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, e.toString());
+        }
+        if (filesList.size() != 0) {
+            PictureMorethanZero = true;
+            mIntCenter = 0;
+            File FileCenter = new File(filesList.get(mIntCenter));
+            mPhotoBitmapCenter = decodeFile(FileCenter, displayWidth, displayHeight);
+
+            if (mPhotoBitmapCenter == null) {
+                Log.w(TAG, "[onCreate] mPhotoBitmapCenter is null");
+                PictureMorethanZero = false;
+                setAutoPictureAnimation(AnimationType);
+                startAutoPictureTimeThread();
+//                SetInfoFromMainUI(1, 1);
+//                timerAutoPicture.start();
+
+                setContentView(mFlipper);
+            }
+
+            View0.setImageBitmap(mPhotoBitmapCenter);
+            View0.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+            mFlipper.addView(View0);
+            mPhotoBitmapCenter = null;
+
+            Log.i(TAG, "[onCreate] AnimationSec [" + AnimationSec + "], AnimationType [" + AnimationType + "]");
+            setAutoPictureAnimation(AnimationType);
+            startAutoPictureTimeThread();
+
+//            SetInfoFromMainUI(AnimationSec, AnimationType);
+//            timerAutoPicture.start();
+
+            setContentView(mFlipper);
+            mFlipper.setOnTouchListener((OnTouchListener) this);
+        }
+        else {
+            Log.d(TAG, "[Finish!! (There is no Picture) - AutoPictureApp] --------------------------------------------");
+            PictureMorethanZero = false;
+            setAutoPictureAnimation(AnimationType);
+            startAutoPictureTimeThread();
+//            SetInfoFromMainUI(1, 1);
+//            timerAutoPicture.start();
+
+            setContentView(mFlipper);
+        }
+    }
+
+
+    /**
+     * 실제 Permission에 대한 체크가 필요
+     * @param requestCode
+     * @param permissions
+     * @param grantResults
+     */
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+        Log.d(TAG, "[onRequestPermissionsResult] requestCode: " + requestCode);
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        switch (requestCode) {
+            case REQUEST_EXTERNAL_STORAGE: {
+                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    Log.d(TAG, "[onRequestPermissionsResult] PERMISSION_GRANTED");
+                } else {
+                    Log.d(TAG, "[onRequestPermissionsResult] PERMISSION_NOT_GRANTED");
+                }
+                return;
+            }
+        }
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        Log.d(TAG, "[onDestroy] ========== AutoPictureApp ==========");
+        stopAutoPictureTimeThread();
+//        timerAutoPicture.cancel();
+
+        if (DBMGR != null) DBMGR.closeDB();
+
+        // 1. 등록된 ActionFilter 일괄 해제
+        unregisterReceiver(mWpadNotifyBR);
+
+        ctrlLCDOnOff(false);
+
+        if (mPhotoBitmapNext != null) {
+            mPhotoBitmapNext.recycle();
+            mPhotoBitmapNext = null;
+        }
+        if (mPhotoBitmapCenter != null) {
+            mPhotoBitmapCenter.recycle();
+            mPhotoBitmapCenter = null;
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.d(TAG, "[onResume] ========== AutoPictureApp ==========");
+//        ctrlLCDOnOff(true);
+    }
+
+    /**
+     * onPause<br>
+     */
+    @Override
+    protected void onPause() {
+        super.onPause();
+        Log.d(TAG, "[onPause] ========== AutoPictureApp ==========");
+//        stopAutoPictureTimeThread();
+//        timerAutoPicture.cancel();
+        overridePendingTransition(0, 0);        // 종료시 에니메이션 효과 삭제
+        ctrlLCDOnOff(false);
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        Log.d(TAG, "[finish] ========== AutoPictureApp ==========");
+        stopAutoPictureTimeThread();
+//        timerAutoPicture.cancel();
+        ctrlLCDOnOff(false);
+        Intent intent = new Intent();
+        intent.putExtra("Finish_Kind", "HomeButton");
+        setResult(RESULT_OK, intent);
+
+        sendFinishBR();
+    }
+
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+
+        if (v != mFlipper)
+            return false;
+
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+
+        } else if (event.getAction() == MotionEvent.ACTION_UP) {
+            ctrlLCDOnOff(true);
+            finish();
+        }
+        return true;
+    }
+
+    // =================================================================================================
+    // [[ BroadcastReceiver ]] region
+    // =================================================================================================
+    protected void onBrReceive(Intent intent) {
+    }
+
+    /**
+     * BrReceive
+     *
+     * @param intent - onReceive 시 수신받은 intent
+     */
+    private void BrReceive(Intent intent) {
+        try {
+            onBrReceive(intent);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[ExceptionError] - onBrReceive : " + e);
+        }
+    }
+
+    private void sendFinishBR() {
+        try {
+            // 상태가 변경되었다면 상태 변경 BR을 송신한다.
+            Intent notiIntent = new Intent();
+            notiIntent.setAction(define.NOTIFY_ACNAME);
+            notiIntent.putExtra(define.NOTIBR_KIND, define.NOTIFY_AUTOPICTURE_FINISH);
+            getApplicationContext().sendBroadcast(notiIntent);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] sendFinishBR()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    private void setAutoPictureAnimation(int nAniType) {
+        try {
+            Log.d(TAG, "[setAutoPictureAnimation] nAniType [" + nAniType + "]");
+            switch (AnimationType) {
+                case 1:  //그 자리에서 서서히 사라지기
+                default:
+                    mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
+                    mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
+                    break;
+
+                case 2:  //왼쪽에서 오른쪽으로
+                    mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_in));
+                    mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_out));
+                    break;
+
+                case 3:  //아래에서 위로
+                    mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_in_downup));
+                    mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_out_downup));
+                    break;
+
+                case 4:  //위에서 아래로
+                    mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_in_updown));
+                    mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_out_updown));
+                    break;
+            }
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] setAutoPictureAnimation(int nAniType)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    boolean bAutoPictureTimerRun = false;
+    class TimerAutoPictureChanger extends Thread {
+        int nSec = 5;
+
+        public TimerAutoPictureChanger(int nChangeSec) {
+            nSec = nChangeSec;
+        }
+
+        @Override
+        public void run() {
+            super.run();
+            try {
+                int sec = nSec;
+                Log.d(TAG, "[TimerAutoPictureChanger.run()] bAutoPictureTimerRun [" + bAutoPictureTimerRun + "], PictureMorethanZero [" + PictureMorethanZero + "], sec [" + sec + "]");
+                while (bAutoPictureTimerRun && PictureMorethanZero) {
+                    if (sec > 0) {
+//                        Log.d(TAG, "[TimerAutoPictureChanger.run()] sec [" + sec +"]");
+                        sec--;
+                    }
+                    else {
+                        if (isTestShow == false) {
+                            mCal = Calendar.getInstance();
+                            if (DBMGR.DecideAutoPictureAppEndOrNot(mCal) == true) {
+                                Log.d(TAG, "[TimerAutoPictureChanger.run()] DecideAutoPictureAppEndOrNot(mCal) == true");
+                                Log.d(TAG, "[TimerAutoPictureChanger.run()] LCD will be Off!!!");
+                                bAutoPictureTimerRun = false;
+                                ctrlLCDOnOff(false);
+                            }
+                        }
+
+                        Log.d(TAG, "[TimerAutoPictureChanger.run()] Show the next picture!!");
+                        sec = nSec;
+                        sendHandlerMsg(HANDLERMSG.SHOW_NEXT_PICTURE, 0, 0);
+                    }
+//                    Log.d(TAG, "[TimerAutoPictureChanger.run()] 1 bAutoPictureTimerRun [" + bAutoPictureTimerRun + "], PictureMorethanZero [" + PictureMorethanZero + "], sec [" + sec + "]");
+                    Thread.sleep(1000);
+                }
+//                Log.d(TAG, "[TimerAutoPictureChanger.run()] 2 bAutoPictureTimerRun [" + bAutoPictureTimerRun + "], PictureMorethanZero [" + PictureMorethanZero + "], sec [" + sec + "]");
+                Log.d(TAG, "[TimerAutoPictureChanger.run()] TimerAutoPictureChanger is end!!!");
+            } catch (RuntimeException re) {
+                LogUtil.errorLogInfo("", TAG, re);
+            } catch (Exception e) {
+                Log.e(TAG, "[Exception] TimerAutoPictureChanger.run()");
+                //e.printStackTrace();
+                LogUtil.errorLogInfo("", TAG, e);
+            }
+            finish();
+        }
+    }
+
+    private void startAutoPictureTimeThread() {
+        try {
+            bAutoPictureTimerRun = true;
+            mTimerAutoPictureChanger = new TimerAutoPictureChanger(AnimationSec);
+            mTimerAutoPictureChanger.start();
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] startAutoPictureTimeThread()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    private void stopAutoPictureTimeThread() {
+        try {
+            Log.w(TAG, "[stopAutoPictureTimeThread] ===== START =====");
+            if (mTimerAutoPictureChanger != null) {
+                Log.w(TAG, "[stopAutoPictureTimeThread] Stop mTimerAutoPictureChanger!!");
+                bAutoPictureTimerRun = false;
+                mTimerAutoPictureChanger = null;
+            }
+            else {
+                Log.w(TAG, "[stopAutoPictureTimeThread] mTimerAutoPictureChanger is null!!");
+            }
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] stopAutoPictureTimeThread()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+
+
+
+    private void SetInfoFromMainUI(int Sec, int AnimationType) {
+        Log.d(TAG, "[SetInfoFromMainUI] Sec [" + Sec + "], AnimationType [" + AnimationType + "]");
+        timerAutoPicture = new CounterDown((long) (Sec * 1000), 1000); // 1초 = 1000, 1분 = 60000
+
+        switch (AnimationType) {
+            case 1:  //그 자리에서 서서히 사라지기
+                mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
+                mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
+                break;
+
+            case 2:  //왼쪽에서 오른쪽으로
+                mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_in));
+                mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_out));
+                break;
+
+            case 3:  //아래에서 위로
+                mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_in_downup));
+                mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_out_downup));
+                break;
+
+            case 4:  //위에서 아래로
+                mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_in_updown));
+                mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.anim_out_updown));
+                break;
+
+            default:
+                mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
+                mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
+                break;
+        }
+    }
+
+    public class CounterDown extends CountDownTimer {
+
+        public CounterDown(long millisInFuture, long countDownInterval) {
+            super(millisInFuture, countDownInterval);
+            Log.d(TAG, "[timerAutoPicture] millisInFuture [" + millisInFuture + "], countDownInterval [" + countDownInterval + "]");
+        }
+
+        @Override
+        public void onFinish() {
+            if (PictureMorethanZero == false) {
+                finish();
+            }
+            else {
+                Log.d(TAG, "[timerAutoPicture.onFinish()] The timer expired!! Show the next picture!!");
+                mCal = Calendar.getInstance();
+
+                if (isTestShow == false) {
+                    if (DBMGR.DecideAutoPictureAppEndOrNot(mCal) == true) {
+                        Log.d(TAG, "[timerAutoPicture.onFinish()] DecideAutoPictureAppEndOrNot(mCal) == true");
+                        Log.d(TAG, "[timerAutoPicture.onFinish()] LCD will be Off!!!");
+                        ctrlLCDOnOff(false);
+                    }
+                }
+                ShowNextImage();
+                timerAutoPicture.start();
+            }
+        }
+
+        @Override
+        public void onTick(long millisUntilFinished) {
+            Log.d(TAG, "[timerAutoPicture.onTick(...)] Remain time(sec) [" + (millisUntilFinished/1000) + "]");
+        }
+    }
+
+    /**
+     * @description USB에 있는 이미지 파일의 목록을 생성하는 함수<br>
+     * 재귀함수로써 모든 폴더를 탐색한다.<br>
+     * USB와 Storage/Bestin/DownloadPicture 내에 있는 파일의 확장자를 검사<br>
+     * 파일 포맷 : jpg, JPG, jpeg, JPEG, png, PNG, bmp, BMP 지원
+     */
+    public void printfiles(File file) {
+        File[] list = file.listFiles();
+//        Log.d(TAG, "[printfiles] list.length: " + list.length);
+
+        if (list == null) {
+            Log.d(TAG, "No File in " + file.getPath());
+            return;
+        }
+        for (int i = 0; i < list.length; i++) {
+            File temp_file = new File(file.getAbsolutePath(), list[i].getName());
+            if (!temp_file.isDirectory()) temp_file.mkdir();
+            if (temp_file.isDirectory() && temp_file.listFiles() != null) {
+                Log.d(TAG, "PATH folder" + temp_file.getAbsolutePath());
+                //I am inside The Directory... Searching:) So i am calling printfiles(File file) function to print the files in the directory
+                printfiles(temp_file);
+            } else {
+                String filename = temp_file.getName();
+                boolean isAccept = false;
+
+                if (filename.toLowerCase().endsWith(".jpg") == true) {
+                    isAccept = true;
+                } else if (filename.toLowerCase().endsWith(".jpeg") == true) {
+                    isAccept = true;
+                } else if (filename.toLowerCase().endsWith(".png") == true) {
+                    isAccept = true;
+                } else if (filename.toLowerCase().endsWith(".bmp") == true) {
+                    isAccept = true;
+                } else {
+                    isAccept = false;
+                }
+
+                if (isAccept == true) {
+                    filesList.add(temp_file.getAbsolutePath());
+                    DebugLogOutput("PATH file" + temp_file.getAbsolutePath());
+                }
+            }
+        }
+    }
+
+    /**
+     * @description 다음 이미지 보여주기 <br>
+     */
+    public void ShowNextImage() {
+        if (mFlipper.getCurrentView() == View0) {
+            LoadNextImage(View1);
+            mFlipper.showNext();
+            mFlipper.removeView(View0);
+        } else if (mFlipper.getCurrentView() == View1) {
+            LoadNextImage(View0);
+            mFlipper.showNext();
+            mFlipper.removeView(View1);
+        }
+    }
+
+    /**
+     * @description Next 이미지 로드<br>
+     */
+    public void LoadNextImage(View v) {
+        mIntCenter++;
+        if (mIntCenter == filesList.size()) {
+            mIntCenter = 0;
+        }
+
+        Log.w(TAG, "[LoadNextImage] filesList.get(mIntCenter) = " + filesList.get(mIntCenter));
+        File TempFileNext = new File(filesList.get(mIntCenter));
+        mPhotoBitmapNext = decodeFile(TempFileNext, displayWidth, displayHeight);
+        if (mPhotoBitmapNext == null) {
+            Log.w(TAG, "[LoadNextImage] mPhotoBitmapNext is null");
+            ctrlLCDOnOff(true);
+            finish();
+        }
+        ((ImageView) v).setImageBitmap(mPhotoBitmapNext);
+        ((ImageView) v).setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+        mFlipper.addView(v);
+        mPhotoBitmapNext = null;
+    }
+
+    /**
+     * @description 사진 미리보기 화면에 표시될 이미지 크기 기반으로 이미지 스케일 및 샘플 사이즈를 조정
+     */
+    public static Bitmap decodeFile(File f, int reqWidth, int reqHeight) {
+        FileInputStream is = null;
+        FileInputStream is_ = null;
+        try {
+            // First decode with inJustDecodeBounds=true to check dimensions
+            final BitmapFactory.Options options = new BitmapFactory.Options();
+            options.inJustDecodeBounds = true;
+            is_ = new FileInputStream(f);
+            BitmapFactory.decodeStream(is_, null, options);
+
+            if (options.outMimeType == null) {
+                Log.e("[AutoPicture]", "[decodeStream] options.outMimeType is null");
+                int pos = f.getAbsoluteFile().toString().lastIndexOf(".");
+                String ext = f.getAbsoluteFile().toString().substring(pos + 1);
+                Log.d("[AutoPicture]", "[decodeStream] ext [" + ext + "]");
+                if (!ext.equalsIgnoreCase("bmp")) return null; // bmp파일은 options.outMimeType == null이므로
+            } else {
+                Log.d("[AutoPicture]", "[decodeStream] options.outMimeType [" + options.outMimeType + "]");
+            }
+
+            // Calculate inSampleSize
+            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
+//            Log.d("[AutoPicture]", "[decodeStream] options.inSampleSize [" + options.inSampleSize + "]");
+
+            // Decode bitmap with inSampleSize set
+            options.inJustDecodeBounds = false;
+//            Log.d("[AutoPicture]", "[decodeStream] options.inJustDecodeBounds [" + options.inJustDecodeBounds + "]");
+
+            is = new FileInputStream(f);
+            Bitmap bitmap = BitmapFactory.decodeStream(is , null, options);
+            int degree = GetExifOrientation(f.getAbsolutePath());
+            Bitmap temp_bitmap = GetRotatedBitmap(bitmap, degree);
+            return temp_bitmap;
+        } catch (FileNotFoundException e) {
+            // TODO Auto-generated catch block
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return null;
+        }
+        finally {
+            if(is !=null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    LogUtil.errorLogInfo("", TAG, e);
+                }
+            }
+            is = null;
+
+            if(is_!=null) {
+                try {
+                    is_.close();
+                } catch (IOException e) {
+                    LogUtil.errorLogInfo("", TAG, e);
+                }
+            }
+            is_ = null;
+        }
+    }
+
+    public synchronized static int GetExifOrientation(String filepath) {
+        int degree = 0;
+        ExifInterface exif = null;
+
+        try {
+            exif = new ExifInterface(filepath);
+        } catch (IOException e) {
+            Log.e(TAG, "[Exception] GetExifOrientation()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+
+        if (exif != null) {
+            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
+
+            if (orientation != -1) {
+                // We only recognize a subset of orientation tag values.
+                switch (orientation) {
+                    case ExifInterface.ORIENTATION_ROTATE_90:
+                        degree = 90;
+                        break;
+                    case ExifInterface.ORIENTATION_ROTATE_180:
+                        degree = 180;
+                        break;
+
+                    case ExifInterface.ORIENTATION_ROTATE_270:
+                        degree = 270;
+                        break;
+                }
+
+            }
+        }
+        Log.d(TAG, "[GetExifOrientation] degree [" + degree + "]");
+        return degree;
+    }
+
+    public synchronized static Bitmap GetRotatedBitmap(Bitmap bitmap, int degrees) {
+        if (degrees != 0 && bitmap != null) {
+            Matrix m = new Matrix();
+            m.setRotate(degrees, (float) bitmap.getWidth() / 2, (float) bitmap.getHeight() / 2);
+            try {
+                Bitmap b2 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
+                if (bitmap != b2) {
+                    bitmap.recycle();
+                    bitmap = b2;
+                }
+                else if(b2!=null)
+                {
+                    b2.recycle();;
+                    b2 = null;
+                }
+            } catch (OutOfMemoryError ex) {
+                Log.e(TAG, "[Exception] GetRotatedBitmap()");
+            }
+        }
+        return bitmap;
+    }
+
+    /**
+     * @description 이미지 Sampling size 확인
+     */
+    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
+        // Raw height and width of image
+        final int height = options.outHeight;
+        final int width = options.outWidth;
+        int inSampleSize = 1;
+
+        if ((reqWidth > 1024) || (reqHeight > 600)) {
+            inSampleSize = 2; // 1280x800 예외처리 추가
+        }
+
+        long tempFreeMemory = Runtime.getRuntime().freeMemory();
+
+        Log.d("AutoPictureApp", "freeMemory : " + tempFreeMemory);
+        if (tempFreeMemory < 100000) {
+            Log.w("AutoPictureApp", "freeMemory is low than 100000");
+            Log.w("AutoPictureApp", "inSampleSize will be * 2");
+            inSampleSize *= 2;
+        }
+        if (tempFreeMemory < 50000) {
+            Log.w("AutoPictureApp", "freeMemory is low than 50000");
+            Log.w("AutoPictureApp", "inSampleSize will be * 2");
+            inSampleSize *= 2;
+        }
+
+        if (height > reqHeight || width > reqWidth) {
+            final int halfHeight = height / 2;
+            final int halfWidth = width / 2;
+
+            // Calculate the largest inSampleSize value that is a power of 2 and
+            // keeps both
+            // height and width larger than the requested height and width.
+            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
+                inSampleSize *= 2;
+            }
+        }
+
+        Log.i("AutoPictureApp", "inSampleSize : " + inSampleSize);
+        return inSampleSize;
+    }
+
+    public boolean ctrlLCDOnOff(boolean bOn) {
+        try {
+            // 절전모드 사용시 호출수신등의 이벤트로 LCD 화면을 ON한다.
+            // 모든 이벤트가 끝나고, 메인화면으로 전환시 절전모드를 다시 동작시킨다.
+            Log.d(TAG, "[ctrlLCDOnOff] bOn [" + bOn + "]");
+            if (bOn) {
+                PowerManager mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+                Log.d(TAG, "[ctrlLCDOnOff] Screen On: " + mPowerManager.isScreenOn());
+                mV40IF.WpdInterfaceOpen();
+                mV40IF.LcdWakeUp(); // 절전상태일 경우, jni LcdWakeUp 먼저 호출
+                mV40IF.WpdInterfaceClose();
+
+                sendHandlerMsg(HANDLERMSG.FLAG_KEEP_SCREEN_ON, 0, 0);
+            }
+            else {
+                sendHandlerMsg(HANDLERMSG.FLAG_KEEP_SCREEN_ON, 0, 0);
+            }
+            return true;
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return false;
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] ctrlLCDOnOff(bOn)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return false;
+        }
+    }
+
+    // MainActivity Handler
+    public final class HANDLERMSG {
+        public final static int FLAG_KEEP_SCREEN_ON = 100;
+        public final static int SHOW_NEXT_PICTURE = 200;
+    }
+
+    public Handler MainHandler = new Handler(Looper.getMainLooper()) {
+        public void handleMessage(Message msg) {
+            Log.d(TAG, "[MainHandler] MainHandler : what [" + msg.what + "], arg1 [" + msg.arg1 + "], arg2 [" + msg.arg2 + "]");
+            switch (msg.what) {
+                case HANDLERMSG.FLAG_KEEP_SCREEN_ON:
+                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+                    break;
+
+                case HANDLERMSG.SHOW_NEXT_PICTURE:
+                    ShowNextImage();
+                    break;
+
+                default:
+                    Log.d(TAG, "MainHandler : " + msg.what);
+                    break;
+            }
+        }
+    };
+
+    public void sendHandlerMsg(int what, int arg1, int arg2) {
+        try {
+//            Log.i(TAG, "[sendHandlerMsg] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "]");
+            Message HandleMsg = MainHandler.obtainMessage();
+            HandleMsg.what = what;
+            HandleMsg.arg1 = arg1;
+            HandleMsg.arg2 = arg2;
+            MainHandler.sendMessage(HandleMsg);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] sendHandlerMsg(msg)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void sendHandlerMsgDelayed(int what, int arg1, int arg2, long delay) {
+        try {
+//            Log.i(TAG, "[sendHandlerMsgDelayed] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "], delay [" + delay + "]");
+            Message HandleMsg = MainHandler.obtainMessage();
+            HandleMsg.what = what;
+            HandleMsg.arg1 = arg1;
+            HandleMsg.arg2 = arg2;
+            MainHandler.sendMessageDelayed(HandleMsg, delay);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] sendHandlerMsgDelayed(msg)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+}

+ 397 - 0
AutoPicture/src/main/java/kr/co/icontrols/v40ioctl/V40IF.java

@@ -0,0 +1,397 @@
+package kr.co.icontrols.v40ioctl;
+
+import android.os.Build;
+import android.util.Log;
+
+import com.util.LogUtil;
+
+public class V40IF {
+
+    String TAG = "V40IF";
+
+    boolean bLOG = true;
+
+    private void LOG(String log) {
+        if (bLOG) Log.v(TAG, log);
+    }
+
+    boolean bLOG_DEBUG = false;
+
+    private void LOG_DEBUG(String log) {
+        if (bLOG_DEBUG) Log.d(TAG, log);
+    }
+
+    boolean bLOG_INFO = true;
+
+    private void LOG_INFO(String log) {
+        if (bLOG_INFO) Log.i(TAG, log);
+    }
+
+    private V40IOInterface mV40IOIF = null;
+    private V40IOInterface2 mV40IOIF_NOUGAT = null;
+
+    public V40IF() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT = new V40IOInterface2();
+            else mV40IOIF = new V40IOInterface();
+        } catch (RuntimeException re) {
+            Log.e(TAG, re.toString());
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] V40IF()");
+            ////e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public int WpdInterfaceOpen() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) {
+                if(mV40IOIF_NOUGAT!=null)
+                    return mV40IOIF_NOUGAT.WpdInterfaceOpen();
+                else return -99;
+            }
+            else {
+                if(mV40IOIF!=null)
+                    return mV40IOIF.WpdInterfaceOpen();
+                else return -99;
+            }
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return -99;
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] WpdInterfaceOpen()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return -99;
+        }
+    }
+
+    public int WpdInterfaceClose() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) {
+                if(mV40IOIF_NOUGAT!=null)
+                    return mV40IOIF_NOUGAT.WpdInterfaceClose();
+                else return -99;
+            }
+            else {
+                if(mV40IOIF!=null)
+                    return mV40IOIF.WpdInterfaceClose();
+                return -99;
+            }
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return -99;
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] WpdInterfaceClose()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return -99;
+        }
+    }
+
+    public int WpdInterfaceControl(int cmd, int arg) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) return mV40IOIF_NOUGAT.WpdInterfaceControl(cmd, arg);
+            else return mV40IOIF.WpdInterfaceControl(cmd, arg);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return -99;
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] WpdInterfaceControl(int cmd, int arg)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return -99;
+        }
+    }
+
+    public void SetMacAddr(String mac) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.SetMacAddr(mac);
+            else mV40IOIF.SetMacAddr(mac);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] SetMacAddr(String mac)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void IpAddr(String ip) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.IpAddr(ip);
+            else mV40IOIF.IpAddr(ip);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] IpAddr(String ip)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void GatewayIp(String gw) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.GatewayIp(gw);
+            else mV40IOIF.GatewayIp(gw);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] GatewayIp(String gw)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void NetMask(String mask) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.NetMask(mask);
+            else mV40IOIF.NetMask(mask);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] NetMask(String mask)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void NetAll(String ip, String mask, String gw, String mac) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.NetAll(ip, mask, gw, mac);
+            else mV40IOIF.NetAll(ip, mask, gw, mac);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] NetAll(String ip, String mask, String gw, String mac)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void LiveUpdate() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.LiveUpdate();
+            else mV40IOIF.LiveUpdate();
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] LiveUpdate()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void UsbUpdate() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.UsbUpdate();
+            else mV40IOIF.UsbUpdate();
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] UsbUpdate()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public int LcdWakeUp() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) return mV40IOIF_NOUGAT.LcdWakeUp();
+            else return mV40IOIF.LcdWakeUp();
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return -99;
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] LcdWakeUp()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return -99;
+        }
+    }
+
+    public void Reboot(int sec) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.Reboot(sec);
+            else mV40IOIF.Reboot(sec);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] Reboot(int sec)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void NetDns1(String dns) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.NetDns1(dns);
+            else mV40IOIF.NetDns1(dns);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] NetDns1(String dns)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void NetDns2(String dns) {
+        try {
+            if (Build.VERSION.SDK_INT > 23) mV40IOIF_NOUGAT.NetDns2(dns);
+            else mV40IOIF.NetDns2(dns);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] NetDns2(String dns)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public int sensorread() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) return mV40IOIF_NOUGAT.sensorread();
+            else return mV40IOIF.sensorread();
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return -99;
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] sensorread()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return -99;
+        }
+    }
+
+    public int setLcdWakeUp() {
+        try {
+            if (Build.VERSION.SDK_INT > 23) return mV40IOIF_NOUGAT.LcdWakeUp();
+            else return mV40IOIF.LcdWakeUp();
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return -99;
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] setLcdWakeUp()");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+            return -99;
+        }
+    }
+
+    public void setDns(String dns1, String dns2) {
+        try {
+            Log.i(TAG, "[setDns] DNS1 : " + dns1 + " / DNS2 : " + dns2);
+            NetDns1(dns1);
+            NetDns2(dns2);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] setDns(String dns1, String dns2)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setV40Reboot(int sec) {
+        try {
+            Log.i(TAG, "[setV40Reboot] V40 Device will reboot : " +sec + " second !!!");
+            Reboot(sec);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] setV40Reboot(int sec)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setMACAddress(String strMAC) {
+        try {
+            Log.i(TAG, "[setMACAddress] strMAC [" + strMAC+ "]");
+            SetMacAddr(strMAC);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] setMACAddress(String strMAC)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setIPAddress(String strIP) {
+        try {
+            Log.i(TAG, "[setIPAddress] strIP [" + strIP + "]");
+            IpAddr(strIP);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] setIPAddress(String strIP)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setNetmaskAddress(String strNetmask) {
+        try {
+            Log.i(TAG, "[setNetmaskAddress] strNetmask [" + strNetmask + "]");
+            NetMask(strNetmask);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] setNetmaskAddress(String strNetmask)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setGatewayAddress(String strGateway) {
+        try {
+            Log.i(TAG, "[setGatewayAddress] strGateway [" + strGateway+ "]");
+            GatewayIp(strGateway);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] setGatewayAddress(String strGateway)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setNetworkInterface(String strIP, String strNetmask, String strGateway, String strMAC) {
+        try {
+            Log.i(TAG, "[setNetworkInterface] strIP [" + strIP+ "], strNetmask [" + strNetmask+ "], strGateway [" + strGateway+ "], strMAC [" + strMAC+ "]");
+
+            NetAll(strIP, strNetmask, strGateway, strMAC);
+        }catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }  catch (Exception e) {
+            Log.e(TAG, "[Exception] setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS, String strMAC)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS, String strMAC) {
+        try {
+            Log.i(TAG, "[setNetworkInterface] strIP [" + strIP+ "], strNetmask [" + strNetmask+ "], strGateway [" + strGateway+ "], strDNS [" + strDNS+ "], strMAC [" + strMAC+ "]");
+
+            IpAddr(strIP);
+            NetMask(strNetmask);
+            GatewayIp(strGateway);
+            // DNS 설정 JNI method는 아직 없음(2018.02.26)
+            SetMacAddr(strMAC);
+        } catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        } catch (Exception e) {
+            Log.e(TAG, "[Exception] setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS, String strMAC)");
+            //e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+
+
+
+}

+ 29 - 0
AutoPicture/src/main/java/kr/co/icontrols/v40ioctl/V40IOInterface.java

@@ -0,0 +1,29 @@
+package kr.co.icontrols.v40ioctl;
+
+public class V40IOInterface {
+
+    String TAG = "V40IOInterface";
+
+    static {
+        System.loadLibrary("wpd_v40interface-jni");
+    }
+
+    public native int WpdInterfaceOpen();
+
+    public native int WpdInterfaceClose();
+
+    public native int WpdInterfaceControl(int cmd, int arg);
+
+    public native void SetMacAddr(String mac);
+    public native void IpAddr(String ip);
+    public native void GatewayIp(String gw);
+    public native void NetMask(String mask);
+    public native void NetAll(String ip, String mask, String gw, String mac);
+    public native void LiveUpdate();
+    public native void UsbUpdate();
+    public native int LcdWakeUp();
+    public native void Reboot(int sec);
+    public native void NetDns1(String dns);
+    public native void NetDns2(String dns);
+    public native int sensorread();
+}

+ 201 - 0
AutoPicture/src/main/java/kr/co/icontrols/v40ioctl/V40IOInterface2.java

@@ -0,0 +1,201 @@
+package kr.co.icontrols.v40ioctl;
+
+import android.util.Log;
+
+import com.util.LogUtil;
+
+public class V40IOInterface2 {
+
+    private static final String TAG = "V40IOInterface2";
+
+    static{
+		System.loadLibrary("wpd_v40interface2-jni");
+    }
+
+	public native int WpdInterfaceOpen();
+
+	public native int WpdInterfaceClose();
+
+	public native int WpdInterfaceControl(int cmd, int arg);
+
+    public native void SetMacAddr(String mac);
+    public native void IpAddr(String ip);
+    public native void GatewayIp(String gw);
+    public native void NetMask(String mask);
+    public native void NetAll(String ip, String mask, String gw, String mac);
+    public native void LiveUpdate();
+    public native void UsbUpdate();
+    public native int LcdWakeUp();
+    public native void Reboot(int sec);
+	public native void NetDns1(String dns);
+	public native void NetDns2(String dns);
+	public native int sensorread();
+
+    public void setLcdWakeUp() {
+		LcdWakeUp();
+	}
+
+	public void setDns(String dns1, String dns2)
+	{
+		NetDns1(dns1);
+		NetDns2(dns2);
+		Log.i(TAG, "V40 SET DNS IP#1 : " + dns1 + " / DNS IP#2 : " + dns2);
+	}
+
+	public void setV40Reboot(int sec)
+	{
+		Log.i(TAG, "V40 Device will reboot : " +sec + " second !!!");
+		Reboot(sec);
+	}
+
+    public void setMACAddress(String strMAC) {
+        try
+		{
+            Log.i(TAG, "[setMACAddress] strMAC [" + strMAC+ "]");
+            SetMacAddr(strMAC);
+
+        }
+		catch (RuntimeException re) {
+			Log.e(TAG, re.toString());
+		}
+		catch (Exception e)
+		{
+            Log.e(TAG, "[Exception] setMACAddress(String strMAC)");
+            //e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setIPAddress(String strIP) {
+        try
+		{
+			Log.i(TAG, "[setIPAddress] strIP [" + strIP + "]");
+			IpAddr(strIP);
+		}
+		catch (RuntimeException re) {
+			Log.e(TAG, re.toString());
+		}
+		catch (Exception e)
+		{
+            Log.e(TAG, "[Exception] setIPAddress(String strIP)");
+            //e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setNetmaskAddress(String strNetmask) {
+        try
+		{
+			Log.i(TAG, "[setNetmaskAddress] strNetmask [" + strNetmask + "]");
+			NetMask(strNetmask);
+		}
+		catch (RuntimeException re) {
+			Log.e(TAG, re.toString());
+		}
+		catch (Exception e)
+		{
+            Log.e(TAG, "[Exception] setNetmaskAddress(String strNetmask)");
+            //e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    public void setGatewayAddress(String strGateway) {
+        try
+		{
+            Log.i(TAG, "[setGatewayAddress] strGateway [" + strGateway+ "]");
+			GatewayIp(strGateway);
+        }
+		catch (RuntimeException re) {
+			Log.e(TAG, re.toString());
+		}
+		catch (Exception e)
+		{
+            Log.e(TAG, "[Exception] setGatewayAddress(String strGateway)");
+            //e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+    /*public void setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS) {
+        try
+		{
+            Log.i(TAG, "[setNetworkInterface] strIP [" + strIP+ "], strNetmask [" + strNetmask+ "], strGateway [" + strGateway+ "], strDNS [" + strDNS+ "]");
+
+            IpAddr(strIP);
+            NetMask(strNetmask);
+            GatewayIp(strGateway);
+			Reboot(5);
+        }
+        catch (Exception e)
+		{
+            Log.e(TAG, "[Exception] setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS)");
+            //e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }*/
+
+	/**
+	 * V40 JNI를 이용한 IP 설정<br>
+	 * NetAll(strIP, strNetmask, strGateway, strMAC) 사용<br>
+	 * Reboot(5 sec) 설정<br>
+	 *
+	 * @param strIP 설정하고자 하는 IP
+	 * @param strNetmask 설정하고자 하는 Netmask
+	 * @param strGateway 설정하고자 하는 Gateway
+	 * @param strMAC 설정하고자 하는 Mac address
+	 */
+	public void setNetworkInterface(String strIP, String strNetmask, String strGateway, String strMAC) {
+		try
+		{
+			Log.i(TAG, "[setNetworkInterface] strIP [" + strIP+ "], strNetmask [" + strNetmask+ "], strGateway [" + strGateway+ "], strMAC [" + strMAC+ "]");
+
+			NetAll(strIP, strNetmask, strGateway, strMAC);
+		}
+		catch (RuntimeException re) {
+			Log.e(TAG, re.toString());
+		}
+		catch (Exception e)
+		{
+			Log.e(TAG, "[Exception] setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS, String strMAC)");
+			//e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * V40 JNI를 이용한 IP 설정<br>
+	 * DNS 설정 JNI method 미구현 버전<br>
+	 * Reboot(5 sec) 설정<br>
+	 *
+	 * @param strIP 설정하고자 하는 IP
+	 * @param strNetmask 설정하고자 하는 Netmask
+	 * @param strGateway 설정하고자 하는 Gateway
+	 * @param strDNS (사용안함)
+	 * @param strMAC 설정하고자 하는 Mac address
+	 */
+    public void setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS, String strMAC) {
+        try
+		{
+            Log.i(TAG, "[setNetworkInterface] strIP [" + strIP+ "], strNetmask [" + strNetmask+ "], strGateway [" + strGateway+ "], strDNS [" + strDNS+ "], strMAC [" + strMAC+ "]");
+
+            IpAddr(strIP);
+            NetMask(strNetmask);
+            GatewayIp(strGateway);
+            // DNS 설정 JNI method는 아직 없음(2018.02.26)
+            SetMacAddr(strMAC);
+        }
+		catch (RuntimeException re) {
+			Log.e(TAG, re.toString());
+		}
+		catch (Exception e)
+		{
+            Log.e(TAG, "[Exception] setNetworkInterface(String strIP, String strNetmask, String strGateway, String strDNS, String strMAC)");
+            //e.printStackTrace();            
+            LogUtil.errorLogInfo("", TAG, e);
+        }
+    }
+
+
+
+}

binární
AutoPicture/src/main/jniLibs/armeabi-v7a/libgle.so


binární
AutoPicture/src/main/jniLibs/armeabi-v7a/libserial_port.so


binární
AutoPicture/src/main/jniLibs/armeabi-v7a/libwpd_a20interface-jni.so


binární
AutoPicture/src/main/jniLibs/armeabi-v7a/libwpd_v40interface-jni.so


binární
AutoPicture/src/main/jniLibs/armeabi-v7a/libwpd_v40interface2-jni.so


binární
AutoPicture/src/main/jniLibs/armeabi-v7a/libwpddevctr.so


binární
AutoPicture/src/main/jniLibs/armeabi/libgle.so


binární
AutoPicture/src/main/jniLibs/armeabi/libserial_port.so


binární
AutoPicture/src/main/jniLibs/armeabi/libwpd_a20interface-jni.so


binární
AutoPicture/src/main/jniLibs/armeabi/libwpd_v40interface-jni.so


binární
AutoPicture/src/main/jniLibs/armeabi/libwpd_v40interface2-jni.so


binární
AutoPicture/src/main/jniLibs/armeabi/libwpddevctr.so


+ 8 - 0
AutoPicture/src/main/res/anim/anim_in.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:interpolator="@android:anim/accelerate_interpolator"
+        android:fromXDelta="-100%"
+        android:toXDelta="0"
+        android:duration="1300"/>
+</set>

+ 8 - 0
AutoPicture/src/main/res/anim/anim_in_downup.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:interpolator="@android:anim/accelerate_interpolator"
+        android:fromYDelta="100%"
+        android:toYDelta="0"
+        android:duration="1300"/>
+</set>

+ 8 - 0
AutoPicture/src/main/res/anim/anim_in_updown.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:interpolator="@android:anim/accelerate_interpolator"
+        android:fromYDelta="-100%"
+        android:toYDelta="0"
+        android:duration="1300"/>
+</set>

+ 8 - 0
AutoPicture/src/main/res/anim/anim_out.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:interpolator="@android:anim/accelerate_interpolator"
+        android:fromXDelta="0"
+        android:toXDelta="100%"
+        android:duration="1300"/>
+</set>

+ 8 - 0
AutoPicture/src/main/res/anim/anim_out_downup.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:interpolator="@android:anim/accelerate_interpolator"
+        android:fromYDelta="0"
+        android:toYDelta="-100%"
+        android:duration="1300"/>
+</set>

+ 8 - 0
AutoPicture/src/main/res/anim/anim_out_updown.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:interpolator="@android:anim/accelerate_interpolator"
+        android:fromYDelta="0"
+        android:toYDelta="100%"
+        android:duration="1300"/>
+</set>

binární
AutoPicture/src/main/res/drawable-hdpi/ic_launcher.png


binární
AutoPicture/src/main/res/drawable-mdpi/bg_popupalarm.png


binární
AutoPicture/src/main/res/drawable-mdpi/but_ok.png


binární
AutoPicture/src/main/res/drawable-mdpi/but_ok_p.png


binární
AutoPicture/src/main/res/drawable-mdpi/but_popup_cancel.png


binární
AutoPicture/src/main/res/drawable-mdpi/but_popup_cancel_p.png


binární
AutoPicture/src/main/res/drawable-mdpi/ic_launcher.png


binární
AutoPicture/src/main/res/drawable-mdpi/icon_recording.png


binární
AutoPicture/src/main/res/drawable-xhdpi/ic_launcher.png


binární
AutoPicture/src/main/res/drawable-xxhdpi/ic_launcher.png


+ 17 - 0
AutoPicture/src/main/res/layout/activity_main.xml

@@ -0,0 +1,17 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    tools:context=".MainActivity" >
+
+    <RelativeLayout
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent" >
+
+    </RelativeLayout>
+
+</RelativeLayout>

+ 9 - 0
AutoPicture/src/main/res/menu/main.xml

@@ -0,0 +1,9 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <item
+        android:id="@+id/action_settings"
+        android:orderInCategory="100"
+        android:showAsAction="never"
+        android:title="@string/action_settings"/>
+
+</menu>

binární
AutoPicture/src/main/res/mipmap-hdpi/ic_launcher.png


binární
AutoPicture/src/main/res/mipmap-mdpi/ic_launcher.png


binární
AutoPicture/src/main/res/mipmap-xhdpi/ic_launcher.png


binární
AutoPicture/src/main/res/mipmap-xxhdpi/ic_launcher.png


binární
AutoPicture/src/main/res/mipmap-xxxhdpi/ic_launcher.png


+ 8 - 0
AutoPicture/src/main/res/values-sw600dp/dimens.xml

@@ -0,0 +1,8 @@
+<resources>
+
+    <!--
+         Customize dimensions originally defined in res/values/dimens.xml (such as
+         screen margins) for sw600dp devices (e.g. 7" tablets) here.
+    -->
+
+</resources>

+ 9 - 0
AutoPicture/src/main/res/values-sw720dp-land/dimens.xml

@@ -0,0 +1,9 @@
+<resources>
+
+    <!--
+         Customize dimensions originally defined in res/values/dimens.xml (such as
+         screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
+    -->
+    <dimen name="activity_horizontal_margin">128dp</dimen>
+
+</resources>

+ 11 - 0
AutoPicture/src/main/res/values-v11/styles.xml

@@ -0,0 +1,11 @@
+<resources>
+
+    <!--
+        Base application theme for API 11+. This theme completely replaces
+        AppBaseTheme from res/values/styles.xml on API 11+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+        <!-- API 11 theme customizations can go here. -->
+    </style>
+
+</resources>

+ 12 - 0
AutoPicture/src/main/res/values-v14/styles.xml

@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+        Base application theme for API 14+. This theme completely replaces
+        AppBaseTheme from BOTH res/values/styles.xml and
+        res/values-v11/styles.xml on API 14+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- API 14 theme customizations can go here. -->
+    </style>
+
+</resources>

+ 7 - 0
AutoPicture/src/main/res/values/dimens.xml

@@ -0,0 +1,7 @@
+<resources>
+
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+
+</resources>

+ 8 - 0
AutoPicture/src/main/res/values/strings.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">AutoPicture</string>
+    <string name="action_settings">Settings</string>
+    <string name="hello_world">Hello world!</string>
+
+</resources>

+ 26 - 0
AutoPicture/src/main/res/values/styles.xml

@@ -0,0 +1,26 @@
+<resources>
+
+    <!--
+        Base application theme, dependent on API level. This theme is replaced
+        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Light">
+        <!--
+            Theme customizations available in newer API levels can go in
+            res/values-vXX/styles.xml, while customizations related to
+            backward-compatibility can go here.
+        -->
+    </style>
+
+    <!-- Application theme. -->
+    <style name="AppTheme" parent="AppBaseTheme">
+        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+    </style>
+
+    <style name="Theme.PopupActivity" parent="android:style/Theme.Dialog">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+    </style>
+
+</resources>

binární
AutoPicture/src/release/hdc_icon-web.png


binární
AutoPicture/src/release/ic_launcher-web.png


binární
AutoPicture/src/release/res/mipmap-hdpi/hdc_icon.png


binární
AutoPicture/src/release/res/mipmap-hdpi/ic_launcher.png


binární
AutoPicture/src/release/res/mipmap-mdpi/hdc_icon.png


binární
AutoPicture/src/release/res/mipmap-mdpi/ic_launcher.png


binární
AutoPicture/src/release/res/mipmap-xhdpi/hdc_icon.png


binární
AutoPicture/src/release/res/mipmap-xhdpi/ic_launcher.png


binární
AutoPicture/src/release/res/mipmap-xxhdpi/hdc_icon.png


binární
AutoPicture/src/release/res/mipmap-xxhdpi/ic_launcher.png


binární
AutoPicture/src/release/res/mipmap-xxxhdpi/hdc_icon.png


binární
AutoPicture/src/release/res/mipmap-xxxhdpi/ic_launcher.png


binární
HDC_HN_RELEASE_KEY.jks


+ 88 - 0
LogOutputService/build.gradle

@@ -0,0 +1,88 @@
+apply plugin: 'com.android.application'
+
+// This buildscript{} block configures the code driving the build
+buildscript {
+    /**
+     * The nested repositories{} block declares that this build uses the
+     * jcenter repository.
+     */
+    repositories {
+        jcenter()
+        google()
+    }
+
+    /**
+     * This block declares a dependency on the 2.3.3 version
+     * of the Gradle plugin for the buildscript.
+     */
+    dependencies {
+        classpath 'com.android.tools.build:gradle:4.1.1'
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+        google()
+    }
+}
+
+apply plugin: 'com.android.application'
+
+android {
+    signingConfigs {
+        config {
+            keyAlias 'HDC_HN_RELEASE_KEY'
+            keyPassword 'hdchnsys1776'
+            storeFile file('../HDC_HN_RELEASE_KEY.jks')
+            storePassword 'hdchnsys1776'
+        }
+    }
+
+
+    compileSdkVersion 28
+
+    defaultConfig {
+        applicationId "com.artncore.apps.ic_wallpad.service.log"
+        minSdkVersion 17
+        targetSdkVersion 17
+    }
+
+    applicationVariants.all { variant ->
+        variant.outputs.all { output ->
+            outputFileName = new File("../", "LogOutputService.apk");
+        }
+    }
+
+    buildTypes {
+        release {
+            lintOptions {
+                disable 'MissingTranslation'
+                checkReleaseBuilds false
+                abortOnError false
+            }
+            signingConfig signingConfigs.config
+//            minifyEnabled true
+//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+        release_secured {
+            lintOptions {
+                disable 'MissingTranslation'
+                checkReleaseBuilds false
+                abortOnError false
+            }
+            signingConfig signingConfigs.config
+            minifyEnabled true
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+        debug {
+            signingConfig signingConfigs.config
+        }
+    }
+}
+
+dependencies {
+    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+    implementation files('libs/WallPadAPI.jar')
+    implementation files('libs/WallPadSupport.jar')
+}

binární
LogOutputService/libs/WallPadAPI.jar


binární
LogOutputService/libs/WallPadAPIforSVC.jar


binární
LogOutputService/libs/WallPadSupport.jar


+ 28 - 0
LogOutputService/src/main/AndroidManifest.xml

@@ -0,0 +1,28 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.artncore.apps.ic_wallpad.service.log"
+    android:versionCode="24"
+    android:versionName="2021.06.04.01">
+
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+
+        <service
+            android:name=".LogOutputService"
+            android:enabled="true" 
+            android:exported="true"
+            android:process=":remote"
+            >
+            <intent-filter>
+                <action android:name="com.artncore.apps.ic_wallpad.service.log.remotestub.RemoteInterface" />
+            </intent-filter>
+        </service>
+
+    </application>
+
+</manifest>

binární
LogOutputService/src/main/ic_launcher-web.png


+ 66 - 0
LogOutputService/src/main/java/com/artncore/apps/ic_wallpad/service/log/LogOutputService.java

@@ -0,0 +1,66 @@
+package com.artncore.apps.ic_wallpad.service.log;
+
+
+import kr.co.icontrols.wallpadsupport.Version;
+import com.artncore.commons.define;
+import android.os.IBinder;
+import android.app.Service;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.util.Log;
+
+
+public class LogOutputService extends Service
+{
+    private static final String TAG = "LogOutputService";
+
+    /**
+     * 생성자
+     */
+    @Override
+    public void onCreate()
+    {
+        super.onCreate();
+
+        // 1. 로그메시지 출력
+        Log.i("Version", "START - WallPadDevService");
+        String version = null;
+        try {
+            PackageInfo i =  this.getPackageManager().getPackageInfo(this.getPackageName(), 0);
+            version = i.versionName;
+        } catch(NameNotFoundException e) { }
+        Log.i("Version", "<><><><>  Applications   Version = [" + version + "] " + "<><><><>");
+        Version.LogOut();
+        Log.i("Version", "<><><><>  WallPadAPI     Version = [" + define.WALLPADAPI_VERSION + "] " + "<><><><>");
+    }
+
+    /**
+     * onStartCommand
+     */
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId)
+    {
+        return START_STICKY; // run until explicitly stopped.
+    }
+
+    /**
+     * onDestroy
+     */
+    @Override
+    public void onDestroy()
+    {
+        super.onDestroy();
+
+        Log.i(TAG, "onDestroy()");
+    }
+
+    /**
+     * onBind
+     */
+    @Override
+    public IBinder onBind(Intent intent)
+    {
+        return null;
+    }
+}

binární
LogOutputService/src/main/res/drawable-hdpi/ic_launcher.png


binární
LogOutputService/src/main/res/drawable-mdpi/ic_launcher.png


binární
LogOutputService/src/main/res/drawable-xhdpi/ic_launcher.png


binární
LogOutputService/src/main/res/mipmap-hdpi/ic_launcher.png


binární
LogOutputService/src/main/res/mipmap-mdpi/ic_launcher.png


binární
LogOutputService/src/main/res/mipmap-xhdpi/ic_launcher.png


binární
LogOutputService/src/main/res/mipmap-xxhdpi/ic_launcher.png


binární
LogOutputService/src/main/res/mipmap-xxxhdpi/ic_launcher.png


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů