From 96e5db80d9a949435df32d2d0c46497b86d1fff4 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Wed, 14 Feb 2018 16:00:13 +0100 Subject: #8846 remove legacy code and files: Dashboard, LogWindow, UserStatusFragment, FabButton library etc. --- .../legacy/BaseTestDashboardFragment.java | 1 - app/src/androidTest/legacy/VpnTestController.java | 2 - app/src/main/AndroidManifest.xml | 5 - app/src/main/java/de/blinkt/openvpn/LaunchVPN.java | 6 +- .../de/blinkt/openvpn/activities/LogWindow.java | 37 -- .../de/blinkt/openvpn/fragments/LogFragment.java | 694 --------------------- .../main/java/se/leap/bitmaskclient/Dashboard.java | 402 ------------ .../se/leap/bitmaskclient/LogWindowWrapper.java | 28 - .../java/se/leap/bitmaskclient/MainActivity.java | 5 + .../leap/bitmaskclient/fragments/LogFragment.java | 22 - .../leap/bitmaskclient/userstatus/FabButton.java | 28 - .../userstatus/UserStatusFragment.java | 158 ----- app/src/main/res/layout-sw600dp-port/f_log.xml | 2 +- .../main/res/layout-sw600dp-port/log_fragment.xml | 45 -- app/src/main/res/layout-sw600dp/f_log.xml | 2 +- app/src/main/res/layout-sw600dp/log_fragment.xml | 37 -- app/src/main/res/layout-xlarge/about.xml | 2 +- app/src/main/res/layout-xlarge/dashboard.xml | 38 -- .../res/layout-xlarge/user_session_fragment.xml | 54 -- app/src/main/res/layout/about.xml | 2 +- app/src/main/res/layout/dashboard.xml | 34 - app/src/main/res/layout/log_fragment.xml | 37 -- app/src/main/res/layout/log_silders.xml | 73 --- app/src/main/res/layout/log_window.xml | 12 - app/src/main/res/layout/user_session_fragment.xml | 45 -- app/src/main/res/menu/client_dashboard.xml | 19 - app/src/main/res/menu/logmenu.xml | 44 -- 27 files changed, 12 insertions(+), 1822 deletions(-) delete mode 100644 app/src/main/java/de/blinkt/openvpn/activities/LogWindow.java delete mode 100644 app/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/Dashboard.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/userstatus/FabButton.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java delete mode 100644 app/src/main/res/layout-sw600dp-port/log_fragment.xml delete mode 100644 app/src/main/res/layout-sw600dp/log_fragment.xml delete mode 100644 app/src/main/res/layout-xlarge/dashboard.xml delete mode 100644 app/src/main/res/layout-xlarge/user_session_fragment.xml delete mode 100644 app/src/main/res/layout/dashboard.xml delete mode 100644 app/src/main/res/layout/log_fragment.xml delete mode 100644 app/src/main/res/layout/log_silders.xml delete mode 100644 app/src/main/res/layout/log_window.xml delete mode 100644 app/src/main/res/layout/user_session_fragment.xml delete mode 100644 app/src/main/res/menu/client_dashboard.xml delete mode 100644 app/src/main/res/menu/logmenu.xml (limited to 'app/src') diff --git a/app/src/androidTest/legacy/BaseTestDashboardFragment.java b/app/src/androidTest/legacy/BaseTestDashboardFragment.java index e187d424..4730cecc 100644 --- a/app/src/androidTest/legacy/BaseTestDashboardFragment.java +++ b/app/src/androidTest/legacy/BaseTestDashboardFragment.java @@ -8,7 +8,6 @@ import android.view.View; import com.robotium.solo.Solo; import se.leap.bitmaskclient.ProviderListActivity; -import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.R; public abstract class BaseTestDashboardFragment extends ActivityInstrumentationTestCase2 { diff --git a/app/src/androidTest/legacy/VpnTestController.java b/app/src/androidTest/legacy/VpnTestController.java index 4c6a6370..e39ebae3 100644 --- a/app/src/androidTest/legacy/VpnTestController.java +++ b/app/src/androidTest/legacy/VpnTestController.java @@ -8,9 +8,7 @@ import com.robotium.solo.Solo; import de.blinkt.openvpn.activities.DisconnectVPN; import mbanje.kurt.fabbutton.ProgressRingView; -import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.userstatus.FabButton; import static junit.framework.Assert.assertTrue; diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f60a2db6..4e7f8348 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,11 +69,6 @@ - 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); - - //t.setSpan(getSpanImage(le,(int)v.getTextSize()),spanStart,spanStart+1, Spanned.SPAN_INCLUSIVE_INCLUSIVE); - 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 ""; - } - - } - - private ImageSpan getSpanImage(LogItem li, int imageSize) { - int imageRes = android.R.drawable.ic_menu_call; - - switch (li.getLogLevel()) { - case ERROR: - imageRes = android.R.drawable.ic_notification_clear_all; - break; - case INFO: - imageRes = android.R.drawable.ic_menu_compass; - break; - case VERBOSE: - imageRes = android.R.drawable.ic_menu_info_details; - break; - case WARNING: - imageRes = android.R.drawable.ic_menu_camera; - break; - } - - Drawable d = getResources().getDrawable(imageRes); - - - //d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); - d.setBounds(0, 0, imageSize, imageSize); - ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM); - - return span; - } - - @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.cancel) { - Intent intent = new Intent(getActivity(), DisconnectVPN.class); - startActivity(intent); - return true; - } else if (item.getItemId() == R.id.send) { - ladapter.shareLog(); - } else if (item.getItemId() == R.id.edit_vpn) { - VpnProfile lastConnectedprofile = ProfileManager.get(getActivity(), VpnStatus.getLastConnectedVPNProfile()); - - if (lastConnectedprofile != null) { - Intent vprefintent = new Intent(getActivity(), Dashboard.class) - .putExtra(VpnProfile.EXTRA_PROFILEUUID, lastConnectedprofile.getUUIDString()); - startActivityForResult(vprefintent, START_VPN_CONFIG); - } else { - Toast.makeText(getActivity(), R.string.log_no_last_vpn, Toast.LENGTH_LONG).show(); - } - } else if (item.getItemId() == R.id.toggle_time) { - showHideOptionsPanel(); - } else if (item.getItemId() == android.R.id.home) { - // This is called when the Home (Up) button is pressed - // in the Action Bar. - Intent parentActivityIntent = new Intent(getActivity(), Dashboard.class); - parentActivityIntent.addFlags( - Intent.FLAG_ACTIVITY_CLEAR_TOP | - Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(parentActivityIntent); - getActivity().finish(); - return true; - - } - 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.logmenu, 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 onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == START_VPN_CONFIG && resultCode == Activity.RESULT_OK) { - String configuredVPN = data.getStringExtra(VpnProfile.EXTRA_PROFILEUUID); - - final VpnProfile profile = ProfileManager.get(getActivity(), configuredVPN); - ProfileManager.getInstance(getActivity()).saveProfile(getActivity(), profile); - // Name could be modified, reset List adapter - - AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); - dialog.setTitle(R.string.configuration_changed); - dialog.setMessage(R.string.restart_vpn_after_change); - - - dialog.setPositiveButton(R.string.restart, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(getActivity(), LaunchVPN.class); - intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString()); - intent.setAction(Intent.ACTION_MAIN); - startActivity(intent); - } - - - }); - dialog.setNegativeButton(R.string.ignore, null); - dialog.create().show(); - } - super.onActivityResult(requestCode, resultCode, data); - } - - - @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.log_fragment, 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 = (RadioGroup) 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 = (CheckBox) v.findViewById(R.id.clearlogconnect); - mClearLogCheckBox.setChecked(PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean(LaunchVPN.CLEARLOG, true)); - mClearLogCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - Preferences.getDefaultSharedPreferences(getActivity()).edit().putBoolean(LaunchVPN.CLEARLOG, isChecked).apply(); - } - }); - - mSpeedView = (TextView) v.findViewById(R.id.speed); - - mOptionsLayout = (LinearLayout) v.findViewById(R.id.logOptionsLayout); - mLogLevelSlider = (SeekBar) 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 = (TextView) v.findViewById(R.id.speedUp); - mDownStatus = (TextView) v.findViewById(R.id.speedDown); - mConnectStatus = (TextView) 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 activity) { - super.onAttach(activity); - if (getResources().getBoolean(R.bool.logSildersAlwaysVisible)) { - mShowOptionsLayout = true; - if (mOptionsLayout != null) - mOptionsLayout.setVisibility(View.VISIBLE); - } - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - //getActionBar().setDisplayHomeAsUpEnabled(true); - - } - - - @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(new Runnable() { - - @Override - public void run() { - 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/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java deleted file mode 100644 index 48dce1c2..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ /dev/null @@ -1,402 +0,0 @@ -/* - * Copyright (c) 2013 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 . - */ -package se.leap.bitmaskclient; - -import android.annotation.SuppressLint; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Bundle; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.TextView; - -import org.jetbrains.annotations.NotNull; -import org.json.JSONException; -import org.json.JSONObject; - -import java.net.MalformedURLException; -import java.net.URL; - -import butterknife.InjectView; -import de.blinkt.openvpn.core.VpnStatus; -import se.leap.bitmaskclient.eip.EipCommand; -import se.leap.bitmaskclient.fragments.AboutFragment; -import se.leap.bitmaskclient.userstatus.User; -import se.leap.bitmaskclient.userstatus.UserStatusFragment; - -import static se.leap.bitmaskclient.Constants.APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE; -import static se.leap.bitmaskclient.Constants.APP_ACTION_QUIT; -import static se.leap.bitmaskclient.Constants.EIP_IS_ALWAYS_ON; -import static se.leap.bitmaskclient.Constants.EIP_RESTART_ON_BOOT; -import static se.leap.bitmaskclient.Constants.PROVIDER_CONFIGURED; -import static se.leap.bitmaskclient.Constants.PROVIDER_EIP_DEFINITION; -import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; -import static se.leap.bitmaskclient.Constants.REQUEST_CODE_KEY; -import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER; -import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; - -/** - * The main user facing Activity of Bitmask Android, consisting of status, controls, - * and access to preferences. - * - * @author Sean Leonard - * @author parmegv - */ -public class Dashboard extends ButterKnifeActivity { - - public static final String TAG = Dashboard.class.getSimpleName(); - - /** - * When "Disconnect" is clicked from the notification this extra gets added to the calling intent. - */ - public static final String ACTION_ASK_TO_CANCEL_VPN = "ask to cancel vpn"; - /** - * if always-on feature is enabled, but there's no provider configured the EIP Service - * adds this intent extra. Constants.APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE - * serves to start the Configuration Wizard on top of the Dashboard Activity. - */ - - protected static SharedPreferences preferences; - private static FragmentManagerEnhanced fragment_manager; - - @InjectView(R.id.providerName) - TextView provider_name; - - private EipFragment eip_fragment; - private UserStatusFragment user_status_fragment; - - private static Provider provider = new Provider(); - private boolean handledVersion; - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); - fragment_manager = new FragmentManagerEnhanced(getSupportFragmentManager()); - - - if (!handledVersion) { - handleVersion(); - handledVersion = true; - } - - // initialize app necessities - VpnStatus.initLogCache(getApplicationContext().getCacheDir()); - User.init(getString(R.string.default_username)); - - prepareEIP(savedInstanceState); - } - - @Override - protected void onResume() { - super.onResume(); - handleVpnCancellation(getIntent()); - } - - private boolean previousProviderExists(Bundle savedInstanceState) { - return providerInSavedInstance(savedInstanceState) || providerInSharedPreferences(); - } - - private Provider getProvider(Bundle savedInstanceState) { - if(providerInSavedInstance(savedInstanceState)) - provider = savedInstanceState.getParcelable(Provider.KEY); - else if (providerInSharedPreferences()) - provider = getSavedProviderFromSharedPreferences(); - return provider; - } - - private boolean providerInSavedInstance(Bundle savedInstanceState) { - return savedInstanceState != null && - savedInstanceState.containsKey(Provider.KEY); - } - - private boolean providerInSharedPreferences() { - return preferences != null && - preferences.getBoolean(PROVIDER_CONFIGURED, false); - - } - - @Override - protected void onSaveInstanceState(@NotNull Bundle outState) { - outState.putParcelable(Provider.KEY, provider); - super.onSaveInstanceState(outState); - } - - private Provider getSavedProviderFromSharedPreferences() { - Provider provider = new Provider(); - try { - provider.setMainUrl(new URL(preferences.getString(Provider.MAIN_URL, ""))); - provider.define(new JSONObject(preferences.getString(Provider.KEY, ""))); - provider.setCaCert(preferences.getString(Provider.CA_CERT, "")); - } catch (MalformedURLException | JSONException e) { - e.printStackTrace(); - } - - return provider; - } - - private void handleVersion() { - try { - int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; - - switch (versionCode) { - case 91: // 0.6.0 without Bug #5999 - case 101: // 0.8.0 - if (!preferences.getString(PROVIDER_EIP_DEFINITION, "").isEmpty()) - EipCommand.updateEipService(this); - break; - } - } catch (NameNotFoundException e) { - Log.d(TAG, "Handle version didn't find any " + getPackageName() + " package"); - } - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - setIntent(intent); - handleIntentExtras(intent); - } - - private void handleIntentExtras(Intent intent) { - if (intent.hasExtra(ACTION_ASK_TO_CANCEL_VPN)) { - handleVpnCancellation(intent); - } else if (intent.hasExtra(EIP_RESTART_ON_BOOT)) { - Log.d(TAG, "Dashboard: EIP_RESTART_ON_BOOT"); - prepareEIP(null); - } else if (intent.hasExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE)) { - Log.d(TAG, "Dashboard: Constants.APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE"); - handleConfigureAlwaysOn(getIntent()); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_CODE_CONFIGURE_LEAP || requestCode == REQUEST_CODE_SWITCH_PROVIDER) { - if (resultCode == RESULT_OK && data.hasExtra(Provider.KEY)) { - provider = data.getParcelableExtra(Provider.KEY); - providerToPreferences(provider); - - buildDashboard(false); - invalidateOptionsMenuOnUiThread(); - //if (data.hasExtra(SessionDialog.TAG)) { - // sessionDialog(Bundle.EMPTY); - //} - - } else if (resultCode == RESULT_CANCELED && data != null && data.hasExtra(APP_ACTION_QUIT)) { - finish(); - } else - configErrorDialog(); - } - } - - private void handleVpnCancellation(Intent intent) { - if (intent.hasExtra(Dashboard.ACTION_ASK_TO_CANCEL_VPN)) { - eip_fragment.askToStopEIP(); - intent.removeExtra(ACTION_ASK_TO_CANCEL_VPN); - } - } - - private void handleConfigureAlwaysOn(Intent intent) { - intent.removeExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE); - Log.d(TAG, "start Configuration wizard!"); - startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); - } - - private void prepareEIP(Bundle savedInstanceState) { - boolean provider_exists = previousProviderExists(savedInstanceState); - if (provider_exists) { - provider = getProvider(savedInstanceState); - if(!provider.isConfigured()) { - configureLeapProvider(); - } else { - Log.d(TAG, "vpn provider is configured"); - buildDashboard(getIntent().getBooleanExtra(EIP_RESTART_ON_BOOT, false)); - user_status_fragment.restoreSessionStatus(savedInstanceState); - } - } else { - configureLeapProvider(); - } - } - - private void configureLeapProvider() { - if (getIntent().hasExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE)) { - getIntent().removeExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE); - } - startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); - } - @SuppressLint("CommitPrefEdits") - private void providerToPreferences(Provider provider) { - preferences.edit().putBoolean(PROVIDER_CONFIGURED, true). - putString(Provider.MAIN_URL, provider.getMainUrl().toString()). - putString(Provider.KEY, provider.getDefinition().toString()).apply(); - } - - private void configErrorDialog() { - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this); - alertBuilder.setTitle(getResources().getString(R.string.setup_error_title)); - alertBuilder - .setMessage(getResources().getString(R.string.setup_error_text)) - .setCancelable(false) - .setPositiveButton(getResources().getString(R.string.setup_error_configure_button), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - startActivityForResult(new Intent(Dashboard.this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); - } - }) - .setNegativeButton(getResources().getString(R.string.setup_error_close_button), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - preferences.edit().remove(Provider.KEY).remove(PROVIDER_CONFIGURED).apply(); - finish(); - } - }) - .show(); - } - - /** - * Inflates permanent UI elements of the View and contains logic for what - * service dependent UI elements to include. - */ - //TODO: REFACTOR ME! Consider implementing a manager that handles most of EipFragment's logic about handling EIP commands. - //This way, we could avoid to create UI elements (like fragmentManager.replace(R.id.servicesCollection, eip_fragment, EipFragment.TAG); ) - // just to start services and destroy them afterwards - private void buildDashboard(boolean hideAndTurnOnEipOnBoot) { - setContentView(R.layout.dashboard); - - provider_name.setText(provider.getDomain()); - - user_status_fragment = new UserStatusFragment(); - Bundle bundle = new Bundle(); - bundle.putBoolean(Provider.ALLOW_REGISTRATION, provider.allowsRegistration()); - user_status_fragment.setArguments(bundle); - fragment_manager.replace(R.id.user_status_fragment, user_status_fragment, UserStatusFragment.TAG); - -// if (provider.hasEIP()) { -// fragment_manager.removePreviousFragment(EipFragment.TAG); -// eip_fragment = prepareEipFragment(hideAndTurnOnEipOnBoot); -// fragment_manager.replace(R.id.servicesCollection, eip_fragment, EipFragment.TAG); -// if (hideAndTurnOnEipOnBoot) { -// onBackPressed(); -// } -// } - } - - /** - * - * @param hideAndTurnOnEipOnBoot Flag that indicates if system intent android.intent.action.BOOT_COMPLETED - * has caused to start Dashboard - * @return the created VPNFragment - */ - public EipFragment prepareEipFragment(boolean hideAndTurnOnEipOnBoot) { - EipFragment eip_fragment = new EipFragment(); - - if (hideAndTurnOnEipOnBoot && !isAlwaysOn()) { - preferences.edit().remove(EIP_RESTART_ON_BOOT).apply(); - Bundle arguments = new Bundle(); - arguments.putBoolean(EipFragment.START_EIP_ON_BOOT, true); - Log.d(TAG, "set START_EIP_ON_BOOT argument for eip_fragment"); - eip_fragment.setArguments(arguments); - - } - return eip_fragment; - } - - /** - * checks if Android's VPN feature 'always-on' is enabled for Bitmask - * @return true if 'always-on' is enabled false if not - */ - private boolean isAlwaysOn() { - return preferences.getBoolean(EIP_IS_ALWAYS_ON, false); - } - - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - if (provider.allowsRegistration()) { - menu.findItem(R.id.signup_button).setVisible(true); - } - return true; - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.client_dashboard, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.about_leap: - showAbout(); - return true; - case R.id.log_window: - showLog(); - return true; - case R.id.switch_provider: - if (User.loggedIn()) user_status_fragment.logOut(); - else switchProvider(); - return true; - case R.id.signup_button: - //sessionDialog(Bundle.EMPTY); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - public void showAbout() { - Intent intent = new Intent(this, AboutFragment.class); - startActivity(intent); - } - - public void showLog() { - LogWindowWrapper log_window_wrapper = LogWindowWrapper.getInstance(this); - log_window_wrapper.showLog(); - } - - private void switchProvider() { -// if (provider.hasEIP()) eip_fragment.stopEipIfPossible(); - - ConfigHelper.clearDataOfLastProvider(preferences); - - startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER); - } - - public static Provider getProvider() { return provider; } - - @Override - public void startActivityForResult(Intent intent, int requestCode) { - intent.putExtra(REQUEST_CODE_KEY, requestCode); - super.startActivityForResult(intent, requestCode); - } - - public void invalidateOptionsMenuOnUiThread() { - runOnUiThread(new Runnable() { - @Override - public void run() { - invalidateOptionsMenu(); - } - }); - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java b/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java deleted file mode 100644 index 2476f6a4..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/LogWindowWrapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package se.leap.bitmaskclient; - -import android.content.*; - -import de.blinkt.openvpn.activities.*; - -public class LogWindowWrapper { - private static LogWindowWrapper instance; - - private static String TAG = LogWindowWrapper.class.getName(); - private Context context; - - public LogWindowWrapper(Context context) { - this.context = context; - } - - public void showLog() { - Intent startLW = new Intent(context, LogWindow.class); - startLW.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(startLW); - } - - public static LogWindowWrapper getInstance(Context context) { - if(instance == null) - instance = new LogWindowWrapper(context); - return instance; - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java index 06a66e43..69002355 100644 --- a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java @@ -11,6 +11,7 @@ import android.support.v7.widget.Toolbar; import se.leap.bitmaskclient.drawer.NavigationDrawerFragment; import se.leap.bitmaskclient.eip.EipCommand; +import se.leap.bitmaskclient.fragments.LogFragment; import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; @@ -29,6 +30,7 @@ public class MainActivity extends AppCompatActivity { private NavigationDrawerFragment navigationDrawerFragment; public final static String ACTION_SHOW_VPN_FRAGMENT = "action_show_vpn_fragment"; + public final static String ACTION_SHOW_LOG_FRAGMENT = "action_show_log_fragment"; /** * Fragment managing the behaviors, interactions and presentation of the navigation drawer. @@ -78,6 +80,9 @@ public class MainActivity extends AppCompatActivity { bundle.putParcelable(PROVIDER_KEY, provider); fragment.setArguments(bundle); break; + case ACTION_SHOW_LOG_FRAGMENT: + fragment = new LogFragment(); + break; default: break; } diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java b/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java index 3d85b4ad..03e0669a 100644 --- a/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/fragments/LogFragment.java @@ -63,7 +63,6 @@ import de.blinkt.openvpn.core.ProfileManager; import de.blinkt.openvpn.core.VpnStatus; import de.blinkt.openvpn.core.VpnStatus.LogListener; import de.blinkt.openvpn.core.VpnStatus.StateListener; -import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.R; import static de.blinkt.openvpn.core.OpenVPNService.humanReadableByteCount; @@ -427,29 +426,8 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar. return true; } else if (item.getItemId() == R.id.send) { ladapter.shareLog(); - } else if (item.getItemId() == R.id.edit_vpn) { - VpnProfile lastConnectedprofile = ProfileManager.get(getActivity(), VpnStatus.getLastConnectedVPNProfile()); - - if (lastConnectedprofile != null) { - Intent vprefintent = new Intent(getActivity(), Dashboard.class) - .putExtra(VpnProfile.EXTRA_PROFILEUUID, lastConnectedprofile.getUUIDString()); - startActivityForResult(vprefintent, START_VPN_CONFIG); - } else { - Toast.makeText(getActivity(), R.string.log_no_last_vpn, Toast.LENGTH_LONG).show(); - } } else if (item.getItemId() == R.id.toggle_time) { showHideOptionsPanel(); - } else if (item.getItemId() == android.R.id.home) { - // This is called when the Home (Up) button is pressed - // in the Action Bar. - Intent parentActivityIntent = new Intent(getActivity(), Dashboard.class); - parentActivityIntent.addFlags( - Intent.FLAG_ACTIVITY_CLEAR_TOP | - Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(parentActivityIntent); - getActivity().finish(); - return true; - } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/se/leap/bitmaskclient/userstatus/FabButton.java b/app/src/main/java/se/leap/bitmaskclient/userstatus/FabButton.java deleted file mode 100644 index d1c56dee..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/userstatus/FabButton.java +++ /dev/null @@ -1,28 +0,0 @@ -package se.leap.bitmaskclient.userstatus; - - -import android.content.Context; -import android.util.AttributeSet; - -import mbanje.kurt.fabbutton.CircleImageView; -import se.leap.bitmaskclient.R; - -public class FabButton extends mbanje.kurt.fabbutton.FabButton { - - - public FabButton(Context context) { - super(context); - } - - public FabButton(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public FabButton(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - private CircleImageView getImage() { - return (CircleImageView) findViewById(R.id.fabbutton_circle); - } -} diff --git a/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java b/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java deleted file mode 100644 index 2d8b5c6f..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java +++ /dev/null @@ -1,158 +0,0 @@ -package se.leap.bitmaskclient.userstatus; - -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.TextView; - -import org.jetbrains.annotations.NotNull; - -import java.util.Observable; -import java.util.Observer; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import butterknife.OnClick; -import se.leap.bitmaskclient.Provider; -import se.leap.bitmaskclient.ProviderAPI; -import se.leap.bitmaskclient.ProviderAPICommand; -import se.leap.bitmaskclient.ProviderAPIResultReceiver; -import se.leap.bitmaskclient.R; - -public class UserStatusFragment extends Fragment implements Observer { - - public final static String TAG = UserStatusFragment.class.getSimpleName(); - private ProviderAPIResultReceiver providerAPI_result_receiver; - - private Provider provider; - - @InjectView(R.id.user_status_username) - TextView username; - @InjectView(R.id.user_status_icon) - FabButton icon; - @InjectView(R.id.user_status_button) - Button button; - - private UserStatus status; - private boolean allowsRegistration = false; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - status = UserStatus.getInstance(getResources()); - status.addObserver(this); - } - - @Override - public void onSaveInstanceState(@NotNull Bundle outState) { - if (username != null && username.getVisibility() == TextView.VISIBLE) - outState.putSerializable(UserStatus.TAG, status.sessionStatus()); - - super.onSaveInstanceState(outState); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.user_session_fragment, container, false); - ButterKnife.inject(this, view); - - Bundle arguments = getArguments(); - allowsRegistration = arguments.getBoolean(Provider.ALLOW_REGISTRATION); - handleNewStatus(status); - - return view; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - } - - public void restoreSessionStatus(Bundle savedInstanceState) { - if (savedInstanceState != null) - if (savedInstanceState.containsKey(UserStatus.TAG)) { - UserStatus.SessionStatus status = (UserStatus.SessionStatus) savedInstanceState.getSerializable(UserStatus.TAG); - UserStatus.updateStatus(status, getResources()); - } - } - - @OnClick(R.id.user_status_button) - public void handleButton() { - android.util.Log.d(TAG, status.toString()); - if(status.isLoggedIn()) - logOut(); - else if(status.isLoggedOut()) - Log.w(TAG, "implement login from here?"); - //MainActivity.sessionDialog(Bundle.EMPTY); - else if(status.inProgress()) - cancelLoginOrSignup(); - } - - @Override - public void update(Observable observable, Object data) { - if (observable instanceof UserStatus) { - final UserStatus status = (UserStatus) observable; - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - handleNewStatus(status); - } - }); - } - } - - private void handleNewStatus(UserStatus status) { - this.status = status; - if (allowsRegistration) { - if (this.status.inProgress()) - showUserSessionProgressBar(); - else - hideUserSessionProgressBar(); - changeMessage(); - updateButton(); - } - } - - private void showUserSessionProgressBar() { - icon.showProgress(true); - } - - private void hideUserSessionProgressBar() { - icon.showProgress(false); - } - - private void changeMessage() { - final String message = User.userName(); - username.setText(message); - } - - private void updateButton() { - if(status.isLoggedIn() || status.didntLogOut()) - button.setText(getActivity().getString(R.string.logout_button)); - else if(allowsRegistration) { - if (status.isLoggedOut() || status.notLoggedIn()) - button.setText(getActivity().getString(R.string.login_button)); - else if (status.inProgress()) - button.setText(getActivity().getString(android.R.string.cancel)); - } - } - - - public void logOut() { - android.util.Log.d(TAG, "Log out"); - ProviderAPICommand.execute(getActivity(), ProviderAPI.LOG_OUT, provider, providerAPI_result_receiver); - } - - public void cancelLoginOrSignup() { - //EipStatus.getInstance().setConnectedOrDisconnected(); - } - -} diff --git a/app/src/main/res/layout-sw600dp-port/f_log.xml b/app/src/main/res/layout-sw600dp-port/f_log.xml index 4ee64811..78dc4c62 100644 --- a/app/src/main/res/layout-sw600dp-port/f_log.xml +++ b/app/src/main/res/layout-sw600dp-port/f_log.xml @@ -20,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent"> - + diff --git a/app/src/main/res/layout-sw600dp-port/log_fragment.xml b/app/src/main/res/layout-sw600dp-port/log_fragment.xml deleted file mode 100644 index 7a4b60fe..00000000 --- a/app/src/main/res/layout-sw600dp-port/log_fragment.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/f_log.xml b/app/src/main/res/layout-sw600dp/f_log.xml index ec66af07..34daf8be 100644 --- a/app/src/main/res/layout-sw600dp/f_log.xml +++ b/app/src/main/res/layout-sw600dp/f_log.xml @@ -20,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent"> - + diff --git a/app/src/main/res/layout-sw600dp/log_fragment.xml b/app/src/main/res/layout-sw600dp/log_fragment.xml deleted file mode 100644 index 089bfb9d..00000000 --- a/app/src/main/res/layout-sw600dp/log_fragment.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-xlarge/about.xml b/app/src/main/res/layout-xlarge/about.xml index fdf823a9..ea2251cf 100644 --- a/app/src/main/res/layout-xlarge/about.xml +++ b/app/src/main/res/layout-xlarge/about.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical" android:layout_marginLeft="12sp" - tools:context=".Dashboard" > + tools:context=".MainActivity" > - - - - - - - - - diff --git a/app/src/main/res/layout-xlarge/user_session_fragment.xml b/app/src/main/res/layout-xlarge/user_session_fragment.xml deleted file mode 100644 index df72f615..00000000 --- a/app/src/main/res/layout-xlarge/user_session_fragment.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - -