From 15f8c4b5f0ba65f9c1a7df80d9a5aab20c17b400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=97=B1=20PixelyIon?= Date: Wed, 3 Jul 2019 04:49:45 +0530 Subject: [PATCH] Addition of a UI: Settings and NRO list This update adds a minimal UI. --- app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 14 +- app/src/main/cpp/lightswitch.cpp | 17 +- .../gq/cyuubi/lightswitch/MainActivity.java | 178 ++++++++++++++++-- .../cyuubi/lightswitch/SettingsActivity.java | 33 ++++ app/src/main/res/drawable/ic_console.xml | 5 + app/src/main/res/drawable/ic_refresh.xml | 9 + app/src/main/res/drawable/ic_settings.xml | 5 + app/src/main/res/layout/activity_main.xml | 19 -- app/src/main/res/layout/main_activity.xml | 28 +++ app/src/main/res/layout/settings_activity.xml | 22 +++ app/src/main/res/menu/toolbar.xml | 14 ++ app/src/main/res/values/array.xml | 11 ++ app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/strings.xml | 10 + app/src/main/res/values/styles.xml | 5 +- app/src/main/res/xml/preferences.xml | 39 ++++ gradle.properties | 2 +- 18 files changed, 368 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/gq/cyuubi/lightswitch/SettingsActivity.java create mode 100644 app/src/main/res/drawable/ic_console.xml create mode 100644 app/src/main/res/drawable/ic_refresh.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml delete mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/main_activity.xml create mode 100644 app/src/main/res/layout/settings_activity.xml create mode 100644 app/src/main/res/menu/toolbar.xml create mode 100644 app/src/main/res/values/array.xml create mode 100644 app/src/main/res/xml/preferences.xml diff --git a/app/build.gradle b/app/build.gradle index 2d602304..9416fd89 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ android { buildToolsVersion "29.0.0" defaultConfig { applicationId "gq.cyuubi.lightswitch" - minSdkVersion 22 + minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" @@ -40,4 +40,5 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.preference:preference:1.1.0-beta01' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ba64ae00..d42488e2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,9 +1,9 @@ - - - + + + + + + diff --git a/app/src/main/cpp/lightswitch.cpp b/app/src/main/cpp/lightswitch.cpp index 2818e935..fadc19a7 100644 --- a/app/src/main/cpp/lightswitch.cpp +++ b/app/src/main/cpp/lightswitch.cpp @@ -5,15 +5,12 @@ #include #include -extern "C" JNIEXPORT jstring JNICALL -Java_gq_cyuubi_lightswitch_MainActivity_stringFromJNI( - JNIEnv *env, - jobject /* this */) { - +extern "C" +JNIEXPORT void JNICALL +Java_gq_cyuubi_lightswitch_MainActivity_loadFile(JNIEnv *env, jobject instance, jstring file_) { + const char *file = env->GetStringUTFChars(file_, 0); core::cpu::Initialize(); - core::loader::LoadNro("/sdcard/lawsofaviation.nro"); + core::loader::LoadNro(file); core::cpu::Run(BASE_ADDRESS); - - std::string finished = "finished!"; - return env->NewStringUTF(finished.c_str()); -} + env->ReleaseStringUTFChars(file_, file); +} \ No newline at end of file diff --git a/app/src/main/java/gq/cyuubi/lightswitch/MainActivity.java b/app/src/main/java/gq/cyuubi/lightswitch/MainActivity.java index 7873a0bf..38d90cb3 100644 --- a/app/src/main/java/gq/cyuubi/lightswitch/MainActivity.java +++ b/app/src/main/java/gq/cyuubi/lightswitch/MainActivity.java @@ -1,13 +1,104 @@ package gq.cyuubi.lightswitch; import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import androidx.preference.PreferenceManager; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +class DataModel { + File file; + int index; + + public DataModel(File file) { + this.file = file; + index = file.getName().lastIndexOf("."); + } + + public String getTitle() { + return getName() + "(" + getType() + ")"; + } + + public String getName() { + String name = ""; + for (String str_i : file.getName().substring(0, index).split("_")) { + name += str_i.substring(0, 1).toUpperCase() + str_i.substring(1) + " "; + } + return name; + } + + public String getType() { + return file.getName().substring(index + 1).toUpperCase(); + } + + public String getPath() { + return file.getAbsolutePath(); + } +} + +class FileAdapter extends ArrayAdapter { + + Context mContext; + private ArrayList dataSet; + + public FileAdapter(Context context, @NonNull ArrayList data) { + super(context, android.R.layout.simple_list_item_2, data); + this.dataSet = new ArrayList<>(); + this.mContext = context; + } + + @Override + public void add(DataModel object) { + super.add(object); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + DataModel dataModel = getItem(position); + ViewHolder viewHolder; + if (convertView == null) { + viewHolder = new ViewHolder(); + LayoutInflater inflater = LayoutInflater.from(getContext()); + convertView = inflater.inflate(android.R.layout.simple_list_item_2, parent, false); + viewHolder.txtTitle = convertView.findViewById(android.R.id.text1); + viewHolder.txtPath = convertView.findViewById(android.R.id.text2); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + viewHolder.txtTitle.setText(dataModel.getTitle()); + viewHolder.txtPath.setText(dataModel.getPath()); + + return convertView; + } + + private static class ViewHolder { + TextView txtTitle; + TextView txtPath; + } +} public class MainActivity extends AppCompatActivity { @@ -15,22 +106,85 @@ public class MainActivity extends AppCompatActivity { System.loadLibrary("lightswitch"); } + SharedPreferences sharedPreferences; + FileAdapter adapter; + + private List findFile(String ext, File file, @Nullable List files) { + if (files == null) { + files = new ArrayList<>(); + } + File[] list = file.listFiles(); + if (list != null) { + for (File file_i : list) { + if (file_i.isDirectory()) { + files = findFile(ext, file_i, files); + } else { + try { + String file_str = file_i.getName(); + if (ext.equalsIgnoreCase(file_str.substring(file_str.lastIndexOf(".") + 1))) { + files.add(file_i); + } + } catch (StringIndexOutOfBoundsException e) { + } + } + } + } + return files; + } + + private void refresh_files() { + adapter.clear(); + List files = findFile("nro", new File(sharedPreferences.getString("search_location", "")), null); + for (File file : files) { + adapter.add(new DataModel(file)); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) - { - ActivityCompat.requestPermissions(MainActivity.this, - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - 1); + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + System.exit(0); + } } - - // Example of a call to a native method - TextView tv = findViewById(R.id.sample_text); - tv.setText(stringFromJNI()); + setContentView(R.layout.main_activity); + setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + PreferenceManager.setDefaultValues(this, R.xml.preferences, false); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + adapter = new FileAdapter(this, new ArrayList()); + ListView game_list = findViewById(R.id.game_list); + game_list.setAdapter(adapter); + game_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + loadFile(((DataModel) parent.getItemAtPosition(position)).getPath()); + } + }); + refresh_files(); } - public native String stringFromJNI(); + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.toolbar, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_settings: + startActivity(new Intent(this, SettingsActivity.class)); + return true; + case R.id.action_refresh: + refresh_files(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + + public native void loadFile(String file); } diff --git a/app/src/main/java/gq/cyuubi/lightswitch/SettingsActivity.java b/app/src/main/java/gq/cyuubi/lightswitch/SettingsActivity.java new file mode 100644 index 00000000..73472b0e --- /dev/null +++ b/app/src/main/java/gq/cyuubi/lightswitch/SettingsActivity.java @@ -0,0 +1,33 @@ +package gq.cyuubi.lightswitch; + +import android.os.Bundle; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.preference.PreferenceFragmentCompat; + +public class SettingsActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new HeaderFragment()) + .commit(); + setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + public static class HeaderFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.preferences, rootKey); + } + } +} diff --git a/app/src/main/res/drawable/ic_console.xml b/app/src/main/res/drawable/ic_console.xml new file mode 100644 index 00000000..89907426 --- /dev/null +++ b/app/src/main/res/drawable/ic_console.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 00000000..7b57e2a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 00000000..4b155d9a --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index a4e8d403..00000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml new file mode 100644 index 00000000..92e727de --- /dev/null +++ b/app/src/main/res/layout/main_activity.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml new file mode 100644 index 00000000..b06df8dd --- /dev/null +++ b/app/src/main/res/layout/settings_activity.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/toolbar.xml b/app/src/main/res/menu/toolbar.xml new file mode 100644 index 00000000..acef1249 --- /dev/null +++ b/app/src/main/res/menu/toolbar.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml new file mode 100644 index 00000000..2b0e8b38 --- /dev/null +++ b/app/src/main/res/values/array.xml @@ -0,0 +1,11 @@ + + + + System Language + English + + + sys + en + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 69b22338..955130d0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - #008577 - #00574B - #D81B60 + #E60012 + #AB0000 + #E60012 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2faa3b10..7b6d24b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,13 @@ Lightswitch + + Settings + Refresh + + The following permission + + Search + Search Location + Localization + Language diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5885930d..70461b9c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,8 +1,7 @@ - -