summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/fragments
diff options
context:
space:
mode:
authorcyBerta <cyberta@riseup.net>2020-12-29 00:54:08 +0100
committercyBerta <cyberta@riseup.net>2020-12-29 00:54:08 +0100
commit6b032b751324a30120cfaabe88940f95171df11f (patch)
treeb6b26b84358726a02e27558562e7e9ea70a7aaa0 /app/src/main/java/se/leap/bitmaskclient/fragments
parent16da1eeb5180cbb4a0d916785a08ccbcd3c1d74e (diff)
new year cleanup: restructure messy project
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/fragments')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java67
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java76
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java120
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/fragments/ExcludeAppsFragment.java335
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java587
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/fragments/TetheringDialog.java258
6 files changed, 0 insertions, 1443 deletions
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<String> 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<ApplicationInfo> mPackages;
- private final LayoutInflater mInflater;
- private final PackageManager mPm;
- private ItemFilter mFilter = new ItemFilter();
- private Vector<ApplicationInfo> 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<ApplicationInfo> 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<ApplicationInfo>) 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<ApplicationInfo> installedPackages = mPm.getInstalledApplications(PackageManager.GET_META_DATA);
-
- // Remove apps not using Internet
-
- int androidSystemUid = 0;
- ApplicationInfo system = null;
- Vector<ApplicationInfo> apps = new Vector<ApplicationInfo>();
-
- 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<LogItem> allEntries = new Vector<>();
-
- private Vector<LogItem> currentLevelEntries = new Vector<LogItem>();
-
- private Handler mHandler;
-
- private Vector<DataSetObserver> observers = new Vector<DataSetObserver>();
-
- 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<LogItem> oldAllEntries = allEntries;
- allEntries = new Vector<LogItem>(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
- * <p>
- * 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.
- * <p>
- * 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.
- * <p>
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-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<DialogListAdapter.ViewHolder> {
-
- 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 .]*)(<b>)+([\\w ]*)(</b>)([\\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("<b>", "").replace("</b>", "");
- 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();
- }
- }
-
-}