From 7460b2561de136483ca69ebe7ea2c80e8d13bf6d Mon Sep 17 00:00:00 2001 From: DefTruth <31974251+DefTruth@users.noreply.github.com> Date: Tue, 8 Nov 2022 19:13:50 +0800 Subject: [PATCH] [Android] Update fastdeploy Android app ui module (#531) Revert "[Android] Revert update fastdeploy Android app ui module (#530)" This reverts commit 628b2d130dbc72661d7fede19eb908aa9b89d96c. --- java/android/app/src/main/AndroidManifest.xml | 4 +- .../detection/DetectionMainActivity.java | 431 ++++++++++++++++++ ...ty.java => DetectionSettingsActivity.java} | 7 +- .../app/examples/detection/MainActivity.java | 255 ----------- ...MainActivity.java => OcrMainActivity.java} | 50 +- ...Activity.java => OcrSettingsActivity.java} | 6 +- .../app/ui/{ => layout}/ActionBarLayout.java | 2 +- .../AppCompatPreferenceActivity.java | 2 +- .../app/ui/{ => view}/CameraSurfaceView.java | 4 +- .../app/ui/view/ResultListView.java | 43 ++ .../ui/view/adapter/DetectResultAdapter.java | 48 ++ .../app/ui/view/model/BaseResultModel.java | 41 ++ .../main/res/layout-land/activity_main.xml | 99 ---- .../layout-land/detection_activity_main.xml | 14 + .../res/layout-land/ocr_activity_main.xml | 14 + .../res/layout/detection_activity_main.xml | 14 + ...ity_main.xml => detection_camera_page.xml} | 20 +- .../main/res/layout/detection_result_page.xml | 160 +++++++ .../res/layout/detection_result_page_item.xml | 26 ++ .../src/main/res/layout/ocr_activity_main.xml | 14 + .../src/main/res/layout/ocr_camera_page.xml | 161 +++++++ .../src/main/res/layout/ocr_result_page.xml | 160 +++++++ .../main/res/layout/ocr_result_page_item.xml | 26 ++ .../app/src/main/res/values/strings.xml | 9 +- .../app/src/main/res/values/values.xml | 17 + .../{settings.xml => default_settings.xml} | 0 26 files changed, 1221 insertions(+), 406 deletions(-) create mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java rename java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/{SettingsActivity.java => DetectionSettingsActivity.java} (97%) delete mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/MainActivity.java rename java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/{MainActivity.java => OcrMainActivity.java} (84%) rename java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/{SettingsActivity.java => OcrSettingsActivity.java} (97%) rename java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/{ => layout}/ActionBarLayout.java (94%) rename java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/{ => view}/AppCompatPreferenceActivity.java (98%) rename java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/{ => view}/CameraSurfaceView.java (99%) create mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java create mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/DetectResultAdapter.java create mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java delete mode 100644 java/android/app/src/main/res/layout-land/activity_main.xml create mode 100644 java/android/app/src/main/res/layout-land/detection_activity_main.xml create mode 100644 java/android/app/src/main/res/layout-land/ocr_activity_main.xml create mode 100644 java/android/app/src/main/res/layout/detection_activity_main.xml rename java/android/app/src/main/res/layout/{activity_main.xml => detection_camera_page.xml} (92%) create mode 100644 java/android/app/src/main/res/layout/detection_result_page.xml create mode 100644 java/android/app/src/main/res/layout/detection_result_page_item.xml create mode 100644 java/android/app/src/main/res/layout/ocr_activity_main.xml create mode 100644 java/android/app/src/main/res/layout/ocr_camera_page.xml create mode 100644 java/android/app/src/main/res/layout/ocr_result_page.xml create mode 100644 java/android/app/src/main/res/layout/ocr_result_page_item.xml create mode 100644 java/android/app/src/main/res/values/values.xml rename java/android/app/src/main/res/xml/{settings.xml => default_settings.xml} (100%) diff --git a/java/android/app/src/main/AndroidManifest.xml b/java/android/app/src/main/AndroidManifest.xml index 754b0b6c3..ab3b31b87 100644 --- a/java/android/app/src/main/AndroidManifest.xml +++ b/java/android/app/src/main/AndroidManifest.xml @@ -15,14 +15,14 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java new file mode 100644 index 000000000..704f34058 --- /dev/null +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java @@ -0,0 +1,431 @@ +package com.baidu.paddle.fastdeploy.app.examples.detection; + + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.os.SystemClock; +import android.preference.PreferenceManager; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.baidu.paddle.fastdeploy.RuntimeOption; +import com.baidu.paddle.fastdeploy.app.examples.R; +import com.baidu.paddle.fastdeploy.app.ui.view.CameraSurfaceView; +import com.baidu.paddle.fastdeploy.app.ui.view.ResultListView; +import com.baidu.paddle.fastdeploy.app.ui.Utils; +import com.baidu.paddle.fastdeploy.app.ui.view.adapter.DetectResultAdapter; +import com.baidu.paddle.fastdeploy.app.ui.view.model.BaseResultModel; +import com.baidu.paddle.fastdeploy.vision.DetectionResult; +import com.baidu.paddle.fastdeploy.vision.detection.PicoDet; + +import java.io.File; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class DetectionMainActivity extends Activity implements View.OnClickListener, CameraSurfaceView.OnTextureChangedListener { + private static final String TAG = DetectionMainActivity.class.getSimpleName(); + + CameraSurfaceView svPreview; + TextView tvStatus; + ImageButton btnSwitch; + ImageButton btnShutter; + ImageButton btnSettings; + ImageView realtimeToggleButton; + boolean isRealtimeStatusRunning = false; + ImageView backInPreview; + private ImageView albumSelectButton; + private View mCameraPageView; + private ViewGroup mResultPageView; + private ImageView resultImage; + private ImageView backInResult; + private SeekBar confidenceSeekbar; + private TextView seekbarText; + private float resultNum = 1.0f; + private ResultListView detectResultView; + private Bitmap shutterBitmap; + private Bitmap originShutterBitmap; + private Bitmap picBitmap; + private Bitmap originPicBitmap; + public static final int BTN_SHUTTER = 0; + public static final int ALBUM_SELECT = 1; + private static int TYPE = BTN_SHUTTER; + + private static final int REQUEST_PERMISSION_CODE_STORAGE = 101; + private static final int INTENT_CODE_PICK_IMAGE = 100; + + String savedImagePath = "result.jpg"; + int lastFrameIndex = 0; + long lastFrameTime; + + // Call 'init' and 'release' manually later + PicoDet predictor = new PicoDet(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Fullscreen + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + + setContentView(R.layout.detection_activity_main); + + // Clear all setting items to avoid app crashing due to the incorrect settings + initSettings(); + + // Init the camera preview and UI components + initView(); + + // Check and request CAMERA and WRITE_EXTERNAL_STORAGE permissions + if (!checkAllPermissions()) { + requestAllPermissions(); + } + } + + @SuppressLint("NonConstantResourceId") + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_switch: + svPreview.switchCamera(); + break; + case R.id.btn_shutter: + TYPE = BTN_SHUTTER; + svPreview.onPause(); + mCameraPageView.setVisibility(View.GONE); + mResultPageView.setVisibility(View.VISIBLE); + seekbarText.setText(resultNum + ""); + confidenceSeekbar.setProgress((int) (resultNum * 100)); + resultImage.setImageBitmap(shutterBitmap); + break; + case R.id.btn_settings: + startActivity(new Intent(DetectionMainActivity.this, DetectionSettingsActivity.class)); + break; + case R.id.realtime_toggle_btn: + toggleRealtimeStyle(); + break; + case R.id.back_in_preview: + finish(); + break; + case R.id.albumSelect: + TYPE = ALBUM_SELECT; + // 判断是否已经赋予权限 + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + // 如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。 + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE_STORAGE); + } else { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.setType("image/*"); + startActivityForResult(intent, INTENT_CODE_PICK_IMAGE); + } + break; + case R.id.back_in_result: + mResultPageView.setVisibility(View.GONE); + mCameraPageView.setVisibility(View.VISIBLE); + svPreview.onResume(); + break; + + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == INTENT_CODE_PICK_IMAGE) { + if (resultCode == Activity.RESULT_OK) { + mCameraPageView.setVisibility(View.GONE); + mResultPageView.setVisibility(View.VISIBLE); + seekbarText.setText(resultNum + ""); + confidenceSeekbar.setProgress((int) (resultNum * 100)); + Uri uri = data.getData(); + String path = getRealPathFromURI(uri); + picBitmap = decodeBitmap(path, 720, 1280); + originPicBitmap = picBitmap.copy(Bitmap.Config.ARGB_8888, true); + resultImage.setImageBitmap(picBitmap); + } + } + } + + private String getRealPathFromURI(Uri contentURI) { + String result; + Cursor cursor = null; + try { + cursor = getContentResolver().query(contentURI, null, null, null, null); + } catch (Throwable e) { + e.printStackTrace(); + } + if (cursor == null) { + result = contentURI.getPath(); + } else { + cursor.moveToFirst(); + int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); + result = cursor.getString(idx); + cursor.close(); + } + return result; + } + + private void toggleRealtimeStyle() { + if (isRealtimeStatusRunning) { + isRealtimeStatusRunning = false; + realtimeToggleButton.setImageResource(R.drawable.realtime_stop_btn); + svPreview.setOnTextureChangedListener(this); + tvStatus.setVisibility(View.VISIBLE); + } else { + isRealtimeStatusRunning = true; + realtimeToggleButton.setImageResource(R.drawable.realtime_start_btn); + tvStatus.setVisibility(View.GONE); + svPreview.setOnTextureChangedListener(new CameraSurfaceView.OnTextureChangedListener() { + @Override + public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) { + return false; + } + }); + } + } + + @Override + public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) { + String savedImagePath = ""; + synchronized (this) { + savedImagePath = Utils.getDCIMDirectory() + File.separator + "result.png"; + } + shutterBitmap = ARGB8888ImageBitmap.copy(Bitmap.Config.ARGB_8888,true); + originShutterBitmap = ARGB8888ImageBitmap.copy(Bitmap.Config.ARGB_8888,true); + boolean modified = false; + DetectionResult result = predictor.predict( + ARGB8888ImageBitmap, savedImagePath, DetectionSettingsActivity.scoreThreshold); + modified = result.initialized(); + if (!savedImagePath.isEmpty()) { + synchronized (this) { + DetectionMainActivity.this.savedImagePath = "result.jpg"; + } + } + lastFrameIndex++; + if (lastFrameIndex >= 30) { + final int fps = (int) (lastFrameIndex * 1e9 / (System.nanoTime() - lastFrameTime)); + runOnUiThread(new Runnable() { + @SuppressLint("SetTextI18n") + public void run() { + tvStatus.setText(Integer.toString(fps) + "fps"); + } + }); + lastFrameIndex = 0; + lastFrameTime = System.nanoTime(); + } + return modified; + } + + /** + * @param path 路径 + * @param displayWidth 需要显示的宽度 + * @param displayHeight 需要显示的高度 + * @return Bitmap + */ + public static Bitmap decodeBitmap(String path, int displayWidth, int displayHeight) { + BitmapFactory.Options op = new BitmapFactory.Options(); + op.inJustDecodeBounds = true; + // op.inJustDecodeBounds = true;表示我们只读取Bitmap的宽高等信息,不读取像素。 + Bitmap bmp = BitmapFactory.decodeFile(path, op); // 获取尺寸信息 + // op.outWidth表示的是图像真实的宽度 + // op.inSamplySize 表示的是缩小的比例 + // op.inSamplySize = 4,表示缩小1/4的宽和高,1/16的像素,android认为设置为2是最快的。 + // 获取比例大小 + int wRatio = (int) Math.ceil(op.outWidth / (float) displayWidth); + int hRatio = (int) Math.ceil(op.outHeight / (float) displayHeight); + // 如果超出指定大小,则缩小相应的比例 + if (wRatio > 1 && hRatio > 1) { + if (wRatio > hRatio) { + // 如果太宽,我们就缩小宽度到需要的大小,注意,高度就会变得更加的小。 + op.inSampleSize = wRatio; + } else { + op.inSampleSize = hRatio; + } + } + op.inJustDecodeBounds = false; + bmp = BitmapFactory.decodeFile(path, op); + // 从原Bitmap创建一个给定宽高的Bitmap + return Bitmap.createScaledBitmap(bmp, displayWidth, displayHeight, true); + } + + @Override + protected void onResume() { + super.onResume(); + // Reload settings and re-initialize the predictor + checkAndUpdateSettings(); + // Open camera until the permissions have been granted + if (!checkAllPermissions()) { + svPreview.disableCamera(); + } + svPreview.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + svPreview.onPause(); + } + + @Override + protected void onDestroy() { + if (predictor != null) { + predictor.release(); + } + super.onDestroy(); + } + + public void initView() { + svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview); + svPreview.setOnTextureChangedListener(this); + tvStatus = (TextView) findViewById(R.id.tv_status); + btnSwitch = (ImageButton) findViewById(R.id.btn_switch); + btnSwitch.setOnClickListener(this); + btnShutter = (ImageButton) findViewById(R.id.btn_shutter); + btnShutter.setOnClickListener(this); + btnSettings = (ImageButton) findViewById(R.id.btn_settings); + btnSettings.setOnClickListener(this); + realtimeToggleButton = findViewById(R.id.realtime_toggle_btn); + realtimeToggleButton.setOnClickListener(this); + backInPreview = findViewById(R.id.back_in_preview); + backInPreview.setOnClickListener(this); + albumSelectButton = findViewById(R.id.albumSelect); + albumSelectButton.setOnClickListener(this); + mCameraPageView = findViewById(R.id.camera_page); + mResultPageView = findViewById(R.id.result_page); + resultImage = findViewById(R.id.result_image); + backInResult = findViewById(R.id.back_in_result); + backInResult.setOnClickListener(this); + confidenceSeekbar = findViewById(R.id.confidence_seekbar); + seekbarText = findViewById(R.id.seekbar_text); + detectResultView = findViewById(R.id.result_list_view); + + List results = new ArrayList<>(); + results.add(new BaseResultModel(1, "cup", 0.4f)); + results.add(new BaseResultModel(2, "pen", 0.6f)); + results.add(new BaseResultModel(3, "tang", 1.0f)); + final DetectResultAdapter adapter = new DetectResultAdapter(this, R.layout.detection_result_page_item, results); + detectResultView.setAdapter(adapter); + detectResultView.invalidate(); + + confidenceSeekbar.setMax(100); + confidenceSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + float resultConfidence = seekBar.getProgress() / 100f; + BigDecimal bd = new BigDecimal(resultConfidence); + resultNum = bd.setScale(1, BigDecimal.ROUND_HALF_UP).floatValue(); + seekbarText.setText(resultNum + ""); + confidenceSeekbar.setProgress((int) (resultNum * 100)); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (TYPE == ALBUM_SELECT) { + SystemClock.sleep(500); + predictor.predict(picBitmap, savedImagePath, resultNum); + resultImage.setImageBitmap(picBitmap); + picBitmap = originPicBitmap.copy(Bitmap.Config.ARGB_8888, true); + resultNum = 1.0f; + } else { + SystemClock.sleep(500); + predictor.predict(shutterBitmap, savedImagePath, resultNum); + resultImage.setImageBitmap(shutterBitmap); + shutterBitmap = originShutterBitmap.copy(Bitmap.Config.ARGB_8888, true); + resultNum = 1.0f; + } + } + }); + } + }); + } + + @SuppressLint("ApplySharedPref") + public void initSettings() { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.clear(); + editor.commit(); + DetectionSettingsActivity.resetSettings(); + } + + public void checkAndUpdateSettings() { + if (DetectionSettingsActivity.checkAndUpdateSettings(this)) { + String realModelDir = getCacheDir() + "/" + DetectionSettingsActivity.modelDir; + Utils.copyDirectoryFromAssets(this, DetectionSettingsActivity.modelDir, realModelDir); + String realLabelPath = getCacheDir() + "/" + DetectionSettingsActivity.labelPath; + Utils.copyFileFromAssets(this, DetectionSettingsActivity.labelPath, realLabelPath); + + String modelFile = realModelDir + "/" + "model.pdmodel"; + String paramsFile = realModelDir + "/" + "model.pdiparams"; + String configFile = realModelDir + "/" + "infer_cfg.yml"; + String labelFile = realLabelPath; + RuntimeOption option = new RuntimeOption(); + option.setCpuThreadNum(DetectionSettingsActivity.cpuThreadNum); + option.setLitePowerMode(DetectionSettingsActivity.cpuPowerMode); + option.enableRecordTimeOfRuntime(); + if (Boolean.parseBoolean(DetectionSettingsActivity.enableLiteFp16)) { + option.enableLiteFp16(); + } + predictor.init(modelFile, paramsFile, configFile, labelFile, option); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { + new AlertDialog.Builder(DetectionMainActivity.this) + .setTitle("Permission denied") + .setMessage("Click to force quit the app, then open Settings->Apps & notifications->Target " + + "App->Permissions to grant all of the permissions.") + .setCancelable(false) + .setPositiveButton("Exit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + DetectionMainActivity.this.finish(); + } + }).show(); + } + } + + private void requestAllPermissions() { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.CAMERA}, 0); + } + + private boolean checkAllPermissions() { + return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + && ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; + } +} diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/SettingsActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionSettingsActivity.java similarity index 97% rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/SettingsActivity.java rename to java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionSettingsActivity.java index 17e168f07..e31c228cf 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/SettingsActivity.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionSettingsActivity.java @@ -10,15 +10,15 @@ import android.preference.PreferenceManager; import android.support.v7.app.ActionBar; import com.baidu.paddle.fastdeploy.app.examples.R; -import com.baidu.paddle.fastdeploy.app.ui.AppCompatPreferenceActivity; +import com.baidu.paddle.fastdeploy.app.ui.view.AppCompatPreferenceActivity; import com.baidu.paddle.fastdeploy.app.ui.Utils; import java.util.ArrayList; import java.util.List; -public class SettingsActivity extends AppCompatPreferenceActivity implements +public class DetectionSettingsActivity extends AppCompatPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { - private static final String TAG = SettingsActivity.class.getSimpleName(); + private static final String TAG = DetectionSettingsActivity.class.getSimpleName(); static public int selectedModelIdx = -1; static public String modelDir = ""; @@ -46,7 +46,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity implements @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // addPreferencesFromResource(R.xml.settings); addPreferencesFromResource(R.xml.detection_settings); ActionBar supportActionBar = getSupportActionBar(); if (supportActionBar != null) { diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/MainActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/MainActivity.java deleted file mode 100644 index bbe184b45..000000000 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/MainActivity.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.baidu.paddle.fastdeploy.app.examples.detection; - - -import android.Manifest; -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.baidu.paddle.fastdeploy.RuntimeOption; -import com.baidu.paddle.fastdeploy.app.examples.R; -import com.baidu.paddle.fastdeploy.app.ui.CameraSurfaceView; -import com.baidu.paddle.fastdeploy.app.ui.Utils; -import com.baidu.paddle.fastdeploy.vision.DetectionResult; -import com.baidu.paddle.fastdeploy.vision.detection.PicoDet; - -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class MainActivity extends Activity implements View.OnClickListener, CameraSurfaceView.OnTextureChangedListener { - private static final String TAG = MainActivity.class.getSimpleName(); - - CameraSurfaceView svPreview; - TextView tvStatus; - ImageButton btnSwitch; - ImageButton btnShutter; - ImageButton btnSettings; - ImageView realtimeToggleButton; - boolean isRealtimeStatusRunning = false; - ImageView backInPreview; - - String savedImagePath = "result.jpg"; - int lastFrameIndex = 0; - long lastFrameTime; - - // Call 'init' and 'release' manually later - PicoDet predictor = new PicoDet(); - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Fullscreen - requestWindowFeature(Window.FEATURE_NO_TITLE); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - - setContentView(R.layout.activity_main); - - // Clear all setting items to avoid app crashing due to the incorrect settings - initSettings(); - - // Init the camera preview and UI components - initView(); - - // Check and request CAMERA and WRITE_EXTERNAL_STORAGE permissions - if (!checkAllPermissions()) { - requestAllPermissions(); - } - } - - @SuppressLint("NonConstantResourceId") - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.btn_switch: - svPreview.switchCamera(); - break; - case R.id.btn_shutter: - @SuppressLint("SimpleDateFormat") - SimpleDateFormat date = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); - synchronized (this) { - savedImagePath = Utils.getDCIMDirectory() + File.separator + date.format(new Date()).toString() + ".png"; - } - Toast.makeText(MainActivity.this, "Save snapshot to " + savedImagePath, Toast.LENGTH_SHORT).show(); - break; - case R.id.btn_settings: - startActivity(new Intent(MainActivity.this, SettingsActivity.class)); - break; - case R.id.realtime_toggle_btn: - toggleRealtimeStyle(); - break; - case R.id.back_in_preview: - finish(); - break; - } - } - - private void toggleRealtimeStyle() { - if (isRealtimeStatusRunning) { - isRealtimeStatusRunning = false; - realtimeToggleButton.setImageResource(R.drawable.realtime_stop_btn); - svPreview.setOnTextureChangedListener(this); - tvStatus.setVisibility(View.VISIBLE); - } else { - isRealtimeStatusRunning = true; - realtimeToggleButton.setImageResource(R.drawable.realtime_start_btn); - tvStatus.setVisibility(View.GONE); - svPreview.setOnTextureChangedListener(new CameraSurfaceView.OnTextureChangedListener() { - @Override - public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) { - return false; - } - }); - } - } - - @Override - public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) { - String savedImagePath = ""; - synchronized (this) { - savedImagePath = MainActivity.this.savedImagePath; - } - boolean modified = false; - DetectionResult result = predictor.predict( - ARGB8888ImageBitmap, savedImagePath, SettingsActivity.scoreThreshold); - modified = result.initialized(); - if (!savedImagePath.isEmpty()) { - synchronized (this) { - MainActivity.this.savedImagePath = "result.jpg"; - } - } - lastFrameIndex++; - if (lastFrameIndex >= 30) { - final int fps = (int) (lastFrameIndex * 1e9 / (System.nanoTime() - lastFrameTime)); - runOnUiThread(new Runnable() { - @SuppressLint("SetTextI18n") - public void run() { - tvStatus.setText(Integer.toString(fps) + "fps"); - } - }); - lastFrameIndex = 0; - lastFrameTime = System.nanoTime(); - } - return modified; - } - - @Override - protected void onResume() { - super.onResume(); - // Reload settings and re-initialize the predictor - checkAndUpdateSettings(); - // Open camera until the permissions have been granted - if (!checkAllPermissions()) { - svPreview.disableCamera(); - } - svPreview.onResume(); - } - - @Override - protected void onPause() { - super.onPause(); - svPreview.onPause(); - } - - @Override - protected void onDestroy() { - if (predictor != null) { - predictor.release(); - } - super.onDestroy(); - } - - public void initView() { - svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview); - svPreview.setOnTextureChangedListener(this); - tvStatus = (TextView) findViewById(R.id.tv_status); - btnSwitch = (ImageButton) findViewById(R.id.btn_switch); - btnSwitch.setOnClickListener(this); - btnShutter = (ImageButton) findViewById(R.id.btn_shutter); - btnShutter.setOnClickListener(this); - btnSettings = (ImageButton) findViewById(R.id.btn_settings); - btnSettings.setOnClickListener(this); - realtimeToggleButton = findViewById(R.id.realtime_toggle_btn); - realtimeToggleButton.setOnClickListener(this); - backInPreview = findViewById(R.id.back_in_preview); - backInPreview.setOnClickListener(this); - } - - @SuppressLint("ApplySharedPref") - public void initSettings() { - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.clear(); - editor.commit(); - SettingsActivity.resetSettings(); - } - - public void checkAndUpdateSettings() { - if (SettingsActivity.checkAndUpdateSettings(this)) { - String realModelDir = getCacheDir() + "/" + SettingsActivity.modelDir; - Utils.copyDirectoryFromAssets(this, SettingsActivity.modelDir, realModelDir); - String realLabelPath = getCacheDir() + "/" + SettingsActivity.labelPath; - Utils.copyFileFromAssets(this, SettingsActivity.labelPath, realLabelPath); - - String modelFile = realModelDir + "/" + "model.pdmodel"; - String paramsFile = realModelDir + "/" + "model.pdiparams"; - String configFile = realModelDir + "/" + "infer_cfg.yml"; - String labelFile = realLabelPath; - RuntimeOption option = new RuntimeOption(); - option.setCpuThreadNum(SettingsActivity.cpuThreadNum); - option.setLitePowerMode(SettingsActivity.cpuPowerMode); - option.enableRecordTimeOfRuntime(); - if (Boolean.parseBoolean(SettingsActivity.enableLiteFp16)) { - option.enableLiteFp16(); - } - predictor.init(modelFile, paramsFile, configFile, labelFile, option); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { - new AlertDialog.Builder(MainActivity.this) - .setTitle("Permission denied") - .setMessage("Click to force quit the app, then open Settings->Apps & notifications->Target " + - "App->Permissions to grant all of the permissions.") - .setCancelable(false) - .setPositiveButton("Exit", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - MainActivity.this.finish(); - } - }).show(); - } - } - - private void requestAllPermissions() { - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.CAMERA}, 0); - } - - private boolean checkAllPermissions() { - return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED - && ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; - } -} diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/MainActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java similarity index 84% rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/MainActivity.java rename to java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java index 0ea0486e0..ab61f366c 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/MainActivity.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrMainActivity.java @@ -25,8 +25,8 @@ import android.widget.Toast; import com.baidu.paddle.fastdeploy.RuntimeOption; import com.baidu.paddle.fastdeploy.app.examples.R; -import com.baidu.paddle.fastdeploy.app.ui.CameraSurfaceView; import com.baidu.paddle.fastdeploy.app.ui.Utils; +import com.baidu.paddle.fastdeploy.app.ui.view.CameraSurfaceView; import com.baidu.paddle.fastdeploy.vision.OCRResult; import com.baidu.paddle.fastdeploy.pipeline.PPOCRv2; import com.baidu.paddle.fastdeploy.vision.ocr.Classifier; @@ -37,8 +37,8 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; -public class MainActivity extends Activity implements View.OnClickListener, CameraSurfaceView.OnTextureChangedListener { - private static final String TAG = MainActivity.class.getSimpleName(); +public class OcrMainActivity extends Activity implements View.OnClickListener, CameraSurfaceView.OnTextureChangedListener { + private static final String TAG = OcrMainActivity.class.getSimpleName(); CameraSurfaceView svPreview; TextView tvStatus; @@ -64,7 +64,7 @@ public class MainActivity extends Activity implements View.OnClickListener, Came requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - setContentView(R.layout.activity_main); + setContentView(R.layout.ocr_activity_main); // Clear all setting items to avoid app crashing due to the incorrect settings initSettings(); @@ -91,10 +91,10 @@ public class MainActivity extends Activity implements View.OnClickListener, Came synchronized (this) { savedImagePath = Utils.getDCIMDirectory() + File.separator + date.format(new Date()).toString() + ".png"; } - Toast.makeText(MainActivity.this, "Save snapshot to " + savedImagePath, Toast.LENGTH_SHORT).show(); + Toast.makeText(OcrMainActivity.this, "Save snapshot to " + savedImagePath, Toast.LENGTH_SHORT).show(); break; case R.id.btn_settings: - startActivity(new Intent(MainActivity.this, SettingsActivity.class)); + startActivity(new Intent(OcrMainActivity.this, OcrSettingsActivity.class)); break; case R.id.realtime_toggle_btn: toggleRealtimeStyle(); @@ -128,14 +128,14 @@ public class MainActivity extends Activity implements View.OnClickListener, Came public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) { String savedImagePath = ""; synchronized (this) { - savedImagePath = MainActivity.this.savedImagePath; + savedImagePath = OcrMainActivity.this.savedImagePath; } boolean modified = false; OCRResult result = predictor.predict(ARGB8888ImageBitmap, savedImagePath); modified = result.initialized(); if (!savedImagePath.isEmpty()) { synchronized (this) { - MainActivity.this.savedImagePath = "result.jpg"; + OcrMainActivity.this.savedImagePath = "result.jpg"; } } lastFrameIndex++; @@ -201,12 +201,12 @@ public class MainActivity extends Activity implements View.OnClickListener, Came SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); editor.commit(); - SettingsActivity.resetSettings(); + OcrSettingsActivity.resetSettings(); } public void checkAndUpdateSettings() { - if (SettingsActivity.checkAndUpdateSettings(this)) { - String realModelDir = getCacheDir() + "/" + SettingsActivity.modelDir; + if (OcrSettingsActivity.checkAndUpdateSettings(this)) { + String realModelDir = getCacheDir() + "/" + OcrSettingsActivity.modelDir; // String detModelName = "ch_PP-OCRv2_det_infer"; String detModelName = "ch_PP-OCRv3_det_infer"; // String detModelName = "ch_ppocr_mobile_v2.0_det_infer"; @@ -217,14 +217,14 @@ public class MainActivity extends Activity implements View.OnClickListener, Came String realDetModelDir = realModelDir + "/" + detModelName; String realClsModelDir = realModelDir + "/" + clsModelName; String realRecModelDir = realModelDir + "/" + recModelName; - String srcDetModelDir = SettingsActivity.modelDir + "/" + detModelName; - String srcClsModelDir = SettingsActivity.modelDir + "/" + clsModelName; - String srcRecModelDir = SettingsActivity.modelDir + "/" + recModelName; + String srcDetModelDir = OcrSettingsActivity.modelDir + "/" + detModelName; + String srcClsModelDir = OcrSettingsActivity.modelDir + "/" + clsModelName; + String srcRecModelDir = OcrSettingsActivity.modelDir + "/" + recModelName; Utils.copyDirectoryFromAssets(this, srcDetModelDir, realDetModelDir); Utils.copyDirectoryFromAssets(this, srcClsModelDir, realClsModelDir); Utils.copyDirectoryFromAssets(this, srcRecModelDir, realRecModelDir); - String realLabelPath = getCacheDir() + "/" + SettingsActivity.labelPath; - Utils.copyFileFromAssets(this, SettingsActivity.labelPath, realLabelPath); + String realLabelPath = getCacheDir() + "/" + OcrSettingsActivity.labelPath; + Utils.copyFileFromAssets(this, OcrSettingsActivity.labelPath, realLabelPath); String detModelFile = realDetModelDir + "/" + "inference.pdmodel"; String detParamsFile = realDetModelDir + "/" + "inference.pdiparams"; @@ -236,16 +236,16 @@ public class MainActivity extends Activity implements View.OnClickListener, Came RuntimeOption detOption = new RuntimeOption(); RuntimeOption clsOption = new RuntimeOption(); RuntimeOption recOption = new RuntimeOption(); - detOption.setCpuThreadNum(SettingsActivity.cpuThreadNum); - clsOption.setCpuThreadNum(SettingsActivity.cpuThreadNum); - recOption.setCpuThreadNum(SettingsActivity.cpuThreadNum); - detOption.setLitePowerMode(SettingsActivity.cpuPowerMode); - clsOption.setLitePowerMode(SettingsActivity.cpuPowerMode); - recOption.setLitePowerMode(SettingsActivity.cpuPowerMode); + detOption.setCpuThreadNum(OcrSettingsActivity.cpuThreadNum); + clsOption.setCpuThreadNum(OcrSettingsActivity.cpuThreadNum); + recOption.setCpuThreadNum(OcrSettingsActivity.cpuThreadNum); + detOption.setLitePowerMode(OcrSettingsActivity.cpuPowerMode); + clsOption.setLitePowerMode(OcrSettingsActivity.cpuPowerMode); + recOption.setLitePowerMode(OcrSettingsActivity.cpuPowerMode); detOption.enableRecordTimeOfRuntime(); clsOption.enableRecordTimeOfRuntime(); recOption.enableRecordTimeOfRuntime(); - if (Boolean.parseBoolean(SettingsActivity.enableLiteFp16)) { + if (Boolean.parseBoolean(OcrSettingsActivity.enableLiteFp16)) { detOption.enableLiteFp16(); clsOption.enableLiteFp16(); recOption.enableLiteFp16(); @@ -263,7 +263,7 @@ public class MainActivity extends Activity implements View.OnClickListener, Came @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { - new AlertDialog.Builder(MainActivity.this) + new AlertDialog.Builder(OcrMainActivity.this) .setTitle("Permission denied") .setMessage("Click to force quit the app, then open Settings->Apps & notifications->Target " + "App->Permissions to grant all of the permissions.") @@ -271,7 +271,7 @@ public class MainActivity extends Activity implements View.OnClickListener, Came .setPositiveButton("Exit", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - MainActivity.this.finish(); + OcrMainActivity.this.finish(); } }).show(); } diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/SettingsActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java similarity index 97% rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/SettingsActivity.java rename to java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java index ea2c4ff72..6f8c45ff4 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/SettingsActivity.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ocr/OcrSettingsActivity.java @@ -10,15 +10,15 @@ import android.preference.PreferenceManager; import android.support.v7.app.ActionBar; import com.baidu.paddle.fastdeploy.app.examples.R; -import com.baidu.paddle.fastdeploy.app.ui.AppCompatPreferenceActivity; import com.baidu.paddle.fastdeploy.app.ui.Utils; +import com.baidu.paddle.fastdeploy.app.ui.view.AppCompatPreferenceActivity; import java.util.ArrayList; import java.util.List; -public class SettingsActivity extends AppCompatPreferenceActivity implements +public class OcrSettingsActivity extends AppCompatPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { - private static final String TAG = SettingsActivity.class.getSimpleName(); + private static final String TAG = OcrSettingsActivity.class.getSimpleName(); static public int selectedModelIdx = -1; static public String modelDir = ""; diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/ActionBarLayout.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java similarity index 94% rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/ActionBarLayout.java rename to java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java index 6616a290b..099219fa9 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/ActionBarLayout.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/layout/ActionBarLayout.java @@ -1,4 +1,4 @@ -package com.baidu.paddle.fastdeploy.app.ui; +package com.baidu.paddle.fastdeploy.app.ui.layout; import android.content.Context; import android.graphics.Color; diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/AppCompatPreferenceActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java similarity index 98% rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/AppCompatPreferenceActivity.java rename to java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java index 8195c52fa..c1a952dcf 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/AppCompatPreferenceActivity.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/AppCompatPreferenceActivity.java @@ -1,4 +1,4 @@ -package com.baidu.paddle.fastdeploy.app.ui; +package com.baidu.paddle.fastdeploy.app.ui.view; import android.content.res.Configuration; import android.os.Bundle; diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/CameraSurfaceView.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java similarity index 99% rename from java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/CameraSurfaceView.java rename to java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java index 6db97d68a..06248fede 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/CameraSurfaceView.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/CameraSurfaceView.java @@ -1,4 +1,4 @@ -package com.baidu.paddle.fastdeploy.app.ui; +package com.baidu.paddle.fastdeploy.app.ui.view; import android.content.Context; import android.graphics.Bitmap; @@ -15,6 +15,8 @@ import android.opengl.Matrix; import android.util.AttributeSet; import android.util.Log; +import com.baidu.paddle.fastdeploy.app.ui.Utils; + import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java new file mode 100644 index 000000000..62b48a054 --- /dev/null +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/ResultListView.java @@ -0,0 +1,43 @@ +package com.baidu.paddle.fastdeploy.app.ui.view; + +import android.content.Context; +import android.os.Handler; +import android.util.AttributeSet; +import android.widget.ListView; + +public class ResultListView extends ListView { + public ResultListView(Context context) { + super(context); + } + + public ResultListView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ResultListView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + private Handler handler; + + public void setHandler(Handler mHandler) { + handler = mHandler; + } + + public void clear() { + handler.post(new Runnable() { + @Override + public void run() { + removeAllViewsInLayout(); + invalidate(); + } + }); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, + MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, expandSpec); + } +} diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/DetectResultAdapter.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/DetectResultAdapter.java new file mode 100644 index 000000000..404b9cbc5 --- /dev/null +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/adapter/DetectResultAdapter.java @@ -0,0 +1,48 @@ +package com.baidu.paddle.fastdeploy.app.ui.view.adapter; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.baidu.paddle.fastdeploy.app.examples.R; +import com.baidu.paddle.fastdeploy.app.ui.view.model.BaseResultModel; + +import java.text.DecimalFormat; +import java.util.List; + +public class DetectResultAdapter extends ArrayAdapter { + private int resourceId; + + public DetectResultAdapter(@NonNull Context context, int resource) { + super(context, resource); + } + + public DetectResultAdapter(@NonNull Context context, int resource, @NonNull List objects) { + super(context, resource, objects); + resourceId = resource; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + BaseResultModel model = getItem(position); + View view = LayoutInflater.from(getContext()).inflate(resourceId, null); + TextView indexText = (TextView) view.findViewById(R.id.index); + TextView nameText = (TextView) view.findViewById(R.id.name); + TextView confidenceText = (TextView) view.findViewById(R.id.confidence); + indexText.setText(String.valueOf(model.getIndex())); + nameText.setText(String.valueOf(model.getName())); + confidenceText.setText(formatFloatString(model.getConfidence())); + return view; + } + + public static String formatFloatString(float number) { + DecimalFormat df = new DecimalFormat("0.00"); + return df.format(number); + } +} diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java new file mode 100644 index 000000000..cae71b690 --- /dev/null +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/ui/view/model/BaseResultModel.java @@ -0,0 +1,41 @@ +package com.baidu.paddle.fastdeploy.app.ui.view.model; + +public class BaseResultModel { + private int index; + private String name; + private float confidence; + + public BaseResultModel() { + + } + + public BaseResultModel(int index, String name, float confidence) { + this.index = index; + this.name = name; + this.confidence = confidence; + } + + public float getConfidence() { + return confidence; + } + + public void setConfidence(float confidence) { + this.confidence = confidence; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/java/android/app/src/main/res/layout-land/activity_main.xml b/java/android/app/src/main/res/layout-land/activity_main.xml deleted file mode 100644 index d6e88a09a..000000000 --- a/java/android/app/src/main/res/layout-land/activity_main.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/java/android/app/src/main/res/layout-land/detection_activity_main.xml b/java/android/app/src/main/res/layout-land/detection_activity_main.xml new file mode 100644 index 000000000..1a75970f4 --- /dev/null +++ b/java/android/app/src/main/res/layout-land/detection_activity_main.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/java/android/app/src/main/res/layout-land/ocr_activity_main.xml b/java/android/app/src/main/res/layout-land/ocr_activity_main.xml new file mode 100644 index 000000000..b30f35edf --- /dev/null +++ b/java/android/app/src/main/res/layout-land/ocr_activity_main.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/java/android/app/src/main/res/layout/detection_activity_main.xml b/java/android/app/src/main/res/layout/detection_activity_main.xml new file mode 100644 index 000000000..1a75970f4 --- /dev/null +++ b/java/android/app/src/main/res/layout/detection_activity_main.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/java/android/app/src/main/res/layout/activity_main.xml b/java/android/app/src/main/res/layout/detection_camera_page.xml similarity index 92% rename from java/android/app/src/main/res/layout/activity_main.xml rename to java/android/app/src/main/res/layout/detection_camera_page.xml index b6efea6d6..da262b58b 100644 --- a/java/android/app/src/main/res/layout/activity_main.xml +++ b/java/android/app/src/main/res/layout/detection_camera_page.xml @@ -5,15 +5,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true" - tools:context="com.baidu.paddle.fastdeploy.app.examples.ocr.MainActivity"> + tools:context=".detection.DetectionMainActivity"> - @@ -42,7 +42,7 @@ android:layout_height="wrap_content" android:text="@string/action_bar_take_photo" android:textAlignment="center" - android:visibility="gone" /> + android:visibility="gone"/> + - - - - + + android:scaleType="fitXY" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/android/app/src/main/res/layout/detection_result_page_item.xml b/java/android/app/src/main/res/layout/detection_result_page_item.xml new file mode 100644 index 000000000..6a2b09ebf --- /dev/null +++ b/java/android/app/src/main/res/layout/detection_result_page_item.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/java/android/app/src/main/res/layout/ocr_activity_main.xml b/java/android/app/src/main/res/layout/ocr_activity_main.xml new file mode 100644 index 000000000..b30f35edf --- /dev/null +++ b/java/android/app/src/main/res/layout/ocr_activity_main.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/java/android/app/src/main/res/layout/ocr_camera_page.xml b/java/android/app/src/main/res/layout/ocr_camera_page.xml new file mode 100644 index 000000000..4fb00472a --- /dev/null +++ b/java/android/app/src/main/res/layout/ocr_camera_page.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/android/app/src/main/res/layout/ocr_result_page.xml b/java/android/app/src/main/res/layout/ocr_result_page.xml new file mode 100644 index 000000000..958a85940 --- /dev/null +++ b/java/android/app/src/main/res/layout/ocr_result_page.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/android/app/src/main/res/layout/ocr_result_page_item.xml b/java/android/app/src/main/res/layout/ocr_result_page_item.xml new file mode 100644 index 000000000..6a2b09ebf --- /dev/null +++ b/java/android/app/src/main/res/layout/ocr_result_page_item.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/java/android/app/src/main/res/values/strings.xml b/java/android/app/src/main/res/values/strings.xml index 1d8f1c2da..2bd2e4355 100644 --- a/java/android/app/src/main/res/values/strings.xml +++ b/java/android/app/src/main/res/values/strings.xml @@ -1,9 +1,9 @@ - FastDeploy PicoDet + EasyEdge - FastDeploy PicoDet - FastDeploy PP-OCRv2 + EasyEdge + EasyEdge CHOOSE_INSTALLED_MODEL_KEY MODEL_DIR_KEY @@ -17,6 +17,7 @@ LITE_POWER_HIGH 0.4 true + models/picodet_s_320_coco_lcnet labels/coco_label_list.txt @@ -35,4 +36,4 @@ 阈值控制 重新识别 保存结果 - \ No newline at end of file + diff --git a/java/android/app/src/main/res/values/values.xml b/java/android/app/src/main/res/values/values.xml new file mode 100644 index 000000000..156146d9a --- /dev/null +++ b/java/android/app/src/main/res/values/values.xml @@ -0,0 +1,17 @@ + + + 120dp + 46px + + 126px + 136px + + 46px + + 36px + + 15dp + + 15dp + + \ No newline at end of file diff --git a/java/android/app/src/main/res/xml/settings.xml b/java/android/app/src/main/res/xml/default_settings.xml similarity index 100% rename from java/android/app/src/main/res/xml/settings.xml rename to java/android/app/src/main/res/xml/default_settings.xml