From b30cc83c17316b0b6b30ecfe1e907aeb8995d740 Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Tue, 8 Mar 2016 20:54:31 +0530 Subject: [PATCH 1/4] fixed #1 --- .../com/venomvendor/sms/deduplicate/activity/Deduplication.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java index 480be84..a25b2f2 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java @@ -125,6 +125,7 @@ public void onClick(DialogInterface dialog, int which) { editor.putBoolean(Constants.SHOW_EULA, false); editor.commit(); dialog.dismiss(); + initViews(); } }) .setNegativeButton(android.R.string.cancel, From 54a91439cc65138ae9ace199664e5594e4eb6415 Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Tue, 8 Mar 2016 20:56:46 +0530 Subject: [PATCH 2/4] Show revert dialog, when no duplicates found. Refactored code to meaningful Listener name. Cleaned code. Throw exceptions. --- .../deduplicate/activity/Deduplication.java | 26 ++++---- .../sms/deduplicate/data/FindDuplicates.java | 59 ++++++++++--------- 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java index a25b2f2..86d470b 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java @@ -45,6 +45,7 @@ import com.venomvendor.sms.deduplicate.R; import com.venomvendor.sms.deduplicate.data.FindDuplicates; +import com.venomvendor.sms.deduplicate.data.FindDuplicates.OnDuplicatesFoundListener; import com.venomvendor.sms.deduplicate.service.DeleteSmsService; import com.venomvendor.sms.deduplicate.util.Constants; import com.venomvendor.sms.deduplicate.util.Utils; @@ -113,7 +114,7 @@ protected void onCreate(Bundle savedInstanceState) { } private void showEula() { - AlertDialog.Builder builder = new AlertDialog.Builder(Deduplication.this) + AlertDialog.Builder builder = new AlertDialog.Builder(this) .setTitle(getString(R.string.app_name)) .setMessage(getString(R.string.eula)) .setCancelable(false) @@ -256,7 +257,7 @@ private void deadLock() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - Deduplication.this.finish(); + finish(); } }, null ); @@ -301,7 +302,7 @@ private void doCancel() { private void cancelDeletion() { if (mService == null) { - mService = new Intent(Deduplication.this, DeleteSmsService.class); + mService = new Intent(this, DeleteSmsService.class); } stopService(mService); } @@ -342,20 +343,25 @@ public void onClick(DialogInterface dialog, int id) { } private void findDuplicates() { - FindDuplicates findDuplicates = new FindDuplicates(Deduplication.this); - findDuplicates.setOnDeleteDuplicatesListener(new FindDuplicates.OnDeleteDuplicatesListener() { + FindDuplicates findDuplicates = new FindDuplicates(this); + findDuplicates.setOnDuplicatesFoundListener(new OnDuplicatesFoundListener() { @Override - public void deleteDuplicates(ArrayList duplicateIds) { - mDeDuplicate.setVisibility(View.GONE); - mProgressBarHolder.setVisibility(View.VISIBLE); - startDeleteService(duplicateIds); + public void duplicatesFound(ArrayList duplicateIds) { + if (duplicateIds.isEmpty()) { + Toast.makeText(getApplicationContext(), R.string.no_duplicates, Toast.LENGTH_SHORT).show(); + Utils.revertOldApp(getApplicationContext()); + } else { + mDeDuplicate.setVisibility(View.GONE); + mProgressBarHolder.setVisibility(View.VISIBLE); + startDeleteService(duplicateIds); + } } }); findDuplicates.execute(); } private void startDeleteService(ArrayList duplicateIds) { - mService = new Intent(Deduplication.this, DeleteSmsService.class); + mService = new Intent(this, DeleteSmsService.class); mService.putStringArrayListExtra(Constants.DUPLICATE_IDS, duplicateIds); startService(mService); } diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java b/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java index 16c3c17..2529b75 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java @@ -22,7 +22,6 @@ import android.content.DialogInterface; import android.database.Cursor; import android.os.AsyncTask; -import android.widget.Toast; import com.venomvendor.sms.deduplicate.R; import com.venomvendor.sms.deduplicate.util.Constants; @@ -41,13 +40,16 @@ public class FindDuplicates extends AsyncTask { private ProgressDialog mProgressDialog; private Cursor mCursor; private int mIndex; - private OnDeleteDuplicatesListener mListener; + private OnDuplicatesFoundListener mListener; public FindDuplicates(Activity activity) { this.mContext = activity; } - public void setOnDeleteDuplicatesListener(OnDeleteDuplicatesListener listener) { + public void setOnDuplicatesFoundListener(OnDuplicatesFoundListener listener) { + if (listener == null) { + throw new NullPointerException("Listener cannot be null."); + } this.mListener = listener; } @@ -115,41 +117,40 @@ protected void onPostExecute(Boolean result) { } private void showConfirmation() { - if (mDuplicateIds.isEmpty()) { - Toast.makeText(mContext, R.string.no_duplicates, Toast.LENGTH_SHORT).show(); - return; + deleteDuplicates(); + } else { + AlertDialog.Builder confirmationDialog = new AlertDialog.Builder(mContext); + confirmationDialog.setCancelable(false); + confirmationDialog.setMessage(String.format(mContext.getString(R.string.delete_duplicates), mDuplicateIds.size())); + + confirmationDialog.setPositiveButton(mContext.getString(android.R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + deleteDuplicates(); + } + }); + confirmationDialog.setNegativeButton(mContext.getString(android.R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + confirmationDialog.show(); } - - AlertDialog.Builder confirmationDialog = new AlertDialog.Builder(mContext); - confirmationDialog.setCancelable(false); - confirmationDialog.setMessage(String.format(mContext.getString(R.string.delete_duplicates), mDuplicateIds.size())); - - confirmationDialog.setPositiveButton(mContext.getString(android.R.string.ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - deleteDuplicates(); - } - }); - confirmationDialog.setNegativeButton(mContext.getString(android.R.string.cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - confirmationDialog.show(); } private void deleteDuplicates() { - if (mListener != null) { - mListener.deleteDuplicates(mDuplicateIds); + if (mListener == null) { + throw new NullPointerException("OnDuplicatesFoundListener not implemented."); } + mListener.duplicatesFound(mDuplicateIds); mDuplicateIds.clear(); } - public interface OnDeleteDuplicatesListener { - void deleteDuplicates(ArrayList duplicateIds); + public interface OnDuplicatesFoundListener { + void duplicatesFound(ArrayList duplicateIds); } } From 27972d8c4a53111c5cccdc37d81cae6ed9b569dd Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Wed, 9 Mar 2016 16:21:27 +0530 Subject: [PATCH 3/4] for next release. --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 4f21498..856983b 100644 --- a/build.gradle +++ b/build.gradle @@ -25,8 +25,8 @@ task clean(type: Delete) { ext { DEBUG = true MAJOR = 1 - MINOR = 0 - PATCH = 1 + MINOR = 1 + PATCH = 0 RELEASE_SUFFIX = '' //"alpha/beta/debug" TODO-Always check during release. DEBUG_SUFFIX = "${RELEASE_SUFFIX}-debug" versionName = "${MAJOR}.${MINOR}.${PATCH}" //For Users. From f91f7430a6c58b5c57d6217de8da0692aa72c2fb Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Wed, 9 Mar 2016 23:52:33 +0530 Subject: [PATCH 4/4] Added checkbox feature to ignore timestamp if messed up with timezone. Added pluralization. Used correct style. added support for API level 4+ --- app/build.gradle | 13 + .../deduplicate/activity/Deduplication.java | 90 ++++--- .../sms/deduplicate/data/FindDuplicates.java | 17 +- .../deduplicate/service/DeleteSmsService.java | 4 +- .../main/res/drawable-hdpi/ic_launcher.png | Bin 3034 -> 0 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 3689 -> 6714 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 6714 -> 0 bytes .../res/layout/activity_deduplication.xml | 244 +++++++++++------- app/src/main/res/values-v11/styles.xml | 23 ++ app/src/main/res/values-v14/styles.xml | 7 + app/src/main/res/values/dimens.xml | 3 +- app/src/main/res/values/strings.xml | 17 +- app/src/main/res/values/styles.xml | 2 +- build.gradle | 4 +- 14 files changed, 294 insertions(+), 130 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-v11/styles.xml create mode 100644 app/src/main/res/values-v14/styles.xml diff --git a/app/build.gradle b/app/build.gradle index b207b54..42026d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,6 +12,19 @@ android { versionName rootProject.ext.versionName } + productFlavors { + froyo { + minSdkVersion 8 + versionCode rootProject.ext.froyo + } + donut { + minSdkVersion 4 + maxSdkVersion 7 + targetSdkVersion 7 + versionCode rootProject.ext.donut + } + } + signingConfigs { release { try { diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java index 86d470b..78594ec 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java @@ -38,8 +38,10 @@ import android.view.Gravity; import android.view.View; import android.widget.Button; +import android.widget.CheckedTextView; import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.RadioButton; import android.widget.TextView; import android.widget.Toast; @@ -73,6 +75,12 @@ public class Deduplication extends Activity implements View.OnClickListener { private Button mCancel; private Button mRevert; private TextView mDeleted; + private TextView mRevertMessage; + private CheckedTextView mIgnoreTimestamp; + private LinearLayout mIgnoreMessage; + private RadioButton mKeepFirst; + private SharedPreferences mPref; + private final BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -85,25 +93,27 @@ public void onReceive(Context context, Intent intent) { mCancel.setText(android.R.string.cancel); mDeDuplicate.setVisibility(View.VISIBLE); mProgressBarHolder.setVisibility(View.GONE); - Toast toast = Toast.makeText(context, String.format(getString(R.string.deleted_messages), - deletedMessages, totalMessages), Toast.LENGTH_SHORT); + + String format = getResources().getQuantityString(R.plurals.deleted_messages, totalMessages); + Toast toast = Toast.makeText(context, String.format(format, deletedMessages, totalMessages), Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } - mDeleted.setText(String.format(getString(R.string.deleted_messages), - deletedMessages, totalMessages)); + + String format = getResources().getQuantityString(R.plurals.deleted_messages, totalMessages); + + mDeleted.setText(String.format(format, deletedMessages, totalMessages)); mProgressBar.setMax(totalMessages); mProgressBar.setProgress(deletedMessages); } }; - private TextView mRevertMessage; - private SharedPreferences mPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_deduplication); + mPref = PreferenceManager.getDefaultSharedPreferences(this); if (mPref.getBoolean(Constants.SHOW_EULA, true)) { @@ -139,21 +149,29 @@ public void onClick(DialogInterface dialog, int which) { builder.create().show(); } - @TargetApi(Build.VERSION_CODES.KITKAT) private void initViews() { mDeDuplicate = (Button) findViewById(R.id.deduplicate); - Button mMoreApps = (Button) findViewById(R.id.more_apps); mCancel = (Button) findViewById(R.id.cancel); mRevert = (Button) findViewById(R.id.revert); mDeleted = (TextView) findViewById(R.id.current_progress); mRevertMessage = (TextView) findViewById(R.id.revert_message); mProgressBarHolder = (LinearLayout) findViewById(R.id.progress_bar_holder); mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); + mIgnoreTimestamp = (CheckedTextView) findViewById(R.id.ignore_timestamp); + mIgnoreMessage = (LinearLayout) findViewById(R.id.ignore_timestamp_message); + mKeepFirst = (RadioButton) findViewById(R.id.keep_first); + + initListeners(); + } + @TargetApi(Build.VERSION_CODES.KITKAT) + private void initListeners() { + findViewById(R.id.more_apps).setOnClickListener(this); mDeDuplicate.setOnClickListener(this); - mMoreApps.setOnClickListener(this); mCancel.setOnClickListener(this); mRevert.setOnClickListener(this); + mIgnoreTimestamp.setOnClickListener(this); + if (getIntent().getBooleanExtra(Constants.FROM_SERVICE, false)) { doCancel(); } @@ -271,24 +289,10 @@ protected void onNewIntent(Intent intent) { } } - @Override - public void onClick(View view) { - switch (view.getId()) { - case R.id.deduplicate: - deduplicate(); - break; - case R.id.more_apps: - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse("market://search?q=pub:VenomVendor")); - startActivity(intent); - break; - case R.id.cancel: - doCancel(); - break; - case R.id.revert: - Utils.revertOldApp(getApplicationContext()); - break; - } + private void showHideWarning() { + mKeepFirst.setChecked(true); + mIgnoreTimestamp.setChecked(!mIgnoreTimestamp.isChecked()); + mIgnoreMessage.setVisibility(mIgnoreTimestamp.isChecked() ? View.VISIBLE : View.GONE); } private void doCancel() { @@ -311,7 +315,8 @@ private void cancelDeletion() { private void deduplicate() { mProgressBar.setMax(0); mProgressBar.setProgress(0); - mDeleted.setText(String.format(getString(R.string.deleted_messages), 0, 0)); + + mDeleted.setText(String.format(getResources().getQuantityString(R.plurals.deleted_messages, 0), 0, 0)); mProgressBarHolder.setVisibility(View.GONE); if (!isValidMessageApp(this)) { Intent setApp = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); @@ -343,7 +348,7 @@ public void onClick(DialogInterface dialog, int id) { } private void findDuplicates() { - FindDuplicates findDuplicates = new FindDuplicates(this); + FindDuplicates findDuplicates = new FindDuplicates(this, mIgnoreTimestamp.isChecked(), mKeepFirst.isChecked()); findDuplicates.setOnDuplicatesFoundListener(new OnDuplicatesFoundListener() { @Override public void duplicatesFound(ArrayList duplicateIds) { @@ -372,11 +377,11 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == APP_CHANGE_REQUEST) { if (resultCode == RESULT_OK || isValidMessageApp(this)) { mRevert.setVisibility(View.VISIBLE); - mRevertMessage.setVisibility(View.VISIBLE); + mRevertMessage.setVisibility(View.GONE); showWarning(); } else { mRevert.setVisibility(View.GONE); - mRevertMessage.setVisibility(View.GONE); + mRevertMessage.setVisibility(View.VISIBLE); showCustomDialog(getString(R.string.failed), getString(R.string.failure_message), new DialogInterface.OnClickListener() { @Override @@ -395,6 +400,29 @@ public void onClick(DialogInterface dialog, int which) { } + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.deduplicate: + deduplicate(); + break; + case R.id.more_apps: + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse("market://search?q=pub:VenomVendor")); + startActivity(intent); + break; + case R.id.cancel: + doCancel(); + break; + case R.id.revert: + Utils.revertOldApp(getApplicationContext()); + break; + case R.id.ignore_timestamp: + showHideWarning(); + break; + } + } + @Override protected void onPause() { unregisterReceiver(mMessageReceiver); diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java b/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java index 2529b75..fb9dfc6 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java @@ -37,13 +37,17 @@ public class FindDuplicates extends AsyncTask { private final ArrayList mDuplicateIds = new ArrayList(); private final List mHashCodeCache = new ArrayList(); private final Activity mContext; + private final boolean mChecked; + private final boolean mKeepFirst; private ProgressDialog mProgressDialog; private Cursor mCursor; private int mIndex; private OnDuplicatesFoundListener mListener; - public FindDuplicates(Activity activity) { + public FindDuplicates(Activity activity, boolean checked, boolean keepFirst) { this.mContext = activity; + this.mChecked = checked; + this.mKeepFirst = keepFirst; } public void setOnDuplicatesFoundListener(OnDuplicatesFoundListener listener) { @@ -65,7 +69,8 @@ protected void onPreExecute() { @Override protected Boolean doInBackground(Void... params) { - mCursor = mContext.getContentResolver().query(Constants.CONTENT_URI, null, null, null, null); + String sortOrder = mChecked ? Constants.DATE + (mKeepFirst ? " ASC" : " DESC") : null; + mCursor = mContext.getContentResolver().query(Constants.CONTENT_URI, null, null, null, sortOrder); if (mCursor != null) { mProgressDialog.setMax(mCursor.getCount()); try { @@ -89,9 +94,12 @@ protected Boolean doInBackground(Void... params) { private void collectDuplicates() { final String _id = Integer.toString(mCursor.getInt(0)); final List uniqueData = new ArrayList(); + uniqueData.add(mCursor.getString(mCursor.getColumnIndex(Constants.ADDRESS))); - uniqueData.add(mCursor.getString(mCursor.getColumnIndex(Constants.DATE))); uniqueData.add(mCursor.getString(mCursor.getColumnIndex(Constants.BODY))); + if (!mChecked) { + uniqueData.add(mCursor.getString(mCursor.getColumnIndex(Constants.DATE))); + } int hashCode = uniqueData.hashCode(); if (mHashCodeCache.contains(hashCode)) { @@ -122,7 +130,8 @@ private void showConfirmation() { } else { AlertDialog.Builder confirmationDialog = new AlertDialog.Builder(mContext); confirmationDialog.setCancelable(false); - confirmationDialog.setMessage(String.format(mContext.getString(R.string.delete_duplicates), mDuplicateIds.size())); + confirmationDialog.setMessage(mContext.getResources() + .getQuantityString(R.plurals.delete_duplicates, mDuplicateIds.size(), mDuplicateIds.size())); confirmationDialog.setPositiveButton(mContext.getString(android.R.string.ok), new DialogInterface.OnClickListener() { @Override diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java b/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java index b9cdda0..02be6af 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java @@ -83,6 +83,7 @@ private void deleteDuplicates() { mDelDuplicates = new Thread(new Runnable() { @Override public void run() { + String format = getResources().getQuantityString(R.plurals.deleted_messages, size); ContentResolver contentResolver = getContentResolver(); int k = 0; for (int i = 0; i < size; i++) { @@ -91,8 +92,7 @@ public void run() { if (builder != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - builder.setContentTitle(String.format(getString(R.string.deleted_messages), - i + 1, size)); + builder.setContentTitle(String.format(format, i + 1, size)); builder.setProgress(size, i + 1, false); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index c3597a9203d1883c216849d095bdeb3197cf97f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3034 zcmaJ@c{o)28=tW>43Q9`YnoIh#_VRPu{2{D%^)UQs4;VfDYG;)GNi~7B8?D{N@Xco zS}sDVTisFJXw#|%b(55CDcOIca)0-a``q(9=X}54_q?C?{k+?GPNuK7$6V+_Ch1}#L`FpZXwYww1%^gd3qq)<`B#i4UmLZbKIU+7F>sz4q{S%A*Pb`Hd1vqlClr0uV&vt=t zlvpm7MTsRa8tr@4VYVy|S0I`ZB4!HpBW^k%6>J4~?ozQ3_C3=S!N0J;ad3_t9G{OQ zVj{RmJb{BolJGnd63usXBoncG0-2A2|HSkDk-;CGs+OoDk<1dJph-MFfCtpgsZJ{r zgCUZTB!EXm0z3l1B}Z@x7(51!Qd30DG|xYpX;!4}(3$PuqoF?hJzRiDJyBBi=(v|m zX@EeG0S4Wbt#~qcP!PSS%TzTT`=IeLLm0Uv)n-K|3w9h29i8XNww>=qH%`_0nAYH# z>znmbbG?&MdAXjBt`o?w;N<+A5HP_g`L5&cOzVE7#xjMp1m01`$UV|%? zeR!1fp4b^@7_Hkz3@o;23;xhOUNTJ{>2_P-=cR>6#41MIBCR}fwqC~LhwN#_LD0;S z{y@UFz_%4nC!gt_e237fD?X5&vhG(x)%vxs!DD8ZM@Mmxd08P7vU24oGkN#wq6h$< zk1rcly1d^vZ`vxOvi@`Cmq3ukajRX%S;dwNYGQ@|=bL}*3$lp4*O18`);V8FMEVDs zo!deT^N~D9&`5p$Mdq!ps;BNg*_t+qw3gya$h=~k@UmlM10^p#!RHd6X}?*}_yG#b z>^j$|i8j95{MWJo(~s?I*WOaNz(M=+&RwqwQZ8fIg4k8r$tEBuNIOZx+Ecb7G_owN%satyJwq@9gBKeccW^ekwdE6rpjvrZs6jF84_4}J` zg)aJ$QKXdehaH#C`kYdgS{9D&HC9GkY)Pnn(jczB^1N~V$1&?1cu7pxkx&LjpdD$O zHB=LxH1@FZRT_?*=1E@pOLz*ku6vK?)#Sb#ceV1F6fdK?3yQ)|#607b{eg+o;#KGR zwx2uHnlGCSjSQWeoaKkdY;A2`T)*v&@W$ftaymR~tTE)av={!M?!uhvP1UN}$^vT77QTM>9mwy$H1uz;P%3e{86`5&$)Oh^ z+q#$y;u`;_QIs90jBedJ9PznyK`N)G7qEO^X|KKMx0O2H@^Bql0DJNKDBq$-WtC^p z?dST;AQ-$dwMYxGCaro;z{b-?N9$a*yUwul^tY#(yjEU4(X^{0UpK7%faXGT|XXDf@G;Me?zAy>)xmDZUCU8>pu*SwJmo!@~Ahf0zO{FEZAxeRm|Q zKW#C4t6|^Ai+xc}33K*SF^9ZJ1`VhU$&k8W1O3XkYYf1q+g+N{vHicH49QhPXd@io z*Y$vri<|bg!km49&QQ#o_%Fa&^x_)x)SLIb883_wS!?-yRm&iP~y4LkMYL zim7*#O>D{vtHmc;CZ1v9c!6LI&AZnlZ+n!nl(%`~994dD7Wxm`j$u;keM^aT6-h5u%lMG=M`nOJ3=$vy(6a3YoCG&=@Nanu^HRu(~Ap8K=WT+D< z-@!JIKn&o%@h^d0H`D1@+jq_I7uX@zr{t)&)v&ydzw&pxCHYZIkH5c}#MU`Cw+;?3WhYFWPbQoRRgDJ?A3FOi({4>1zvF7_^SCSH z%k?1mqph`ij8!8~-N)7|i}2d2hM2=s#W~YfL+<{ccN$Sy_m`?TJ@vU<G#<8$zlKt2r~65;XV1TJAk=UJmAmj76N9PxD|@ZsZd{vma&f5sl>YG61RWZM?6U{+#4 z`7g!?D<)k)?T0&tq8gV+U6bBJr#@m0#K|YFiz#0cvKyX1o*N<=EzxCaE?U2Q!{k^} zYE|W=f#-ok&lV8Aysp#rygZ6H9ujFpze|>AU3PtY1rhGLdT`whgfZzFqWv@38L^y{ zrn!Rl+QguWS>SID!`uxiKpZ>)E;t=*3aV5r-3^#9j?dpxm{{!>K0ZIS> diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png index 1a6e8a692d3d6d336fa14a753b70a2efd19a14d4..40979f5f2577df03ad1aa07c60e322f78e2a65f0 100644 GIT binary patch delta 5837 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 IS2Pd!FO!AmjsO4v delta 2788 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 vDJePiOL3f5`J% diff --git a/app/src/main/res/layout/activity_deduplication.xml b/app/src/main/res/layout/activity_deduplication.xml index 1709aca..c278265 100644 --- a/app/src/main/res/layout/activity_deduplication.xml +++ b/app/src/main/res/layout/activity_deduplication.xml @@ -1,115 +1,185 @@ - - -