From 1737fcbf426455f76c09158d622bd5346fd12950 Mon Sep 17 00:00:00 2001 From: MRSa Date: Sun, 19 May 2019 22:56:57 +0900 Subject: [PATCH] =?utf8?q?=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8=E3=81=A0?= =?utf8?q?=E3=81=91=E3=80=81preference=E3=81=AE=E6=BA=96=E5=82=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../gokigen/cameratest/ConfirmationDialog.java | 99 +++++++++++ .../gokigen/cameratest/IApplicationControl.java | 7 + .../net/osdn/gokigen/cameratest/MainActivity.java | 10 +- .../osdn/gokigen/cameratest/camtest/CamTest.java | 16 +- .../fuji/preference/FujiPreferenceFragment.java | 59 ++++++ .../preference/IPreferencePropertyAccessor.java | 10 ++ .../fuji/preference/PowerOffController.java | 65 +++++++ .../gokigen/cameratest/logcat/LogCatExporter.java | 64 +++++++ .../gokigen/cameratest/logcat/LogCatFragment.java | 198 +++++++++++++++++++++ .../gokigen/cameratest/logcat/LogCatUpdater.java | 69 +++++++ .../cameratest/pages/SectionsPagerAdapter.java | 44 ++++- .../drawable/ic_power_settings_new_black_24dp.xml | 9 + .../main/res/drawable/ic_refresh_black_24dp.xml | 9 + app/src/main/res/menu/debug_view.xml | 12 ++ app/src/main/res/menu/menu_main.xml | 13 +- app/src/main/res/values/arrays.xml | 15 ++ app/src/main/res/values/strings.xml | 29 +++ app/src/main/res/values/styles.xml | 1 + app/src/main/res/xml/preferences_fuji_x.xml | 58 ++++++ 20 files changed, 770 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/ConfirmationDialog.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/IApplicationControl.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/PowerOffController.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatExporter.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatFragment.java create mode 100644 app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatUpdater.java create mode 100644 app/src/main/res/drawable/ic_power_settings_new_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_refresh_black_24dp.xml create mode 100644 app/src/main/res/menu/debug_view.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/xml/preferences_fuji_x.xml diff --git a/app/build.gradle b/app/build.gradle index 856de1d..0db7f5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,6 +21,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0-alpha04' implementation 'com.google.android.material:material:1.1.0-alpha06' + implementation 'androidx.preference:preference:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation project(':opencv41') } diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/ConfirmationDialog.java b/app/src/main/java/net/osdn/gokigen/cameratest/ConfirmationDialog.java new file mode 100644 index 0000000..6e4b4ab --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/ConfirmationDialog.java @@ -0,0 +1,99 @@ +package net.osdn.gokigen.cameratest; + +import android.content.Context; +import android.content.DialogInterface; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatDialogFragment; + +public class ConfirmationDialog extends AppCompatDialogFragment +{ + private Context context = null; + + public static ConfirmationDialog newInstance(Context context) + { + ConfirmationDialog instance = new ConfirmationDialog(); + instance.prepare(context); + + return (instance); + } + + private void prepare(Context context) + { + this.context = context; + } + + public void show(int titleResId, int messageResId, final Callback callback) + { + String title = ""; + String message = ""; + + // タイトルとメッセージをのダイアログを表示する + if (context != null) + { + title = context.getString(titleResId); + message = context.getString(messageResId); + } + show(title, message, callback); + } + + public void show(String title, String message, final Callback callback) + { + // 確認ダイアログの生成 + final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); + alertDialog.setTitle(title); + alertDialog.setIcon(android.R.drawable.ic_dialog_alert); + alertDialog.setMessage(message); + alertDialog.setCancelable(true); + + // ボタンを設定する(実行ボタン) + alertDialog.setPositiveButton(context.getString(R.string.dialog_positive_execute), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + callback.confirm(); + dialog.dismiss(); + } + }); + + // ボタンを設定する (キャンセルボタン) + alertDialog.setNegativeButton(context.getString(R.string.dialog_negative_cancel), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + dialog.cancel(); + } + }); + + // 確認ダイアログを表示する + alertDialog.show(); + } + + public void show(int iconResId, String title, String message) + { + // 表示イアログの生成 + final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); + alertDialog.setTitle(title); + alertDialog.setIcon(iconResId); + alertDialog.setMessage(message); + alertDialog.setCancelable(true); + + // ボタンを設定する(実行ボタン) + alertDialog.setPositiveButton(context.getString(R.string.dialog_positive_execute), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) + { + dialog.dismiss(); + } + }); + + // 確認ダイアログを表示する + alertDialog.show(); + } + + // コールバックインタフェース + public interface Callback + { + void confirm(); + } +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/IApplicationControl.java b/app/src/main/java/net/osdn/gokigen/cameratest/IApplicationControl.java new file mode 100644 index 0000000..434a668 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/IApplicationControl.java @@ -0,0 +1,7 @@ +package net.osdn.gokigen.cameratest; + +public interface IApplicationControl +{ + void exitApplication(); + +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/MainActivity.java b/app/src/main/java/net/osdn/gokigen/cameratest/MainActivity.java index 4265b7c..59b1b11 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/MainActivity.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/MainActivity.java @@ -27,7 +27,7 @@ import net.osdn.gokigen.cameratest.pages.SectionsPagerAdapter; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; -public class MainActivity extends AppCompatActivity +public class MainActivity extends AppCompatActivity implements IApplicationControl { /////// OpenCV /////// : license https://opencv.org/license/ static @@ -77,7 +77,7 @@ public class MainActivity extends AppCompatActivity // Create the adapter that will return a fragment for each of the three // primary sections of the activity. - mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), testTarget); + mSectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager(), testTarget, this); // Set up the ViewPager with the sections adapter. mViewPager = findViewById(R.id.container); @@ -173,13 +173,12 @@ public class MainActivity extends AppCompatActivity testTarget.disconnect(); return (true); } +/* if (id == R.id.action_settings) { testTarget.settings(); return (true); } - -/* if (id == R.id.action_reset) { testTarget.resetConnection(); @@ -250,7 +249,8 @@ public class MainActivity extends AppCompatActivity /** * */ - private void exitApplication() + @Override + public void exitApplication() { try { diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java b/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java index 68a77b8..6b28353 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java @@ -14,6 +14,7 @@ import com.google.android.material.snackbar.Snackbar; import net.osdn.gokigen.cameratest.R; import net.osdn.gokigen.cameratest.fuji.Connection; +import net.osdn.gokigen.cameratest.fuji.preference.FujiPreferenceFragment; import net.osdn.gokigen.cameratest.fuji.ILiveViewImage; import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder; import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatus; @@ -27,6 +28,8 @@ public class CamTest implements View.OnClickListener, View.OnTouchListener, ILiv private final Activity activity; private TextView textview; private Connection connection; + + private FujiPreferenceFragment preferenceFragment = null; //private FileOutputStream outputStream = null; private static final int offsetSize = 18; // 4byte: データサイズ、14byte: (謎の)ヘッダ @@ -113,14 +116,25 @@ public class CamTest implements View.OnClickListener, View.OnTouchListener, ILiv } } +/* public void settings() { Log.v(TAG, "Show settings menu"); + if (preferenceFragment == null) + { + preferenceFragment = FujiPreferenceFragment.newInstance(); + } + FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); + transaction.replace(R.id.fragment1, logCatFragment); + // backstackに追加 + transaction.addToBackStack(null); + transaction.commit(); + + showMessageText("BBBB"); } -/* public void valueUp() { Log.v(TAG, "value UP"); diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java new file mode 100644 index 0000000..d1fc3c4 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java @@ -0,0 +1,59 @@ +package net.osdn.gokigen.cameratest.fuji.preference; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; + +import net.osdn.gokigen.cameratest.IApplicationControl; +import net.osdn.gokigen.cameratest.R; + +public class FujiPreferenceFragment extends PreferenceFragmentCompat +{ + private PowerOffController powerOffController = null; + + /** + * + * + */ + public static FujiPreferenceFragment newInstance(@NonNull Context context, @NonNull IApplicationControl control) + { + FujiPreferenceFragment instance = new FujiPreferenceFragment(); + instance.prepare(context, control); + + // パラメータはBundleにまとめておく + Bundle arguments = new Bundle(); + //arguments.putString("title", title); + //arguments.putString("message", message); + instance.setArguments(arguments); + + return (instance); + } + + private void prepare(@NonNull Context context, @NonNull IApplicationControl control) + { + powerOffController = new PowerOffController(context, control); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) + { + setPreferencesFromResource(R.xml.preferences_fuji_x, rootKey); + + ListPreference connectionMethod = (ListPreference) findPreference(IPreferencePropertyAccessor.CONNECTION_METHOD); + connectionMethod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + preference.setSummary(newValue + " "); + return (true); + } + }); + connectionMethod.setSummary(connectionMethod.getValue() + " "); + + findPreference("exit_application").setOnPreferenceClickListener(powerOffController); + + } +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java new file mode 100644 index 0000000..54f3f60 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java @@ -0,0 +1,10 @@ +package net.osdn.gokigen.cameratest.fuji.preference; + +public interface IPreferencePropertyAccessor +{ + String EXIT_APPLICATION = "exit_application"; + String CONNECTION_METHOD = "connection_method"; + String CONNECTION_METHOD_DEFAULT_VALUE = "FUJI_X"; + + +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/PowerOffController.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/PowerOffController.java new file mode 100644 index 0000000..859604f --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/PowerOffController.java @@ -0,0 +1,65 @@ +package net.osdn.gokigen.cameratest.fuji.preference; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.preference.Preference; + +import net.osdn.gokigen.cameratest.ConfirmationDialog; +import net.osdn.gokigen.cameratest.IApplicationControl; +import net.osdn.gokigen.cameratest.R; + +public class PowerOffController implements Preference.OnPreferenceClickListener, ConfirmationDialog.Callback +{ + private final Context context; + private final IApplicationControl appControl; + private String preferenceKey = null; + + PowerOffController(@NonNull Context context, @NonNull IApplicationControl control) + { + this.context = context; + this.appControl = control; + } + + @Override + public boolean onPreferenceClick(Preference preference) + { + if (!preference.hasKey()) + { + return (false); + } + + preferenceKey = preference.getKey(); + if (preferenceKey.contains(IPreferencePropertyAccessor.EXIT_APPLICATION)) + { + + // 確認ダイアログの生成と表示 + ConfirmationDialog dialog = ConfirmationDialog.newInstance(context); + dialog.show(R.string.dialog_title_confirmation, R.string.dialog_message_power_off, this); + return (true); + } + return (false); + } + + /** + * + * + */ + @Override + public void confirm() + { + try + { + if (preferenceKey.contains(IPreferencePropertyAccessor.EXIT_APPLICATION)) + { + // カメラの電源をOFFにしたうえで、アプリケーションを終了する。 + appControl.exitApplication(); + + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatExporter.java b/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatExporter.java new file mode 100644 index 0000000..0830eca --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatExporter.java @@ -0,0 +1,64 @@ +package net.osdn.gokigen.cameratest.logcat; + +import android.app.Activity; +import android.content.Intent; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; + +import androidx.annotation.NonNull; + +import net.osdn.gokigen.cameratest.ConfirmationDialog; +import net.osdn.gokigen.cameratest.R; + +class LogCatExporter implements AdapterView.OnItemLongClickListener +{ + private final String TAG = toString(); + private final Activity activity; + + LogCatExporter(@NonNull Activity context) + { + this.activity = context; + + } + + @Override + public boolean onItemLongClick(final AdapterView adapterView, View view, int i, long l) + { + Log.v(TAG, "onItemLongClick()" ); + + ConfirmationDialog confirm = ConfirmationDialog.newInstance(activity); + + confirm.show(R.string.dialog_confirm_title_output_log, R.string.dialog_confirm_message_output_log, new ConfirmationDialog.Callback() { + @Override + public void confirm() + { + Log.v(TAG, "confirm()" ); + try { + StringBuilder buf = new StringBuilder(); + ArrayAdapter adapter = (ArrayAdapter) adapterView.getAdapter(); + for (int index = 0; index < adapter.getCount(); index++) + { + buf.append(adapter.getItem(index)); + buf.append("\r\n"); + } + + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TITLE, "debug log for " + activity.getString(R.string.app_name)); + intent.putExtra(Intent.EXTRA_TEXT, new String(buf)); + activity.startActivity(intent); + + // Toast.makeText(activity, adapter.getItem(adapter.getCount() - 1), Toast.LENGTH_SHORT).show(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + }); + return (true); + } +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatFragment.java b/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatFragment.java new file mode 100644 index 0000000..d5df593 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatFragment.java @@ -0,0 +1,198 @@ +package net.osdn.gokigen.cameratest.logcat; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.ListFragment; + +import net.osdn.gokigen.cameratest.R; + +/** + * + */ +public class LogCatFragment extends ListFragment +{ + private final String TAG = toString(); + private ArrayAdapter adapter; + private List dataItems = new ArrayList<>(); + private LogCatUpdater updater = new LogCatUpdater(); + public static LogCatFragment newInstance() + { + LogCatFragment instance = new LogCatFragment(); + + // パラメータはBundleにまとめておく + Bundle arguments = new Bundle(); + //arguments.putString("title", title); + //arguments.putString("message", message); + instance.setArguments(arguments); + + //instance.prepare(); + return (instance); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) + { + inflater.inflate(R.menu.debug_view, menu); +/* + String title = getString(R.string.app_name) + " " + getString(R.string.pref_degug_info); + try { + AppCompatActivity activity = (AppCompatActivity) getActivity(); + ActionBar bar = activity.getSupportActionBar(); + if (bar != null) + { + bar.setTitle(title); + } + } + catch (Exception e) + { + e.printStackTrace(); + } +*/ + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + if (item.getItemId() == R.id.action_refresh) + { + update(); + return true; + } + return super.onOptionsItemSelected(item); + } + + /** + * 表示データの更新 + * + */ + private void update() + { + dataItems.clear(); + Thread thread = new Thread(new Runnable() + { + @Override + public void run() + { + Log.v(TAG, "START LOGCAT"); + dataItems = updater.getLogCat("main", "time", "*:v", "gokigen", ""); + Log.v(TAG, "FINISH LOGCAT"); + try + { + final FragmentActivity activity = getActivity(); + if (activity != null) + { + activity.runOnUiThread(new Runnable() + { + @Override + public void run() + { + try + { + // 中身があったらクリアする + if (adapter.getCount() > 0) + { + adapter.clear(); + } + + // リストの内容を更新する + adapter.addAll(dataItems); + + // 最下部にカーソルを移したい + ListView view = activity.findViewById(android.R.id.list); + view.setSelection(dataItems.size()); + + // 更新終了通知 + //Snackbar.make(getActivity().findViewById(R.id.fragment1), getString(R.string.finish_refresh), Snackbar.LENGTH_SHORT).show(); + Toast.makeText(getActivity(), getString(R.string.finish_refresh), Toast.LENGTH_SHORT).show(); + } + catch (Exception ee) + { + ee.printStackTrace(); + } + } + }); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + }); + try + { + // 本当は、ここでダイアログを出したい + thread.start(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public void onResume() + { + super.onResume(); + Log.v(TAG, "onResume()"); + + update(); + } + + @Override + public void onPause() + { + super.onPause(); + Log.v(TAG, "onPause()"); + } + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Log.v(TAG, "LogCatFragment::onCreate()"); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) + { + super.onActivityCreated(savedInstanceState); + Log.v(TAG, "LogCatFragment::onActivityCreated()"); + setHasOptionsMenu(true); + + Activity activity = getActivity(); + if (activity != null) + { + ListView view = getListView(); + if (view != null) + { + getListView().setOnItemLongClickListener(new LogCatExporter(activity)); + } + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { + adapter = new ArrayAdapter<>(inflater.getContext(), android.R.layout.simple_list_item_1, dataItems); + setListAdapter(adapter); + + return (super.onCreateView(inflater, container, savedInstanceState)); + } +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatUpdater.java b/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatUpdater.java new file mode 100644 index 0000000..46bfe79 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/cameratest/logcat/LogCatUpdater.java @@ -0,0 +1,69 @@ +package net.osdn.gokigen.cameratest.logcat; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +class LogCatUpdater +{ + LogCatUpdater() + { + // + } + + /** + * + * @param ringbuffer : main - メイン ログバッファ, radio - 無線通信や電話に関連するメッセージが含まれるバッファ, events - イベントに関連するメッセージが含まれるバッファ + * @param logFormat : brief - 優先度 / タグとメッセージ発行元プロセスの PID, process - PID のみ, tag - 優先度 / タグのみ, raw - 生のログ, time - 日付、起動時刻、優先度 / タグ、メッセージ発行元プロセスの PID , threadtime - 日付、起動時刻、優先度、タグ、メッセージ発行元スレッドの PID および TID, long - すべてのメタデータ フィールド + * @param filterSpec : レベル : SFEWIDV + * @param filterString : 指定した文字列がログに含まれている場合に表示 + * @param filterRegEx : 指定した正規表現の文字列がログに含まれている場合に表示 + * @return ログのリスト + */ + + List getLogCat(String ringbuffer, String logFormat, String filterSpec, String filterString, String filterRegEx) + { + final int BUFFER_SIZE = 8192; + ArrayList listItems = new ArrayList(); + try + { + ArrayList commandLine = new ArrayList(); + commandLine.add("logcat"); + commandLine.add("-d"); // -d: dump the log and then exit (don't block) + commandLine.add("-b"); // -b : request alternate ring buffer ('main' (default), 'radio', 'events') + commandLine.add(ringbuffer); // option. + commandLine.add("-v"); // -v : Sets the log print format, where is one of: + commandLine.add(logFormat); // brief process tag thread raw time threadtime long + commandLine.add(filterSpec); // + Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[commandLine.size()])); + + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()), BUFFER_SIZE); + String line; + do + { + line = bufferedReader.readLine(); + try + { + int filterLength = filterString.length(); + int filterRegExLength = filterRegEx.length(); + if (((filterLength == 0)&&(filterRegExLength == 0))|| + ((filterLength > 0)&&(line.contains(filterString)))|| + ((filterRegExLength > 0)&&(line.matches(filterRegEx)))) + { + listItems.add(line); + } + } + catch (Exception ee) + { + ee.printStackTrace(); + } + } while (line != null); + } + catch (Exception e) + { + e.printStackTrace(); + } + return (listItems); + } +} diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/pages/SectionsPagerAdapter.java b/app/src/main/java/net/osdn/gokigen/cameratest/pages/SectionsPagerAdapter.java index ec0b71d..3e8a94d 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/pages/SectionsPagerAdapter.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/pages/SectionsPagerAdapter.java @@ -1,7 +1,13 @@ package net.osdn.gokigen.cameratest.pages; +import android.content.Context; + +import net.osdn.gokigen.cameratest.IApplicationControl; import net.osdn.gokigen.cameratest.camtest.CamTest; +import net.osdn.gokigen.cameratest.fuji.preference.FujiPreferenceFragment; +import net.osdn.gokigen.cameratest.logcat.LogCatFragment; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; @@ -12,25 +18,49 @@ import androidx.fragment.app.FragmentPagerAdapter; */ public class SectionsPagerAdapter extends FragmentPagerAdapter { + private final Context context; private final CamTest testTarget; - public SectionsPagerAdapter(FragmentManager fm, CamTest testTarget) + private final IApplicationControl appControl; + private LogCatFragment logCatFragment = null; + private FujiPreferenceFragment preferenceFragment = null; + private TestViewFragment testViewFragment = null; + public SectionsPagerAdapter(@NonNull Context context, FragmentManager fm, CamTest testTarget, IApplicationControl control) { super(fm); + this.context = context; this.testTarget = testTarget; + this.appControl = control; } @Override - public Fragment getItem(int position) + public @NonNull Fragment getItem(int position) { - // getItem is called to instantiate the fragment for the given page. - // Return a TestViewFragment (defined as a static inner class below). - return TestViewFragment.newInstance((position + 1), testTarget); + if (position == 2) + { + if (logCatFragment == null) + { + logCatFragment = LogCatFragment.newInstance(); + } + return (logCatFragment); + } + else if (position == 1) + { + if (preferenceFragment == null) + { + preferenceFragment = FujiPreferenceFragment.newInstance(context, appControl); + } + return (preferenceFragment); + } + if (testViewFragment == null) + { + testViewFragment = TestViewFragment.newInstance((position + 1), testTarget); + } + return (testViewFragment); } @Override public int getCount() { - // Show only one page. - return 1; + return 3; } } diff --git a/app/src/main/res/drawable/ic_power_settings_new_black_24dp.xml b/app/src/main/res/drawable/ic_power_settings_new_black_24dp.xml new file mode 100644 index 0000000..26272ab --- /dev/null +++ b/app/src/main/res/drawable/ic_power_settings_new_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh_black_24dp.xml b/app/src/main/res/drawable/ic_refresh_black_24dp.xml new file mode 100644 index 0000000..8229a9a --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/debug_view.xml b/app/src/main/res/menu/debug_view.xml new file mode 100644 index 0000000..731369b --- /dev/null +++ b/app/src/main/res/menu/debug_view.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 3f56b52..412e244 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -12,11 +12,7 @@ android:orderInCategory="100" android:title="@string/action_wifi_settings" app:showAsAction="never" /> - + + + + + + + Fuji X Series + Ricoh GR II / PENTAX DSLR + OPC(Olympus Air) + + + + FUJI_X + RICOH_GR2 + OPC + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0450647..f8b2244 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,4 +18,33 @@ Down Reset Connection Disconnect + + App. Control + Exit Application(and Camera OFF) + Connection Method + Camera + Capture both camera and Live View + + Others + + GOKIGEN + Instructions + Privacy Policy + + Debug Information + LogCat Information + + + Confirmation + OK + Cancel + + Share debug log + Share the debug log, OK? + + Refresh + Finished Refresh + + Power Off + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 545b9c6..7a78279 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -6,6 +6,7 @@ @color/colorPrimary @color/colorPrimaryDark @color/colorAccent + @style/PreferenceThemeOverlay