From 6b032b751324a30120cfaabe88940f95171df11f Mon Sep 17 00:00:00 2001 From: cyBerta Date: Tue, 29 Dec 2020 00:54:08 +0100 Subject: new year cleanup: restructure messy project --- .../bitmaskclient/fragments/AboutFragment.java | 67 --- .../bitmaskclient/fragments/AlwaysOnDialog.java | 76 --- .../fragments/DonationReminderDialog.java | 120 ----- .../fragments/ExcludeAppsFragment.java | 335 ------------ .../leap/bitmaskclient/fragments/LogFragment.java | 587 --------------------- .../bitmaskclient/fragments/TetheringDialog.java | 258 --------- 6 files changed, 1443 deletions(-) delete mode 100644 app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/fragments/ExcludeAppsFragment.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java (limited to 'app/src/main/java/se/leap/bitmaskclient/fragments') diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java b/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java deleted file mode 100644 index b7743a75..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java +++ /dev/null @@ -1,67 +0,0 @@ -package se.leap.bitmaskclient.fragments; - -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import se.leap.bitmaskclient.BuildConfig; -import se.leap.bitmaskclient.R; - -import static android.view.View.VISIBLE; - -public class AboutFragment extends Fragment { - - final public static String TAG = AboutFragment.class.getSimpleName(); - final public static int VIEWED = 0; - - @InjectView(R.id.version) - TextView versionTextView; - - @InjectView(R.id.terms_of_service) - TextView termsOfService; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.f_about, container, false); - ButterKnife.inject(this, view); - return view; - } - - @Override - public void onStart() { - super.onStart(); - String version; - String name = "Bitmask"; - try { - PackageInfo packageinfo = getActivity().getPackageManager().getPackageInfo( - getActivity().getPackageName(), 0); - version = packageinfo.versionName; - name = getString(R.string.app_name); - } catch (NameNotFoundException e) { - version = "error fetching version"; - } - - versionTextView.setText(getString(R.string.version_info, name, version)); - - if (BuildConfig.FLAVOR_branding.equals("custom") && hasTermsOfServiceResource()) { - termsOfService.setText(getString(getTermsOfServiceResource())); - termsOfService.setVisibility(VISIBLE); - } - } - - private boolean hasTermsOfServiceResource() { - return getTermsOfServiceResource() != 0; - } - - private int getTermsOfServiceResource() { - return this.getContext().getResources().getIdentifier("terms_of_service", "string", this.getContext().getPackageName()); - } - -} diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java deleted file mode 100644 index cb26e685..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java +++ /dev/null @@ -1,76 +0,0 @@ -package se.leap.bitmaskclient.fragments; - -import android.app.Dialog; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatDialogFragment; -import androidx.appcompat.widget.AppCompatTextView; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckBox; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.views.IconTextView; - -import static se.leap.bitmaskclient.utils.PreferenceHelper.saveShowAlwaysOnDialog; - - -/** - * Created by cyberta on 25.02.18. - */ - - - -public class AlwaysOnDialog extends AppCompatDialogFragment { - - public final static String TAG = AlwaysOnDialog.class.getName(); - - @InjectView(R.id.do_not_show_again) - CheckBox doNotShowAgainCheckBox; - - @InjectView(R.id.user_message) - IconTextView userMessage; - - @InjectView(R.id.block_vpn_user_message) - AppCompatTextView blockVpnUserMessage; - - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.d_checkbox_confirm, null); - ButterKnife.inject(this, view); - - userMessage.setIcon(R.drawable.ic_settings); - userMessage.setText(getString(R.string.always_on_vpn_user_message)); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - blockVpnUserMessage.setVisibility(View.VISIBLE); - } - - builder.setView(view) - .setPositiveButton(android.R.string.ok, (dialog, id) -> { - if (doNotShowAgainCheckBox.isChecked()) { - saveShowAlwaysOnDialog(getContext(), false); - } - Intent intent = new Intent("android.net.vpn.SETTINGS"); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - }) - .setNegativeButton(R.string.cancel, (dialog, id) -> dialog.cancel()); - return builder.create(); - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java deleted file mode 100644 index 046acad4..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java +++ /dev/null @@ -1,120 +0,0 @@ -package se.leap.bitmaskclient.fragments; - -import android.app.Dialog; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatDialogFragment; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; - -import java.text.ParseException; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.utils.DateHelper; -import se.leap.bitmaskclient.utils.PreferenceHelper; - -import static se.leap.bitmaskclient.Constants.DONATION_REMINDER_DURATION; -import static se.leap.bitmaskclient.Constants.DONATION_URL; -import static se.leap.bitmaskclient.Constants.ENABLE_DONATION; -import static se.leap.bitmaskclient.Constants.ENABLE_DONATION_REMINDER; -import static se.leap.bitmaskclient.Constants.FIRST_TIME_USER_DATE; -import static se.leap.bitmaskclient.Constants.LAST_DONATION_REMINDER_DATE; - -public class DonationReminderDialog extends AppCompatDialogFragment { - - public final static String TAG = DonationReminderDialog.class.getName(); - private static boolean isShown = false; - - @InjectView(R.id.btnDonate) - Button btnDonate; - - @InjectView(R.id.btnLater) - Button btnLater; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.donation_reminder_dialog, null); - ButterKnife.inject(this, view); - isShown = true; - - builder.setView(view); - btnDonate.setOnClickListener(v -> { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(DONATION_URL)); - try { - startActivity(browserIntent); - } catch (ActivityNotFoundException e) { - e.printStackTrace(); - } - PreferenceHelper.putString(getContext(), LAST_DONATION_REMINDER_DATE, - DateHelper.getCurrentDateString()); - dismiss(); - }); - btnLater.setOnClickListener(v -> { - PreferenceHelper.putString(getContext(), LAST_DONATION_REMINDER_DATE, - DateHelper.getCurrentDateString()); - dismiss(); - }); - - return builder.create(); - } - - public static boolean isCallable(Context context) { - if (isShown) { - return false; - } - - if (!ENABLE_DONATION || !ENABLE_DONATION_REMINDER) { - return false; - } - - if (context == null) { - Log.e(TAG, "context is null!"); - return false; - } - - String firstTimeUserDate = PreferenceHelper.getString(context, FIRST_TIME_USER_DATE, null); - if (firstTimeUserDate == null) { - PreferenceHelper.putString(context, FIRST_TIME_USER_DATE, DateHelper.getCurrentDateString()); - return false; - } - - try { - long diffDays; - - diffDays = DateHelper.getDateDiffToCurrentDateInDays(firstTimeUserDate); - if (diffDays < 1) { - return false; - } - - String lastDonationReminderDate = PreferenceHelper.getString(context, LAST_DONATION_REMINDER_DATE, null); - if (lastDonationReminderDate == null) { - return true; - } - diffDays = DateHelper.getDateDiffToCurrentDateInDays(lastDonationReminderDate); - return diffDays >= DONATION_REMINDER_DURATION; - - } catch (ParseException e) { - e.printStackTrace(); - Log.e(TAG, e.getMessage()); - return false; - } - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/ExcludeAppsFragment.java b/app/src/main/java/se/leap/bitmaskclient/fragments/ExcludeAppsFragment.java deleted file mode 100644 index 9559978b..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/ExcludeAppsFragment.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2012-2016 Arne Schwabe - * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt - */ - -package se.leap.bitmaskclient.fragments; - -import android.Manifest; -import android.app.Activity; -import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.text.TextUtils; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.CompoundButton; -import android.widget.Filter; -import android.widget.Filterable; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.SearchView; -import android.widget.TextView; - -import java.util.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Set; -import java.util.Vector; - -import de.blinkt.openvpn.VpnProfile; -import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.utils.PreferenceHelper; - -/** - * Created by arne on 16.11.14. - */ -public class ExcludeAppsFragment extends Fragment implements AdapterView.OnItemClickListener, CompoundButton.OnCheckedChangeListener, View.OnClickListener { - private ListView mListView; - private VpnProfile mProfile; - private PackageAdapter mListAdapter; - - private Set apps; - - public interface ExcludedAppsCallback { - void onAppsExcluded(int number); - } - - private ExcludedAppsCallback callback; - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof ExcludedAppsCallback) { - callback = (ExcludedAppsCallback) context; - } - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - AppViewHolder avh = (AppViewHolder) view.getTag(); - avh.checkBox.toggle(); - } - - @Override - public void onClick(View v) { - - } - - static class AppViewHolder { - public ApplicationInfo mInfo; - public View rootView; - public TextView appName; - public ImageView appIcon; - //public TextView appSize; - //public TextView disabled; - public CompoundButton checkBox; - - static public AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = inflater.inflate(R.layout.allowed_application_layout, parent, false); - - // Creates a ViewHolder and store references to the two children views - // we want to bind data to. - AppViewHolder holder = new AppViewHolder(); - holder.rootView = convertView; - holder.appName = convertView.findViewById(R.id.app_name); - holder.appIcon = convertView.findViewById(R.id.app_icon); - holder.checkBox = convertView.findViewById(R.id.app_selected); - convertView.setTag(holder); - - return holder; - } else { - // Get the ViewHolder back to get fast access to the TextView - // and the ImageView. - return (AppViewHolder) convertView.getTag(); - } - } - - } - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - String packageName = (String) buttonView.getTag(); - - if (isChecked) { - Log.d("openvpn", "adding to allowed apps" + packageName); - apps.add(packageName); - - } else { - Log.d("openvpn", "removing from allowed apps" + packageName); - apps.remove(packageName); - } - - if (callback != null) { - callback.onAppsExcluded(apps.size()); - } - } - - class PackageAdapter extends BaseAdapter implements Filterable { - private Vector mPackages; - private final LayoutInflater mInflater; - private final PackageManager mPm; - private ItemFilter mFilter = new ItemFilter(); - private Vector mFilteredData; - - - private class ItemFilter extends Filter { - @Override - protected FilterResults performFiltering(CharSequence constraint) { - - String filterString = constraint.toString().toLowerCase(Locale.getDefault()); - - FilterResults results = new FilterResults(); - - - int count = mPackages.size(); - final Vector nlist = new Vector<>(count); - - for (int i = 0; i < count; i++) { - ApplicationInfo pInfo = mPackages.get(i); - CharSequence appName = pInfo.loadLabel(mPm); - - if (TextUtils.isEmpty(appName)) - appName = pInfo.packageName; - - if (appName instanceof String) { - if (((String) appName).toLowerCase(Locale.getDefault()).contains(filterString)) - nlist.add(pInfo); - } else { - if (appName.toString().toLowerCase(Locale.getDefault()).contains(filterString)) - nlist.add(pInfo); - } - } - results.values = nlist; - results.count = nlist.size(); - - return results; - } - - @Override - protected void publishResults(CharSequence constraint, FilterResults results) { - mFilteredData = (Vector) results.values; - notifyDataSetChanged(); - } - - } - - - PackageAdapter(Context c, VpnProfile vp) { - mPm = c.getPackageManager(); - mProfile = vp; - mInflater = LayoutInflater.from(c); - - mPackages = new Vector<>(); - mFilteredData = mPackages; - } - - private void populateList(Activity c) { - List installedPackages = mPm.getInstalledApplications(PackageManager.GET_META_DATA); - - // Remove apps not using Internet - - int androidSystemUid = 0; - ApplicationInfo system = null; - Vector apps = new Vector(); - - try { - system = mPm.getApplicationInfo("android", PackageManager.GET_META_DATA); - androidSystemUid = system.uid; - apps.add(system); - } catch (PackageManager.NameNotFoundException e) { - } - - - for (ApplicationInfo app : installedPackages) { - - if (mPm.checkPermission(Manifest.permission.INTERNET, app.packageName) == PackageManager.PERMISSION_GRANTED && - app.uid != androidSystemUid) { - - apps.add(app); - } - } - - Collections.sort(apps, new ApplicationInfo.DisplayNameComparator(mPm)); - mPackages = apps; - mFilteredData = apps; - c.runOnUiThread(new Runnable() { - @Override - public void run() { - notifyDataSetChanged(); - } - }); - } - - @Override - public int getCount() { - return mFilteredData.size(); - } - - @Override - public Object getItem(int position) { - return mFilteredData.get(position); - } - - @Override - public long getItemId(int position) { - return mFilteredData.get(position).packageName.hashCode(); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - AppViewHolder viewHolder = AppViewHolder.createOrRecycle(mInflater, convertView, parent); - - viewHolder.mInfo = mFilteredData.get(position); - final ApplicationInfo mInfo = mFilteredData.get(position); - - - CharSequence appName = mInfo.loadLabel(mPm); - - if (TextUtils.isEmpty(appName)) - appName = mInfo.packageName; - viewHolder.appName.setText(appName); - viewHolder.appIcon.setImageDrawable(mInfo.loadIcon(mPm)); - viewHolder.checkBox.setTag(mInfo.packageName); - viewHolder.checkBox.setOnCheckedChangeListener(ExcludeAppsFragment.this); - viewHolder.checkBox.setChecked(apps.contains(mInfo.packageName)); - - return viewHolder.rootView; - } - - @Override - public Filter getFilter() { - return mFilter; - } - } - - @Override - public void onResume() { - super.onResume(); - } - - @Override - public void onDestroy() { - PreferenceHelper.setExcludedApps(this.getActivity().getApplicationContext(), apps); - super.onDestroy(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - apps = PreferenceHelper.getExcludedApps(this.getContext()); - - setHasOptionsMenu(true); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.allowed_apps, menu); - - SearchView searchView = (SearchView) menu.findItem( R.id.app_search_widget ).getActionView(); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String query) { - mListView.setFilterText(query); - mListView.setTextFilterEnabled(true); - return true; - } - - @Override - public boolean onQueryTextChange(String newText) { - mListView.setFilterText(newText); - if (TextUtils.isEmpty(newText)) - mListView.setTextFilterEnabled(false); - else - mListView.setTextFilterEnabled(true); - - return true; - } - }); - searchView.setOnCloseListener(() -> { - mListView.clearTextFilter(); - mListAdapter.getFilter().filter(""); - return false; - }); - - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.allowed_vpn_apps, container, false); - - mListView = v.findViewById(android.R.id.list); - - mListAdapter = new PackageAdapter(getActivity(), mProfile); - mListView.setAdapter(mListAdapter); - mListView.setOnItemClickListener(this); - - mListView.setEmptyView(v.findViewById(R.id.loading_container)); - - new Thread(() -> mListAdapter.populateList(getActivity())).start(); - - return v; - } - -} diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java b/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java deleted file mode 100644 index 19787dc3..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java +++ /dev/null @@ -1,587 +0,0 @@ -/* - * Copyright (c) 2012-2016 Arne Schwabe - * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt - */ - -package se.leap.bitmaskclient.fragments; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.os.Bundle; -import android.os.Handler; -import android.os.Handler.Callback; -import android.os.Message; -import android.preference.PreferenceManager; -import androidx.annotation.Nullable; -import androidx.fragment.app.ListFragment; -import android.text.SpannableString; -import android.text.format.DateFormat; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.CheckBox; -import android.widget.LinearLayout; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.RadioGroup; -import android.widget.SeekBar; -import android.widget.TextView; -import android.widget.Toast; - -import java.text.SimpleDateFormat; -import java.util.Collections; -import java.util.Date; -import java.util.Locale; -import java.util.Vector; - -import de.blinkt.openvpn.VpnProfile; -import de.blinkt.openvpn.core.ConnectionStatus; -import de.blinkt.openvpn.core.LogItem; -import de.blinkt.openvpn.core.OpenVPNManagement; -import de.blinkt.openvpn.core.OpenVPNService; -import de.blinkt.openvpn.core.Preferences; -import de.blinkt.openvpn.core.VpnStatus; -import de.blinkt.openvpn.core.VpnStatus.LogListener; -import de.blinkt.openvpn.core.VpnStatus.StateListener; -import se.leap.bitmaskclient.Constants; -import se.leap.bitmaskclient.R; - -import static de.blinkt.openvpn.core.OpenVPNService.humanReadableByteCount; - -public class LogFragment extends ListFragment implements StateListener, SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener, VpnStatus.ByteCountListener { - public static final String TAG = LogFragment.class.getSimpleName(); - private static final String LOGTIMEFORMAT = "logtimeformat"; - private static final String VERBOSITYLEVEL = "verbositylevel"; - - - - private SeekBar mLogLevelSlider; - private LinearLayout mOptionsLayout; - private RadioGroup mTimeRadioGroup; - private TextView mUpStatus; - private TextView mDownStatus; - private TextView mConnectStatus; - private boolean mShowOptionsLayout; - private CheckBox mClearLogCheckBox; - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - ladapter.setLogLevel(progress + 1); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - switch (checkedId) { - case R.id.radioISO: - ladapter.setTimeFormat(LogWindowListAdapter.TIME_FORMAT_ISO); - break; - case R.id.radioNone: - ladapter.setTimeFormat(LogWindowListAdapter.TIME_FORMAT_NONE); - break; - case R.id.radioShort: - ladapter.setTimeFormat(LogWindowListAdapter.TIME_FORMAT_SHORT); - break; - - } - } - - @Override - public void updateByteCount(long in, long out, long diffIn, long diffOut) { - //%2$s/s %1$s - ↑%4$s/s %3$s - Resources res = getActivity().getResources(); - final String down = String.format("%2$s %1$s", humanReadableByteCount(in, false, res), humanReadableByteCount(diffIn / OpenVPNManagement.mBytecountInterval, true, res)); - final String up = String.format("%2$s %1$s", humanReadableByteCount(out, false, res), humanReadableByteCount(diffOut / OpenVPNManagement.mBytecountInterval, true, res)); - - if (mUpStatus != null && mDownStatus != null) { - if (getActivity() != null) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mUpStatus.setText(up); - mDownStatus.setText(down); - } - }); - } - } - - } - - - class LogWindowListAdapter implements ListAdapter, LogListener, Callback { - - private static final int MESSAGE_NEWLOG = 0; - - private static final int MESSAGE_CLEARLOG = 1; - - private static final int MESSAGE_NEWTS = 2; - private static final int MESSAGE_NEWLOGLEVEL = 3; - - public static final int TIME_FORMAT_NONE = 0; - public static final int TIME_FORMAT_SHORT = 1; - public static final int TIME_FORMAT_ISO = 2; - private static final int MAX_STORED_LOG_ENTRIES = 1000; - - private Vector allEntries = new Vector<>(); - - private Vector currentLevelEntries = new Vector(); - - private Handler mHandler; - - private Vector observers = new Vector(); - - private int mTimeFormat = 0; - private int mLogLevel = 3; - - - public LogWindowListAdapter() { - initLogBuffer(); - if (mHandler == null) { - mHandler = new Handler(this); - } - - VpnStatus.addLogListener(this); - } - - - private void initLogBuffer() { - allEntries.clear(); - Collections.addAll(allEntries, VpnStatus.getlogbuffer()); - initCurrentMessages(); - } - - String getLogStr() { - String str = ""; - for (LogItem entry : allEntries) { - str += getTime(entry, TIME_FORMAT_ISO) + entry.getString(getActivity()) + '\n'; - } - return str; - } - - - private void shareLog() { - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_TEXT, getLogStr()); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.ics_openvpn_log_file)); - shareIntent.setType("text/plain"); - startActivity(Intent.createChooser(shareIntent, "Send Logfile")); - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - observers.add(observer); - - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - observers.remove(observer); - } - - @Override - public int getCount() { - return currentLevelEntries.size(); - } - - @Override - public Object getItem(int position) { - return currentLevelEntries.get(position); - } - - @Override - public long getItemId(int position) { - return ((Object) currentLevelEntries.get(position)).hashCode(); - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - TextView v; - if (convertView == null) - v = new TextView(getActivity()); - else - v = (TextView) convertView; - - LogItem le = currentLevelEntries.get(position); - String msg = le.getString(getActivity()); - String time = getTime(le, mTimeFormat); - msg = time + msg; - - int spanStart = time.length(); - - SpannableString t = new SpannableString(msg); - - v.setText(t); - return v; - } - - private String getTime(LogItem le, int time) { - if (time != TIME_FORMAT_NONE) { - Date d = new Date(le.getLogtime()); - java.text.DateFormat timeformat; - if (time == TIME_FORMAT_ISO) - timeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); - else - timeformat = DateFormat.getTimeFormat(getActivity()); - - return timeformat.format(d) + " "; - - } else { - return ""; - } - - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return currentLevelEntries.isEmpty(); - - } - - @Override - public boolean areAllItemsEnabled() { - return true; - } - - @Override - public boolean isEnabled(int position) { - return true; - } - - @Override - public void newLog(LogItem logMessage) { - Message msg = Message.obtain(); - assert (msg != null); - msg.what = MESSAGE_NEWLOG; - Bundle bundle = new Bundle(); - bundle.putParcelable("logmessage", logMessage); - msg.setData(bundle); - mHandler.sendMessage(msg); - } - - @Override - public boolean handleMessage(Message msg) { - // We have been called - if (msg.what == MESSAGE_NEWLOG) { - - LogItem logMessage = msg.getData().getParcelable("logmessage"); - if (addLogMessage(logMessage)) - for (DataSetObserver observer : observers) { - observer.onChanged(); - } - } else if (msg.what == MESSAGE_CLEARLOG) { - for (DataSetObserver observer : observers) { - observer.onInvalidated(); - } - initLogBuffer(); - } else if (msg.what == MESSAGE_NEWTS) { - for (DataSetObserver observer : observers) { - observer.onInvalidated(); - } - } else if (msg.what == MESSAGE_NEWLOGLEVEL) { - initCurrentMessages(); - - for (DataSetObserver observer : observers) { - observer.onChanged(); - } - - } - - return true; - } - - private void initCurrentMessages() { - currentLevelEntries.clear(); - for (LogItem li : allEntries) { - if (li.getVerbosityLevel() <= mLogLevel || - mLogLevel == VpnProfile.MAXLOGLEVEL) - currentLevelEntries.add(li); - } - } - - /** - * @param logmessage - * @return True if the current entries have changed - */ - private boolean addLogMessage(LogItem logmessage) { - allEntries.add(logmessage); - - if (allEntries.size() > MAX_STORED_LOG_ENTRIES) { - Vector oldAllEntries = allEntries; - allEntries = new Vector(allEntries.size()); - for (int i = 50; i < oldAllEntries.size(); i++) { - allEntries.add(oldAllEntries.elementAt(i)); - } - initCurrentMessages(); - return true; - } else { - if (logmessage.getVerbosityLevel() <= mLogLevel) { - currentLevelEntries.add(logmessage); - return true; - } else { - return false; - } - } - } - - void clearLog() { - // Actually is probably called from GUI Thread as result of the user - // pressing a button. But better safe than sorry - VpnStatus.clearLog(); - VpnStatus.logInfo(R.string.logCleared); - mHandler.sendEmptyMessage(MESSAGE_CLEARLOG); - } - - - public void setTimeFormat(int newTimeFormat) { - mTimeFormat = newTimeFormat; - mHandler.sendEmptyMessage(MESSAGE_NEWTS); - } - - public void setLogLevel(int logLevel) { - mLogLevel = logLevel; - mHandler.sendEmptyMessage(MESSAGE_NEWLOGLEVEL); - } - - } - - - private LogWindowListAdapter ladapter; - private TextView mSpeedView; - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.clearlog) { - ladapter.clearLog(); - return true; - } else if (item.getItemId() == R.id.send) { - ladapter.shareLog(); - } else if (item.getItemId() == R.id.toggle_time) { - showHideOptionsPanel(); - } - return super.onOptionsItemSelected(item); - - } - - private void showHideOptionsPanel() { - boolean optionsVisible = (mOptionsLayout.getVisibility() != View.GONE); - - ObjectAnimator anim; - if (optionsVisible) { - anim = ObjectAnimator.ofFloat(mOptionsLayout, "alpha", 1.0f, 0f); - anim.addListener(collapseListener); - - } else { - mOptionsLayout.setVisibility(View.VISIBLE); - anim = ObjectAnimator.ofFloat(mOptionsLayout, "alpha", 0f, 1.0f); - //anim = new TranslateAnimation(0.0f, 0.0f, mOptionsLayout.getHeight(), 0.0f); - - } - - //anim.setInterpolator(new AccelerateInterpolator(1.0f)); - //anim.setDuration(300); - //mOptionsLayout.startAnimation(anim); - anim.start(); - - } - - AnimatorListenerAdapter collapseListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animator) { - mOptionsLayout.setVisibility(View.GONE); - } - - }; - - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.f_log, menu); - if (getResources().getBoolean(R.bool.logSildersAlwaysVisible)) - menu.removeItem(R.id.toggle_time); - } - - - @Override - public void onResume() { - super.onResume(); - Intent intent = new Intent(getActivity(), OpenVPNService.class); - intent.setAction(OpenVPNService.START_SERVICE); - } - - @Override - public void onStart() { - super.onStart(); - VpnStatus.addStateListener(this); - VpnStatus.addByteCountListener(this); - } - - @Override - public void onStop() { - super.onStop(); - VpnStatus.removeStateListener(this); - VpnStatus.removeByteCountListener(this); - - getActivity().getPreferences(0).edit().putInt(LOGTIMEFORMAT, ladapter.mTimeFormat) - .putInt(VERBOSITYLEVEL, ladapter.mLogLevel).apply(); - - } - - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - ListView lv = getListView(); - - lv.setOnItemLongClickListener(new OnItemLongClickListener() { - - @Override - public boolean onItemLongClick(AdapterView parent, View view, - int position, long id) { - ClipboardManager clipboard = (ClipboardManager) - getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("Log Entry", ((TextView) view).getText()); - clipboard.setPrimaryClip(clip); - Toast.makeText(getActivity(), R.string.copied_entry, Toast.LENGTH_SHORT).show(); - return true; - } - }); - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.f_log, container, false); - - setHasOptionsMenu(true); - - ladapter = new LogWindowListAdapter(); - ladapter.mTimeFormat = getActivity().getPreferences(0).getInt(LOGTIMEFORMAT, 1); - int logLevel = getActivity().getPreferences(0).getInt(VERBOSITYLEVEL, 1); - ladapter.setLogLevel(logLevel); - - setListAdapter(ladapter); - - mTimeRadioGroup = v.findViewById(R.id.timeFormatRadioGroup); - mTimeRadioGroup.setOnCheckedChangeListener(this); - - if (ladapter.mTimeFormat == LogWindowListAdapter.TIME_FORMAT_ISO) { - mTimeRadioGroup.check(R.id.radioISO); - } else if (ladapter.mTimeFormat == LogWindowListAdapter.TIME_FORMAT_NONE) { - mTimeRadioGroup.check(R.id.radioNone); - } else if (ladapter.mTimeFormat == LogWindowListAdapter.TIME_FORMAT_SHORT) { - mTimeRadioGroup.check(R.id.radioShort); - } - - mClearLogCheckBox = v.findViewById(R.id.clearlogconnect); - mClearLogCheckBox.setChecked(PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean(Constants.CLEARLOG, true)); - mClearLogCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> - Preferences.getDefaultSharedPreferences(getActivity()).edit().putBoolean(Constants.CLEARLOG, isChecked).apply()); - - mSpeedView = v.findViewById(R.id.speed); - - mOptionsLayout = v.findViewById(R.id.logOptionsLayout); - mLogLevelSlider = v.findViewById(R.id.LogLevelSlider); - mLogLevelSlider.setMax(VpnProfile.MAXLOGLEVEL - 1); - mLogLevelSlider.setProgress(logLevel - 1); - - mLogLevelSlider.setOnSeekBarChangeListener(this); - - if (getResources().getBoolean(R.bool.logSildersAlwaysVisible)) - mOptionsLayout.setVisibility(View.VISIBLE); - - mUpStatus = v.findViewById(R.id.speedUp); - mDownStatus = v.findViewById(R.id.speedDown); - mConnectStatus = v.findViewById(R.id.speedStatus); - if (mShowOptionsLayout) - mOptionsLayout.setVisibility(View.VISIBLE); - return v; - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - // Scroll to the end of the list end - //getListView().setSelection(getListView().getAdapter().getCount()-1); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (getResources().getBoolean(R.bool.logSildersAlwaysVisible)) { - mShowOptionsLayout = true; - if (mOptionsLayout != null) - mOptionsLayout.setVisibility(View.VISIBLE); - } - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - } - - - @Override - public void updateState(final String status, final String logMessage, final int resId, final ConnectionStatus level) { - if (isAdded()) { - final String cleanLogMessage = VpnStatus.getLastCleanLogMessage(getActivity()); - - getActivity().runOnUiThread(() -> { - if (isAdded()) { - if (mSpeedView != null) { - mSpeedView.setText(cleanLogMessage); - } - if (mConnectStatus != null) - mConnectStatus.setText(cleanLogMessage); - } - }); - } - } - - @Override - public void setConnectedVPN(String uuid) { - } - - - @Override - public void onDestroy() { - VpnStatus.removeLogListener(ladapter); - super.onDestroy(); - } - -} diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java deleted file mode 100644 index 24e3c814..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java +++ /dev/null @@ -1,258 +0,0 @@ -package se.leap.bitmaskclient.fragments; - -import android.app.Dialog; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.provider.Settings; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatDialogFragment; -import androidx.appcompat.widget.AppCompatTextView; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import java.util.Observable; -import java.util.Observer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import de.blinkt.openvpn.core.VpnStatus; -import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.firewall.FirewallManager; -import se.leap.bitmaskclient.tethering.TetheringObservable; -import se.leap.bitmaskclient.utils.PreferenceHelper; -import se.leap.bitmaskclient.views.IconCheckboxEntry; - -/** - * Copyright (c) 2020 LEAP Encryption Access Project and contributers - *

- * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -public class TetheringDialog extends AppCompatDialogFragment implements Observer { - - public final static String TAG = TetheringDialog.class.getName(); - - @InjectView(R.id.tvTitle) - AppCompatTextView title; - - @InjectView(R.id.user_message) - AppCompatTextView userMessage; - - @InjectView(R.id.selection_list_view) - RecyclerView selectionListView; - DialogListAdapter adapter; - private DialogListAdapter.ViewModel[] dataset; - - public static class DialogListAdapter extends RecyclerView.Adapter { - - interface OnItemClickListener { - void onItemClick(ViewModel item); - } - - private ViewModel[] dataSet; - private OnItemClickListener clickListener; - - DialogListAdapter(ViewModel[] dataSet, OnItemClickListener clickListener) { - this.dataSet = dataSet; - this.clickListener = clickListener; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { - IconCheckboxEntry v = new IconCheckboxEntry(viewGroup.getContext()); - return new ViewHolder(v); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { - viewHolder.bind(dataSet[i], clickListener); - } - - @Override - public int getItemCount() { - return dataSet.length; - } - - public static class ViewModel { - - public Drawable image; - public String text; - public boolean checked; - public boolean enabled; - - ViewModel(Drawable image, String text, boolean checked, boolean enabled) { - this.image = image; - this.text = text; - this.checked = checked; - this.enabled = enabled; - } - } - - public static class ViewHolder extends RecyclerView.ViewHolder { - - ViewHolder(IconCheckboxEntry v) { - super(v); - } - - public void bind(ViewModel model, OnItemClickListener onClickListener) { - ((IconCheckboxEntry) this.itemView).bind(model); - this.itemView.setOnClickListener(v -> { - model.checked = !model.checked; - ((IconCheckboxEntry) itemView).setChecked(model.checked); - onClickListener.onItemClick(model); - }); - } - } - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.d_list_selection, null); - ButterKnife.inject(this, view); - - title.setText(R.string.tethering); - userMessage.setMovementMethod(LinkMovementMethod.getInstance()); - userMessage.setLinkTextColor(getContext().getResources().getColor(R.color.colorPrimary)); - userMessage.setText(createUserMessage()); - - initDataset(); - adapter = new DialogListAdapter(dataset, this::onItemClick); - selectionListView.setAdapter(adapter); - selectionListView.setLayoutManager(new LinearLayoutManager(getActivity())); - - - builder.setView(view) - .setPositiveButton(android.R.string.ok, (dialog, id) -> { - PreferenceHelper.allowWifiTethering(getContext(), dataset[0].checked); - PreferenceHelper.allowUsbTethering(getContext(), dataset[1].checked); - PreferenceHelper.allowBluetoothTethering(getContext(), dataset[2].checked); - TetheringObservable.allowVpnWifiTethering(dataset[0].checked); - TetheringObservable.allowVpnUsbTethering(dataset[1].checked); - TetheringObservable.allowVpnBluetoothTethering(dataset[2].checked); - FirewallManager firewallManager = new FirewallManager(getContext().getApplicationContext(), false); - if (VpnStatus.isVPNActive()) { - if (TetheringObservable.getInstance().getTetheringState().hasAnyDeviceTetheringEnabled() && - TetheringObservable.getInstance().getTetheringState().hasAnyVpnTetheringAllowed()) { - firewallManager.startTethering(); - } else { - firewallManager.stopTethering(); - } - } - }).setNegativeButton(R.string.cancel, (dialog, id) -> dialog.cancel()); - return builder.create(); - } - - @Override - public void onResume() { - super.onResume(); - dataset[0].enabled = TetheringObservable.getInstance().isWifiTetheringEnabled(); - dataset[1].enabled = TetheringObservable.getInstance().isUsbTetheringEnabled(); - dataset[2].enabled = TetheringObservable.getInstance().isBluetoothTetheringEnabled(); - adapter.notifyDataSetChanged(); - TetheringObservable.getInstance().addObserver(this); - } - - @Override - public void onPause() { - super.onPause(); - TetheringObservable.getInstance().deleteObserver(this); - } - - public void onItemClick(DialogListAdapter.ViewModel item) { - - } - - private CharSequence createUserMessage() { - String tetheringMessage = getString(R.string.tethering_message); - String systemSettingsMessage = getString(R.string.tethering_enabled_message); - Pattern pattern = Pattern.compile("([\\w .]*)()+([\\w ]*)()([\\w .]*)"); - Matcher matcher = pattern.matcher(systemSettingsMessage); - int startIndex = 0; - int endIndex = 0; - if (matcher.matches()) { - startIndex = matcher.start(2); - endIndex = startIndex + matcher.group(3).length(); - } - systemSettingsMessage = systemSettingsMessage.replace("", "").replace("", ""); - String wholeMessage = systemSettingsMessage + "\n\n" + tetheringMessage; - Spannable spannable = new SpannableString(wholeMessage); - spannable.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull View widget) { - try { - final Intent intent = new Intent(Intent.ACTION_MAIN, null); - intent.addCategory(Intent.CATEGORY_LAUNCHER); - final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.TetherSettings"); - intent.setComponent(cn); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } catch (ActivityNotFoundException e) { - Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); - startActivity(intent); - } - - } - }, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - - return spannable; - } - - private void initDataset() { - dataset = new DialogListAdapter.ViewModel[] { - new DialogListAdapter.ViewModel(getContext().getResources().getDrawable(R.drawable.ic_wifi), - getContext().getString(R.string.tethering_wifi), - PreferenceHelper.isWifiTetheringAllowed(getContext()), - TetheringObservable.getInstance().isWifiTetheringEnabled()), - new DialogListAdapter.ViewModel(getContext().getResources().getDrawable(R.drawable.ic_usb), - getContext().getString(R.string.tethering_usb), - PreferenceHelper.isUsbTetheringAllowed(getContext()), - TetheringObservable.getInstance().isUsbTetheringEnabled()), - new DialogListAdapter.ViewModel(getContext().getResources().getDrawable(R.drawable.ic_bluetooth), - getContext().getString(R.string.tethering_bluetooth), - PreferenceHelper.isBluetoothTetheringAllowed(getContext()), - TetheringObservable.getInstance().isUsbTetheringEnabled()) - }; - } - - @Override - public void update(Observable o, Object arg) { - if (o instanceof TetheringObservable) { - TetheringObservable observable = (TetheringObservable) o; - Log.d(TAG, "TetheringObservable is updated"); - dataset[0].enabled = observable.isWifiTetheringEnabled(); - dataset[1].enabled = observable.isUsbTetheringEnabled(); - dataset[2].enabled = observable.isBluetoothTetheringEnabled(); - adapter.notifyDataSetChanged(); - } - } - -} -- cgit v1.2.3