/* Android IMSI-Catcher Detector | (c) AIMSICD Privacy Project * ----------------------------------------------------------- * LICENSE: http://git.io/vki47 | TERMS: http://git.io/vki4o * ----------------------------------------------------------- */ package com.secupwn.aimsicd.ui.activities; import android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; import android.support.v7.app.AlertDialog; import android.text.method.LinkMovementMethod; import android.view.Gravity; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.ScrollView; import android.widget.TextView; import com.secupwn.aimsicd.BuildConfig; import com.secupwn.aimsicd.R; import io.freefair.android.injection.annotation.InjectView; import io.freefair.android.injection.annotation.XmlLayout; import io.freefair.android.injection.app.InjectionAppCompatActivity; @XmlLayout(R.layout.activity_about) public class AboutActivity extends InjectionAppCompatActivity { @InjectView(R.id.aimsicd_credits_link) private Button btncredits; @InjectView(R.id.aimsicd_version) private TextView versionNumber; @InjectView(R.id.build_number) private TextView buildNumberTextView; @InjectView(R.id.git_sha) private TextView gitShaTextView; @InjectView(R.id.textViewIdle) private TextView idleTextView; @InjectView(R.id.textViewOk) private TextView okTextView; @InjectView(R.id.textViewMedium) private TextView mediumTextView; @InjectView(R.id.textViewHigh) private TextView highTextView; @InjectView(R.id.textViewDanger) private TextView dangerTextView; @InjectView(R.id.textViewSkull) private TextView skullTextView; private boolean closeAfterFinish = true; private Context mContext = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); versionNumber.setText(getString(R.string.app_version, BuildConfig.VERSION_NAME)); String buildNumber = BuildConfig.BUILD_NUMBER; //noinspection ConstantConditions if (buildNumber == null) { buildNumber = getString(R.string.n_a); } buildNumberTextView.setText(getString(R.string.buildnumber, buildNumber)); gitShaTextView.setText(getString(R.string.git_sha, BuildConfig.GIT_SHA)); //GitHub WIKI Link View tv = findViewById(R.id.aimsicd_wiki_link); setLink(tv, R.string.aimsicd_wiki_link); //GitHub Website Link tv = findViewById(R.id.aimsicd_github_link); setLink(tv, R.string.aimsicd_github_link); //Disclaimer Link tv = findViewById(R.id.aimsicd_disclaimer_link); setLink(tv, R.string.disclaimer_link); //GitHub Contribution Link tv = findViewById(R.id.aimsicd_contribute_link); setLink(tv, R.string.aimsicd_contribute_link); //WIP Release Link tv = findViewById(R.id.aimsicd_release_link); setLink(tv, R.string.aimsicd_release_link); //Changelog Link tv = findViewById(R.id.aimsicd_changelog_link); setLink(tv, R.string.aimsicd_changelog_link); //License Link tv = findViewById(R.id.aimsicd_license_link); setLink(tv, R.string.aimsicd_license_link); idleTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showInfoDialog(Status.IDLE); } }); okTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showInfoDialog(Status.OK); } }); mediumTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showInfoDialog(Status.MEDIUM); } }); highTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showInfoDialog(Status.HIGH); } }); dangerTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showInfoDialog(Status.DANGER); } }); skullTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showInfoDialog(Status.SKULL); } }); btncredits.setOnClickListener(new View.OnClickListener() { AlertDialog mCreditsDialog; @Override public void onClick(View view) { final TextView mCreditsTitle = new TextView(getApplicationContext()); final TextView mCreditsText = new TextView(mContext); final ScrollView mScrollView = new ScrollView(getApplicationContext()); mCreditsText.setText(R.string.about_credits_content); mCreditsText.setTextSize(18); mCreditsText.setTypeface(Typeface.DEFAULT_BOLD); mCreditsTitle.setText(R.string.about_credits); mCreditsTitle.setTypeface(Typeface.DEFAULT_BOLD); mCreditsTitle.setTextSize(20); mCreditsTitle.setGravity(Gravity.CENTER_HORIZONTAL); mScrollView.addView(mCreditsText); Animation scrollTo = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.credits_dialog_scroll); mCreditsText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { closeAfterFinish = false; mCreditsText.clearAnimation(); } }); scrollTo.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (closeAfterFinish) { mCreditsDialog.cancel(); } } @Override public void onAnimationRepeat(Animation animation) { } }); mCreditsText.setGravity(Gravity.CENTER_HORIZONTAL); mCreditsText.setMovementMethod(LinkMovementMethod.getInstance()); scrollTo.setDuration(countLines(getResources().getString(R.string.about_credits_content)) * 500); mCreditsText.startAnimation(scrollTo); closeAfterFinish = true; mCreditsDialog = new AlertDialog.Builder(AboutActivity.this) .setCustomTitle(mCreditsTitle) .setPositiveButton(android.R.string.ok, null) .setView(mScrollView) .show(); } }); } private void setLink(View b, final int link) { b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getResources().getString(link))); startActivity(intent); } }); } private void showInfoDialog(Status status) { new AlertDialog.Builder(this) .setIcon(status.getIcon()) .setTitle(getString(R.string.status) + "\t" + getString(status.getName())) .setMessage(status.getDescription()) .setPositiveButton(android.R.string.ok, null) .show(); } public enum Status { IDLE( R.drawable.sense_idle, R.string.status_idle, R.string.status_idle_detail_info ), OK( R.drawable.sense_ok, R.string.status_ok, R.string.status_ok_detail_info ), MEDIUM( R.drawable.sense_medium, R.string.status_medium, R.string.status_medium_detail_info ), HIGH( R.drawable.sense_high, R.string.status_high, R.string.status_high_detail_info ), DANGER( R.drawable.sense_danger, R.string.status_danger, R.string.status_danger_detail_info ), SKULL( R.drawable.sense_skull, R.string.status_skull, R.string.status_skull_detail_info ); @DrawableRes private int icon; @StringRes private int name; @StringRes private int description; Status(@DrawableRes int icon, @StringRes int name, @StringRes int description) { this.icon = icon; this.name = name; this.description = description; } @DrawableRes public int getIcon() { return icon; } @StringRes public int getName() { return name; } @StringRes public int getDescription() { return description; } } private int countLines(String mString) { String[] lines = mString.split("\r\n|\r|\n"); return lines.length; } }