0
0
mirror of https://github.com/TrianguloY/UrlChecker.git synced 2024-09-19 20:02:16 +02:00

distinction from module data and module dialog, but keep in same file

This commit is contained in:
TrianguloY 2020-08-12 00:13:39 +02:00
parent d39e7c852a
commit 554544139a
11 changed files with 207 additions and 139 deletions

View File

@ -10,7 +10,7 @@ import android.widget.Switch;
import android.widget.TextView;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.modules.ModuleData;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.ModuleManager;
import com.trianguloy.urlchecker.utilities.GenericPref;
@ -32,16 +32,16 @@ public class ModulesActivity extends Activity {
private void initialize() {
initModule(ModuleData.topModule, false);
initModule(ModuleManager.topModule, false);
for (ModuleData module : ModuleData.toggleableModules) {
for (AModuleData module : ModuleManager.toggleableModules) {
initModule(module, true);
}
initModule(ModuleData.bottomModule, false);
initModule(ModuleManager.bottomModule, false);
}
private void initModule(ModuleData module, boolean enableable) {
private void initModule(AModuleData module, boolean enableable) {
// inflate
View views = getLayoutInflater().inflate(R.layout.conf_module, list, false);
list.addView(views); // separated to return the inflated view instead of the parent
@ -63,8 +63,8 @@ public class ModulesActivity extends Activity {
}
// configure info
((TextView) views.findViewById(R.id.label)).setText(module.name);
((TextView) views.findViewById(R.id.desc)).setText(module.description);
((TextView) views.findViewById(R.id.label)).setText(module.getName());
((TextView) views.findViewById(R.id.desc)).setText(module.getDescription());
// configure toggleable description
final View details_cont = views.findViewById(R.id.details);

View File

@ -10,10 +10,10 @@ import android.widget.TextView;
import android.widget.Toast;
import com.trianguloy.urlchecker.BuildConfig;
import com.trianguloy.urlchecker.modules.ModuleData;
import com.trianguloy.urlchecker.modules.ModuleManager;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.modules.BaseModule;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.modules.ModuleManager;
import java.util.ArrayList;
import java.util.List;
@ -37,7 +37,7 @@ public class MainDialog extends Activity {
* @param url the new url
* @param providerModule which module changed it (null if first change)
*/
public void setUrl(String url, BaseModule providerModule) {
public void setUrl(String url, AModuleDialog providerModule) {
if (onSettingUrl) {
// a recursive call, invalid
if (BuildConfig.DEBUG) {
@ -70,7 +70,7 @@ public class MainDialog extends Activity {
/**
* All active modules
*/
private final List<BaseModule> modules = new ArrayList<>();
private final List<AModuleDialog> modules = new ArrayList<>();
// the current url
private String url;
@ -100,14 +100,14 @@ public class MainDialog extends Activity {
modules.clear();
// top module
initializeModule(ModuleData.topModule);
initializeModule(ModuleManager.topModule);
// middle modules
final List<ModuleData> middleModules = ModuleManager.getMiddleModules(this);
for (ModuleData module : middleModules) {
final List<AModuleData> middleModules = ModuleManager.getEnabledMiddleModules(this);
for (AModuleData module : middleModules) {
// set title
String name = module.name;
String name = module.getName();
if (name != null) {
final TextView title = new TextView(this);
title.setText(name + ":");
@ -119,7 +119,7 @@ public class MainDialog extends Activity {
}
// bottom module
initializeModule(ModuleData.bottomModule);
initializeModule(ModuleManager.bottomModule);
}
/**
@ -127,11 +127,11 @@ public class MainDialog extends Activity {
*
* @param moduleData which module to initialize
*/
private void initializeModule(ModuleData moduleData) {
private void initializeModule(AModuleData moduleData) {
try {
// enabled, add
BaseModule module = moduleData.dialogClass.getDeclaredConstructor(MainDialog.class).newInstance(this);
View views = getLayoutInflater().inflate(module.getLayoutDialog(), ll_mods,false);
AModuleDialog module = moduleData.getDialog(this);
View views = getLayoutInflater().inflate(module.getLayoutDialog(), ll_mods, false);
ll_mods.addView(views); // separated to return the inflated view instead of the parent
module.onInitialize(views);
modules.add(module);
@ -167,8 +167,8 @@ public class MainDialog extends Activity {
*
* @param providerModule the module that provided the new url, won't be called (if null all are called)
*/
private void onChangedUrl(BaseModule providerModule) {
for (BaseModule module : modules) {
private void onChangedUrl(AModuleDialog providerModule) {
for (AModuleDialog module : modules) {
if (module != providerModule)
module.onNewUrl(getUrl());
}

View File

@ -0,0 +1,13 @@
package com.trianguloy.urlchecker.modules;
import com.trianguloy.urlchecker.dialogs.MainDialog;
public abstract class AModuleData {
public abstract String getId();
public abstract String getName();
public abstract String getDescription();
public abstract AModuleDialog getDialog(MainDialog dialog);
}

View File

@ -4,15 +4,11 @@ import android.app.Activity;
import android.view.View;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.utilities.GenericConfiguration;
import java.util.Collections;
import java.util.List;
/**
* Base class for a module.
*/
public abstract class BaseModule {
public abstract class AModuleDialog {
// ------------------- private data -------------------
@ -20,7 +16,7 @@ public abstract class BaseModule {
// ------------------- initialization -------------------
public BaseModule(MainDialog dialog) {
public AModuleDialog(MainDialog dialog) {
this.dialog = dialog;
}
@ -32,9 +28,11 @@ public abstract class BaseModule {
public abstract int getLayoutDialog();
/**
* @return the layout resource of this module
* Initializes this module from the given views (generated from {@link #getLayoutDialog()})
*
* @param views the inflated views
*/
public List<GenericConfiguration> getConfigurations(){return Collections.EMPTY_LIST;}
public abstract void onInitialize(View views);
/**
* Notification of a new url.
@ -44,13 +42,6 @@ public abstract class BaseModule {
*/
public abstract void onNewUrl(String url);
/**
* Initializes this module from the given views (generated from {@link #getLayoutDialog()})
*
* @param views the inflated views
*/
public abstract void onInitialize(View views);
// ------------------- utilities -------------------
/**

View File

@ -1,70 +0,0 @@
package com.trianguloy.urlchecker.modules;
import com.trianguloy.urlchecker.modules.list.AsciiModule;
import com.trianguloy.urlchecker.modules.list.OpenModule;
import com.trianguloy.urlchecker.modules.list.RedirectModule;
import com.trianguloy.urlchecker.modules.list.TextInputModule;
import com.trianguloy.urlchecker.modules.list.VirusTotalModule;
import java.util.ArrayList;
import java.util.List;
/**
* If instantiated contains the information about a module.
* Statically contains the available modules
*/
public class ModuleData {
// ------------------- configuration -------------------
public final static List<ModuleData> toggleableModules = new ArrayList<>();
public final static ModuleData bottomModule = new ModuleData(OpenModule.class, "open", "Open & Share", "Allows to open or share the current url.");
public final static ModuleData topModule = new ModuleData(TextInputModule.class, "text", "Input text", "Allows to edit the url manually");
// ------------------- initialization -------------------
static {
// TODO: auto-load with reflection?
add(RedirectModule.class, "redirect", "Redirection","Allows to check for redirection");
add(VirusTotalModule.class, "virustotal", "VirusTotal","Allows to check the url in VirusTotal (an api key is needed)");
add(AsciiModule.class, "ascii", "Ascii checker", "Checks for non-ascii characters");
}
public static void add(Class<? extends BaseModule> dialogClass, String id, String name, String description) {
toggleableModules.add(new ModuleData(dialogClass, id, name, description));
}
// ------------------- instantiated struct -------------------
/**
* The module class
*/
public final Class<? extends BaseModule> dialogClass;
/**
* Identifier of the module
*/
public final String id;
/**
* Visible name of this module
*/
public final String name;
public final String description;
/**
* Full constructor for a module
*
* @param dialogClass the class
* @param id identifier
* @param name user name
* @param description
*/
public ModuleData(Class<? extends BaseModule> dialogClass, String id, String name, String description) {
this.dialogClass = dialogClass;
this.id = id;
this.name = name;
this.description = description;
}
}

View File

@ -2,6 +2,11 @@ package com.trianguloy.urlchecker.modules;
import android.content.Context;
import com.trianguloy.urlchecker.modules.list.AsciiModule;
import com.trianguloy.urlchecker.modules.list.OpenModule;
import com.trianguloy.urlchecker.modules.list.RedirectModule;
import com.trianguloy.urlchecker.modules.list.TextInputModule;
import com.trianguloy.urlchecker.modules.list.VirusTotalModule;
import com.trianguloy.urlchecker.utilities.GenericPref;
import java.util.ArrayList;
@ -12,6 +17,18 @@ import java.util.List;
*/
public class ModuleManager {
public final static AModuleData topModule = new TextInputModule();
public final static AModuleData bottomModule = new OpenModule();
public final static List<AModuleData> toggleableModules = new ArrayList<>();
static {
// TODO: auto-load with reflection?
toggleableModules.add(new RedirectModule());
toggleableModules.add(new VirusTotalModule());
toggleableModules.add(new AsciiModule());
}
// ------------------- class -------------------
private static final String PREF_SUFFIX = "_en";
@ -20,8 +37,8 @@ public class ModuleManager {
*/
private static final boolean ENABLED_DEFAULT = true;
public static GenericPref.Bool getEnabledPrefOfModule(ModuleData module, Context cntx) {
final GenericPref.Bool enabledPref = new GenericPref.Bool(module.id + PREF_SUFFIX, ENABLED_DEFAULT);
public static GenericPref.Bool getEnabledPrefOfModule(AModuleData module, Context cntx) {
final GenericPref.Bool enabledPref = new GenericPref.Bool(module.getId() + PREF_SUFFIX, ENABLED_DEFAULT);
enabledPref.init(cntx);
return enabledPref;
}
@ -32,11 +49,11 @@ public class ModuleManager {
* @param cntx base context (for the sharedpref)
* @return the list, may be empty
*/
public static List<ModuleData> getMiddleModules(Context cntx) {
List<ModuleData> enabled = new ArrayList<>();
public static List<AModuleData> getEnabledMiddleModules(Context cntx) {
List<AModuleData> enabled = new ArrayList<>();
// check each module
for (ModuleData module : ModuleData.toggleableModules) {
for (AModuleData module : toggleableModules) {
if (getEnabledPrefOfModule(module, cntx).get()) {
try {
// enabled, add

View File

@ -6,7 +6,8 @@ import android.widget.TextView;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.BaseModule;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import java.util.ArrayList;
import java.util.List;
@ -14,11 +15,34 @@ import java.util.List;
/**
* This module checks for non-ascii characters in the url
*/
public class AsciiModule extends BaseModule {
public class AsciiModule extends AModuleData {
@Override
public String getId() {
return "ascii";
}
@Override
public String getName() {
return "Ascii checker";
}
@Override
public String getDescription() {
return "Checks for non-ascii characters";
}
@Override
public AModuleDialog getDialog(MainDialog dialog) {
return new AsciiDialog(dialog);
}
}
class AsciiDialog extends AModuleDialog {
private TextView txt_ascii;
public AsciiModule(MainDialog dialog) {
public AsciiDialog(MainDialog dialog) {
super(dialog);
}

View File

@ -10,7 +10,8 @@ import android.widget.PopupMenu;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.BaseModule;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.utilities.LastOpened;
import com.trianguloy.urlchecker.utilities.PackageUtilities;
import com.trianguloy.urlchecker.utilities.UrlUtilities;
@ -20,7 +21,30 @@ import java.util.List;
/**
* This module contains an open and share buttons
*/
public class OpenModule extends BaseModule implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {
public class OpenModule extends AModuleData {
@Override
public String getId() {
return "open";
}
@Override
public String getName() {
return "Open & Share";
}
@Override
public String getDescription() {
return "Allows to open or share the current url.";
}
@Override
public AModuleDialog getDialog(MainDialog dialog) {
return new OpenDialog(dialog);
}
}
class OpenDialog extends AModuleDialog implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {
private LastOpened lastOpened;
@ -30,7 +54,7 @@ public class OpenModule extends BaseModule implements View.OnClickListener, Popu
private Menu menu;
private PopupMenu popup;
public OpenModule(MainDialog dialog) {
public OpenDialog(MainDialog dialog) {
super(dialog);
}

View File

@ -6,7 +6,8 @@ import android.widget.Toast;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.BaseModule;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import java.io.IOException;
import java.net.HttpURLConnection;
@ -17,7 +18,30 @@ import java.util.Stack;
/**
* A module that allows checking for redirection by using a local browser
*/
public class RedirectModule extends BaseModule implements View.OnClickListener {
public class RedirectModule extends AModuleData {
@Override
public String getId() {
return "redirect";
}
@Override
public String getName() {
return "Redirection";
}
@Override
public String getDescription() {
return "Allows to check for redirection";
}
@Override
public AModuleDialog getDialog(MainDialog dialog) {
return new RedirectDialog(dialog);
}
}
class RedirectDialog extends AModuleDialog implements View.OnClickListener {
private Button check;
private Button undo;
@ -27,7 +51,7 @@ public class RedirectModule extends BaseModule implements View.OnClickListener {
*/
private Stack<String> urls = new Stack<>();
public RedirectModule(MainDialog dialog) {
public RedirectDialog(MainDialog dialog) {
super(dialog);
}

View File

@ -7,17 +7,41 @@ import android.widget.EditText;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.BaseModule;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
/**
* This module shows the current url and allows manual editing
*/
public class TextInputModule extends BaseModule implements TextWatcher {
public class TextInputModule extends AModuleData {
@Override
public String getId() {
return "text";
}
@Override
public String getName() {
return "Input text";
}
@Override
public String getDescription() {
return "Allows to edit the url manually";
}
@Override
public AModuleDialog getDialog(MainDialog dialog) {
return new TextInputDialog(dialog);
}
}
class TextInputDialog extends AModuleDialog implements TextWatcher {
private EditText edtxt_url;
private boolean editByCode = false;
public TextInputModule(MainDialog dialog) {
public TextInputDialog(MainDialog dialog) {
super(dialog);
}

View File

@ -8,19 +8,40 @@ import android.widget.TextView;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.BaseModule;
import com.trianguloy.urlchecker.utilities.GenericConfiguration;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.utilities.GenericPref;
import com.trianguloy.urlchecker.utilities.UrlUtilities;
import com.trianguloy.urlchecker.utilities.VirusTotalUtility;
import java.util.ArrayList;
import java.util.List;
/**
* This module uses the VirusTotal api (https://developers.virustotal.com/reference) for url reports
*/
public class VirusTotalModule extends BaseModule implements View.OnClickListener, View.OnLongClickListener {
public class VirusTotalModule extends AModuleData {
@Override
public String getId() {
return "virustotal";
}
@Override
public String getName() {
return "VirusTotal";
}
@Override
public String getDescription() {
return "Allows to check the url in VirusTotal (an api key is needed)";
}
@Override
public AModuleDialog getDialog(MainDialog dialog) {
return new VirusTotalDialog(dialog);
}
}
class VirusTotalDialog extends AModuleDialog implements View.OnClickListener, View.OnLongClickListener {
private static final int RETRY_TIMEOUT = 5000;
private ImageButton btn_scan;
@ -29,9 +50,9 @@ public class VirusTotalModule extends BaseModule implements View.OnClickListener
private boolean scanning = false;
private VirusTotalUtility.InternalReponse result = null;
private GenericPref.Str api_key = new GenericPref.Str("api_key","**REMOVED**");
private GenericPref.Str api_key = new GenericPref.Str("api_key", "**REMOVED**");
public VirusTotalModule(MainDialog dialog) {
public VirusTotalDialog(MainDialog dialog) {
super(dialog);
api_key.init(dialog);
}
@ -41,13 +62,13 @@ public class VirusTotalModule extends BaseModule implements View.OnClickListener
return R.layout.module_virustotal;
}
@Override
public List<GenericConfiguration> getConfigurations() {
final ArrayList<GenericConfiguration> list = new ArrayList<GenericConfiguration>();
list.add(new GenericConfiguration.StrPrefConfiguration("Api key", api_key));
return list;
}
// @Override
// public List<GenericConfiguration> getConfigurations() {
// final ArrayList<GenericConfiguration> list = new ArrayList<GenericConfiguration>();
// list.add(new GenericConfiguration.StrPrefConfiguration("Api key", api_key));
//
// return list;
// }
@Override
public void onInitialize(View views) {