├── .gitignore ├── .idea ├── .gitignore ├── compiler.xml ├── gradle.xml ├── misc.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── ru │ │ └── svolf │ │ └── moddialog │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── about_cracker.txt │ │ ├── av.webp │ │ ├── bg.webp │ │ └── relish.ttf │ ├── java │ │ └── ru │ │ │ └── svolf │ │ │ └── moddialog │ │ │ ├── CircleImageView.java │ │ │ ├── MainActivity.java │ │ │ └── ModDialog.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── themes.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ └── data_extraction_rules.xml │ └── test │ └── java │ └── ru │ └── svolf │ └── moddialog │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mod Dialog 2 | Custom dialog for showing in modified Android apps 3 | API 21+ 4 | ## Supported functions 5 | 6 | 1. Custom background color 7 | 2. Custom avatar 8 | 3. Changing the text color 9 | 4. Completely in code, no generation of layout resources is required 10 | 5. The ability to display only at the first launch 11 | 6. The ability to use HTML formatting (hyperlinks are supported). See `/assets/about_cracker.txt` 12 | 13 | | Assets file name | Description | Option | 14 | |--|--|--| 15 | | av.webp | Avatar image (`100x100` or `200x200 px`) | required | 16 | | bg.webp | Background image `800x400` px (landscape) | required| 17 | | about_cracker.txt | Dialog message text | required | 18 | | relish.ttf | Custom font | optional (if font type variable set to CUSTOM) | 19 | 20 | 21 | ## Screenshot 22 | ![Imgur link](https://i.imgur.com/Cs985ki.png) 23 | ## Integration 24 | - Copy the files from the `/assets/` folder 25 | - Copy the files from the smail folder while preserving the package structure (`CircleImageView` and `ModDialog`) 26 | - Use the `prepare()` method of the ModDialog class to show the dialog. See the source code for details 27 | --- 28 | - Only first launch 29 | 30 | ModDialog.prepare(this); 31 | 32 | - Always show 33 | 34 | ModDialog.showCrackerDialog(this); 35 | 36 | --- 37 | 38 | > Written with [StackEdit](https://stackedit.io/). 39 | 40 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | namespace 'ru.svolf.moddialog' 7 | compileSdk 32 8 | 9 | defaultConfig { 10 | applicationId "ru.svolf.moddialog" 11 | minSdk 21 12 | targetSdk 32 13 | versionCode 1 14 | versionName "1.0" 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | compileOptions { 26 | sourceCompatibility JavaVersion.VERSION_1_8 27 | targetCompatibility JavaVersion.VERSION_1_8 28 | } 29 | } 30 | 31 | dependencies { 32 | 33 | testImplementation 'junit:junit:4.13.2' 34 | androidTestImplementation 'androidx.test.ext:junit:1.1.4' 35 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' 36 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/ru/svolf/moddialog/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package ru.svolf.moddialog; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("ru.svolf.moddialog", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/assets/about_cracker.txt: -------------------------------------------------------------------------------- 1 | Текст твой..... 2 | Link to Yandex.Disk -------------------------------------------------------------------------------- /app/src/main/assets/av.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/assets/av.webp -------------------------------------------------------------------------------- /app/src/main/assets/bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/assets/bg.webp -------------------------------------------------------------------------------- /app/src/main/assets/relish.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/assets/relish.ttf -------------------------------------------------------------------------------- /app/src/main/java/ru/svolf/moddialog/CircleImageView.java: -------------------------------------------------------------------------------- 1 | package ru.svolf.moddialog; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.graphics.Bitmap; 6 | import android.graphics.BitmapShader; 7 | import android.graphics.Canvas; 8 | import android.graphics.Color; 9 | import android.graphics.ColorFilter; 10 | import android.graphics.Matrix; 11 | import android.graphics.Paint; 12 | import android.graphics.RectF; 13 | import android.graphics.Shader; 14 | import android.graphics.drawable.BitmapDrawable; 15 | import android.graphics.drawable.ColorDrawable; 16 | import android.graphics.drawable.Drawable; 17 | import android.net.Uri; 18 | import android.util.AttributeSet; 19 | import android.widget.ImageView; 20 | 21 | @SuppressLint({"AppCompatCustomView"}) 22 | /* loaded from: classes.dex */ 23 | public class CircleImageView extends ImageView { 24 | private static final int COLORDRAWABLE_DIMENSION = 2; 25 | private static final int DEFAULT_BORDER_WIDTH = 4; 26 | private static final int DEFAULT_FILL_COLOR = 0; 27 | private Bitmap mBitmap; 28 | private int mBitmapHeight; 29 | private final Paint mBitmapPaint; 30 | private BitmapShader mBitmapShader; 31 | private int mBitmapWidth; 32 | private final Paint mBorderPaint; 33 | private float mBorderRadius; 34 | private final RectF mBorderRect; 35 | private int mBorderWidth; 36 | private ColorFilter mColorFilter; 37 | private boolean mDisableCircularTransformation; 38 | private float mDrawableRadius; 39 | private final RectF mDrawableRect; 40 | private int mFillColor; 41 | private final Paint mFillPaint; 42 | private boolean mReady; 43 | private boolean mSetupPending; 44 | private final Matrix mShaderMatrix; 45 | private static final ImageView.ScaleType SCALE_TYPE = ImageView.ScaleType.CENTER_CROP; 46 | private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; 47 | private static final int DEFAULT_BORDER_COLOR = Color.parseColor("#ffffff"); 48 | 49 | public CircleImageView(Context context) { 50 | super(context); 51 | this.mDrawableRect = new RectF(); 52 | this.mBorderRect = new RectF(); 53 | this.mShaderMatrix = new Matrix(); 54 | this.mBitmapPaint = new Paint(); 55 | this.mBorderPaint = new Paint(); 56 | this.mFillPaint = new Paint(); 57 | this.mBorderWidth = DEFAULT_BORDER_WIDTH; 58 | this.mFillColor = DEFAULT_BORDER_COLOR; 59 | this.mDisableCircularTransformation = false; 60 | init(); 61 | } 62 | 63 | public CircleImageView(Context context, AttributeSet attrs) { 64 | this(context, attrs, DEFAULT_BORDER_COLOR); 65 | } 66 | 67 | public CircleImageView(Context context, AttributeSet attrs, int defStyle) { 68 | super(context, attrs, defStyle); 69 | this.mDrawableRect = new RectF(); 70 | this.mBorderRect = new RectF(); 71 | this.mShaderMatrix = new Matrix(); 72 | this.mBitmapPaint = new Paint(); 73 | this.mBorderPaint = new Paint(); 74 | this.mFillPaint = new Paint(); 75 | this.mBorderWidth = DEFAULT_BORDER_WIDTH; 76 | this.mFillColor = DEFAULT_BORDER_COLOR; 77 | this.mDisableCircularTransformation = false; 78 | init(); 79 | } 80 | 81 | private void init() { 82 | super.setScaleType(SCALE_TYPE); 83 | this.mReady = true; 84 | if (this.mSetupPending) { 85 | setup(); 86 | this.mSetupPending = false; 87 | } 88 | } 89 | 90 | @Override // android.widget.ImageView 91 | public ImageView.ScaleType getScaleType() { 92 | return SCALE_TYPE; 93 | } 94 | 95 | @Override // android.widget.ImageView 96 | public void setScaleType(ImageView.ScaleType scaleType) { 97 | if (scaleType != SCALE_TYPE) { 98 | throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); 99 | } 100 | } 101 | 102 | @Override // android.widget.ImageView 103 | public void setAdjustViewBounds(boolean adjustViewBounds) { 104 | if (adjustViewBounds) { 105 | throw new IllegalArgumentException("adjustViewBounds not supported."); 106 | } 107 | } 108 | 109 | @Override // android.widget.ImageView, android.view.View 110 | protected void onDraw(Canvas canvas) { 111 | if (this.mDisableCircularTransformation) { 112 | super.onDraw(canvas); 113 | } else if (this.mBitmap != null) { 114 | if (this.mFillColor != 0) { 115 | canvas.drawCircle(this.mDrawableRect.centerX(), this.mDrawableRect.centerY(), this.mDrawableRadius, this.mFillPaint); 116 | } 117 | canvas.drawCircle(this.mDrawableRect.centerX(), this.mDrawableRect.centerY(), this.mDrawableRadius, this.mBitmapPaint); 118 | if (this.mBorderWidth > 0) { 119 | canvas.drawCircle(this.mBorderRect.centerX(), this.mBorderRect.centerY(), this.mBorderRadius, this.mBorderPaint); 120 | } 121 | } 122 | } 123 | 124 | @Override // android.view.View 125 | protected void onSizeChanged(int w, int h, int oldw, int oldh) { 126 | super.onSizeChanged(w, h, oldw, oldh); 127 | setup(); 128 | } 129 | 130 | @Override // android.view.View 131 | public void setPadding(int left, int top, int right, int bottom) { 132 | super.setPadding(left, top, right, bottom); 133 | setup(); 134 | } 135 | 136 | @Override // android.view.View 137 | public void setPaddingRelative(int start, int top, int end, int bottom) { 138 | super.setPaddingRelative(start, top, end, bottom); 139 | setup(); 140 | } 141 | 142 | @Override // android.widget.ImageView 143 | public void setImageBitmap(Bitmap bm) { 144 | super.setImageBitmap(bm); 145 | initializeBitmap(); 146 | } 147 | 148 | @Override // android.widget.ImageView 149 | public void setImageDrawable(Drawable drawable) { 150 | super.setImageDrawable(drawable); 151 | initializeBitmap(); 152 | } 153 | 154 | @Override // android.widget.ImageView 155 | public void setImageResource(int resId) { 156 | super.setImageResource(resId); 157 | initializeBitmap(); 158 | } 159 | 160 | @Override // android.widget.ImageView 161 | public void setImageURI(Uri uri) { 162 | super.setImageURI(uri); 163 | initializeBitmap(); 164 | } 165 | 166 | @Override // android.widget.ImageView 167 | public void setColorFilter(ColorFilter cf) { 168 | if (cf != this.mColorFilter) { 169 | this.mColorFilter = cf; 170 | applyColorFilter(); 171 | invalidate(); 172 | } 173 | } 174 | 175 | @Override // android.widget.ImageView 176 | public ColorFilter getColorFilter() { 177 | return this.mColorFilter; 178 | } 179 | 180 | private void applyColorFilter() { 181 | if (this.mBitmapPaint != null) { 182 | this.mBitmapPaint.setColorFilter(this.mColorFilter); 183 | } 184 | } 185 | 186 | private Bitmap getBitmapFromDrawable(Drawable drawable) { 187 | Bitmap bitmap; 188 | if (drawable == null) { 189 | return null; 190 | } 191 | if (drawable instanceof BitmapDrawable) { 192 | return ((BitmapDrawable) drawable).getBitmap(); 193 | } 194 | try { 195 | if (drawable instanceof ColorDrawable) { 196 | bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); 197 | } else { 198 | bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); 199 | } 200 | Canvas canvas = new Canvas(bitmap); 201 | drawable.setBounds(DEFAULT_BORDER_COLOR, DEFAULT_BORDER_COLOR, canvas.getWidth(), canvas.getHeight()); 202 | drawable.draw(canvas); 203 | return bitmap; 204 | } catch (Exception e) { 205 | e.printStackTrace(); 206 | return null; 207 | } 208 | } 209 | 210 | private void initializeBitmap() { 211 | if (this.mDisableCircularTransformation) { 212 | this.mBitmap = null; 213 | } else { 214 | this.mBitmap = getBitmapFromDrawable(getDrawable()); 215 | } 216 | setup(); 217 | } 218 | 219 | private void setup() { 220 | if (!this.mReady) { 221 | this.mSetupPending = true; 222 | } else if (getWidth() != 0 || getHeight() != 0) { 223 | if (this.mBitmap == null) { 224 | invalidate(); 225 | return; 226 | } 227 | this.mBitmapShader = new BitmapShader(this.mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 228 | this.mBitmapPaint.setAntiAlias(true); 229 | this.mBitmapPaint.setShader(this.mBitmapShader); 230 | this.mBorderPaint.setStyle(Paint.Style.STROKE); 231 | this.mBorderPaint.setAntiAlias(true); 232 | this.mBorderPaint.setColor(DEFAULT_BORDER_COLOR); 233 | this.mBorderPaint.setStrokeWidth(this.mBorderWidth); 234 | this.mFillPaint.setStyle(Paint.Style.FILL); 235 | this.mFillPaint.setAntiAlias(true); 236 | this.mFillPaint.setColor(this.mFillColor); 237 | this.mBitmapHeight = this.mBitmap.getHeight(); 238 | this.mBitmapWidth = this.mBitmap.getWidth(); 239 | this.mBorderRect.set(calculateBounds()); 240 | this.mBorderRadius = Math.min((this.mBorderRect.height() - this.mBorderWidth) / 2.0f, (this.mBorderRect.width() - this.mBorderWidth) / 2.0f); 241 | this.mDrawableRect.set(this.mBorderRect); 242 | if (this.mBorderWidth > 0) { 243 | this.mDrawableRect.inset(this.mBorderWidth - 1.0f, this.mBorderWidth - 1.0f); 244 | } 245 | this.mDrawableRadius = Math.min(this.mDrawableRect.height() / 2.0f, this.mDrawableRect.width() / 2.0f); 246 | applyColorFilter(); 247 | updateShaderMatrix(); 248 | invalidate(); 249 | } 250 | } 251 | 252 | private RectF calculateBounds() { 253 | int availableWidth = (getWidth() - getPaddingLeft()) - getPaddingRight(); 254 | int availableHeight = (getHeight() - getPaddingTop()) - getPaddingBottom(); 255 | int sideLength = Math.min(availableWidth, availableHeight); 256 | float left = getPaddingLeft() + ((availableWidth - sideLength) / 2.0f); 257 | float top = getPaddingTop() + ((availableHeight - sideLength) / 2.0f); 258 | return new RectF(left, top, sideLength + left, sideLength + top); 259 | } 260 | 261 | private void updateShaderMatrix() { 262 | float scale; 263 | float dx = 0.0f; 264 | float dy = 0.0f; 265 | this.mShaderMatrix.set(null); 266 | if (this.mBitmapWidth * this.mDrawableRect.height() > this.mDrawableRect.width() * this.mBitmapHeight) { 267 | scale = this.mDrawableRect.height() / this.mBitmapHeight; 268 | dx = (this.mDrawableRect.width() - (this.mBitmapWidth * scale)) * 0.5f; 269 | } else { 270 | scale = this.mDrawableRect.width() / this.mBitmapWidth; 271 | dy = (this.mDrawableRect.height() - (this.mBitmapHeight * scale)) * 0.5f; 272 | } 273 | this.mShaderMatrix.setScale(scale, scale); 274 | this.mShaderMatrix.postTranslate(((int) (dx + 0.5f)) + this.mDrawableRect.left, ((int) (dy + 0.5f)) + this.mDrawableRect.top); 275 | this.mBitmapShader.setLocalMatrix(this.mShaderMatrix); 276 | } 277 | } -------------------------------------------------------------------------------- /app/src/main/java/ru/svolf/moddialog/MainActivity.java: -------------------------------------------------------------------------------- 1 | package ru.svolf.moddialog; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | import java.io.IOException; 7 | 8 | public class MainActivity extends Activity { 9 | @Override 10 | protected void onCreate(Bundle savedInstanceState) { 11 | super.onCreate(savedInstanceState); 12 | setContentView(R.layout.activity_main); 13 | ModDialog.prepare(this); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/ru/svolf/moddialog/ModDialog.java: -------------------------------------------------------------------------------- 1 | package ru.svolf.moddialog; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.content.Context; 6 | import android.content.DialogInterface; 7 | import android.content.Intent; 8 | import android.content.SharedPreferences; 9 | import android.graphics.Color; 10 | import android.graphics.Typeface; 11 | import android.graphics.drawable.Drawable; 12 | import android.net.Uri; 13 | import android.preference.PreferenceManager; 14 | import android.text.Html; 15 | import android.text.method.LinkMovementMethod; 16 | import android.util.Log; 17 | import android.view.View; 18 | import android.view.ViewGroup; 19 | import android.widget.ImageView; 20 | import android.widget.LinearLayout; 21 | import android.widget.RelativeLayout; 22 | import android.widget.ScrollView; 23 | import android.widget.TextView; 24 | import java.io.BufferedReader; 25 | import java.io.IOException; 26 | import java.io.InputStream; 27 | import java.io.InputStreamReader; 28 | 29 | public class ModDialog { 30 | private static SharedPreferences mSharedPreferences; 31 | // mode: dark/light 32 | private static String textStyle = "DARK"; 33 | // if value == "custom" uses custom font from assets, else system font 34 | private static String typeface = "CUSTOM"; 35 | 36 | private static int ID_IMG_BG = 220022; 37 | private static int ID_IMG_CONT = 221100; 38 | private static int ID_CONT_CAP = 220011; 39 | private static int ID_CONT_TEXT = 222211; 40 | 41 | 42 | 43 | private static void firstStartDone() { 44 | mSharedPreferences.edit().putBoolean("Mod.First.Start", false).apply(); 45 | } 46 | 47 | private static boolean isFirstStart() { 48 | return mSharedPreferences.getBoolean("Mod.First.Start", true); 49 | } 50 | 51 | public static void prepare(Activity ctx) { 52 | mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(ctx); 53 | try { 54 | if (isFirstStart()) { 55 | showCrackerDialog(ctx); 56 | ModDialog.firstStartDone(); 57 | } 58 | } catch (IOException ex) { 59 | ex.printStackTrace(); 60 | return; 61 | } 62 | Log.i("SnowVolfLog", "Done."); 63 | } 64 | 65 | public static void showCrackerDialog(final Context ctx) throws IOException { 66 | RelativeLayout mConvertView = initLayout(ctx); 67 | ImageView mBackground = (ImageView) mConvertView.findViewById(ID_IMG_BG); 68 | LinearLayout mAvatarContainer = (LinearLayout) mConvertView.findViewById(ID_IMG_CONT); 69 | TextView mCaption = (TextView) mConvertView.findViewById(ID_CONT_CAP); 70 | TextView mModderInfo = (TextView) mConvertView.findViewById(ID_CONT_TEXT); 71 | CircleImageView mAvatar = new CircleImageView(ctx); 72 | ViewGroup.LayoutParams mParams = new ViewGroup.LayoutParams(-1, -1); 73 | mAvatar.setLayoutParams(mParams); 74 | mAvatarContainer.addView(mAvatar); 75 | InputStream mBackgroundReader = ctx.getAssets().open("bg.webp"); 76 | InputStream mAvatarReader = ctx.getAssets().open("av.webp"); 77 | Drawable mImg = Drawable.createFromStream(mBackgroundReader, null); 78 | Drawable mAva = Drawable.createFromStream(mAvatarReader, null); 79 | mBackground.setImageDrawable(mImg); 80 | mAvatar.setImageDrawable(mAva); 81 | mBackgroundReader.close(); 82 | mAvatarReader.close(); 83 | if (textStyle.equalsIgnoreCase("dark")) { 84 | mCaption.setTextColor(Color.parseColor("#212121")); 85 | } else if (textStyle.equalsIgnoreCase("light")) { 86 | mCaption.setTextColor(Color.parseColor("#c8c8c8")); 87 | } 88 | if (typeface.equalsIgnoreCase("custom")) { 89 | Typeface futura = Typeface.createFromAsset(ctx.getAssets(), "relish.ttf"); 90 | mCaption.setTypeface(futura); 91 | mModderInfo.setTypeface(futura); 92 | } 93 | mCaption.setText("Snow Volf"); 94 | mModderInfo.setText(Html.fromHtml(parseText(ctx, "about_cracker.txt"))); 95 | mModderInfo.setMovementMethod(LinkMovementMethod.getInstance()); 96 | AlertDialog dialog = new AlertDialog.Builder(ctx) 97 | .setView(mConvertView) 98 | .setPositiveButton("Ok", null) 99 | .setNeutralButton("My Profile", null).show(); 100 | dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener(view -> { 101 | Uri uri = Uri.parse("http://link.to.profile"); 102 | Intent intent = new Intent("android.intent.action.VIEW", uri); 103 | ctx.startActivity(Intent.createChooser(intent, "Go to my profile")); 104 | ModDialog.firstStartDone(); 105 | }); 106 | } 107 | 108 | private static String parseText(Context activity, String url) { 109 | StringBuilder sb = new StringBuilder(); 110 | try { 111 | BufferedReader br1 = new BufferedReader(new InputStreamReader(activity.getAssets().open(url), "UTF-8")); 112 | while (true) { 113 | String line = br1.readLine(); 114 | if (line == null) { 115 | break; 116 | } 117 | sb.append(line).append("
"); 118 | } 119 | br1.close(); 120 | } catch (IOException e) { 121 | e.printStackTrace(); 122 | } 123 | return sb.toString(); 124 | } 125 | 126 | private static RelativeLayout initLayout(Context context) { 127 | final float scale = context.getResources().getDisplayMetrics().density; 128 | 129 | RelativeLayout root = new RelativeLayout(context); 130 | ViewGroup.LayoutParams root_LayoutParams = 131 | new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 132 | root_LayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; 133 | root_LayoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT; 134 | root.setLayoutParams(root_LayoutParams); 135 | 136 | ImageView imageBackground = new ImageView(context); 137 | RelativeLayout.LayoutParams imageBackground_LayoutParams = 138 | new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 139 | imageBackground.setId(ID_IMG_BG); 140 | imageBackground_LayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; 141 | imageBackground_LayoutParams.height = (int) (180 * scale + 0.5f); 142 | imageBackground.setScaleType(ImageView.ScaleType.CENTER_CROP); 143 | root.addView(imageBackground); 144 | imageBackground.setLayoutParams(imageBackground_LayoutParams); 145 | 146 | LinearLayout imageContainer = new LinearLayout(context); 147 | RelativeLayout.LayoutParams imageContainer_LayoutParams = 148 | new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 149 | imageContainer.setOrientation(LinearLayout.VERTICAL); 150 | imageContainer.setId(ID_IMG_CONT); 151 | imageContainer_LayoutParams.width = (int) (100 * scale + 0.5f); 152 | imageContainer_LayoutParams.height = (int) (100 * scale + 0.5f); 153 | imageContainer_LayoutParams.topMargin = (int) (125 * scale + 0.5f); 154 | imageContainer_LayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 155 | imageContainer_LayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 156 | root.addView(imageContainer); 157 | imageContainer.setLayoutParams(imageContainer_LayoutParams); 158 | 159 | TextView contentCaption = new TextView(context); 160 | RelativeLayout.LayoutParams contentCaption_LayoutParams = 161 | new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 162 | contentCaption.setTextSize(22f); 163 | contentCaption.setTypeface(Typeface.DEFAULT_BOLD); 164 | contentCaption.setId(ID_CONT_CAP); 165 | contentCaption_LayoutParams.addRule(RelativeLayout.BELOW, ID_IMG_CONT); 166 | contentCaption_LayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 167 | root.addView(contentCaption); 168 | contentCaption.setLayoutParams(contentCaption_LayoutParams); 169 | 170 | ScrollView scrollView = new ScrollView(context); 171 | RelativeLayout.LayoutParams scrollView_LayoutParams = 172 | new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 173 | scrollView.setPadding(0, (int) (8 * scale + 0.5f), 0, (int) (8 * scale + 0.5f)); 174 | scrollView_LayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; 175 | scrollView_LayoutParams.addRule(RelativeLayout.BELOW, ID_CONT_CAP); 176 | root.addView(scrollView); 177 | scrollView.setLayoutParams(scrollView_LayoutParams); 178 | 179 | TextView contentText = new TextView(context); 180 | contentText.setPadding((int) (16 * scale), (int)(8 * scale), (int) (16 * scale), (int) (8 * scale)); 181 | ScrollView.LayoutParams contentText_LayoutParams = 182 | new ScrollView.LayoutParams(ScrollView.LayoutParams.WRAP_CONTENT, ScrollView.LayoutParams.WRAP_CONTENT); 183 | contentText.setTextSize(16f); 184 | contentText.setId(ID_CONT_TEXT); 185 | scrollView.addView(contentText); 186 | contentText.setLayoutParams(contentText_LayoutParams); 187 | 188 | return root; 189 | } 190 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ModDialog 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app/src/test/java/ru/svolf/moddialog/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package ru.svolf.moddialog; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | plugins { 3 | id 'com.android.application' version '7.3.1' apply false 4 | id 'com.android.library' version '7.3.1' apply false 5 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Enables namespacing of each library's R class so that its R class includes only the 19 | # resources declared in the library itself and none from the library's dependencies, 20 | # thereby reducing the size of the R class for that library 21 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowVolf/ModDialog/e2accb227fff6808bed94adde86971fa9ca0d2f4/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Jan 02 00:56:06 KRAT 2023 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | } 14 | } 15 | rootProject.name = "ModDialog" 16 | include ':app' 17 | --------------------------------------------------------------------------------