1
0
Fork 0
mirror of https://github.com/gsantner/dandelion synced 2024-06-30 07:24:52 +02:00

Merge branch 'master' into poddy_as_podsource

This commit is contained in:
Gregor Santner 2016-10-14 00:44:23 +02:00
commit 110598ea85
56 changed files with 2028 additions and 322 deletions

View file

@ -30,3 +30,6 @@ notifications:
on_success: change # options: [always|never|change] default: always on_success: change # options: [always|never|change] default: always
on_failure: always # options: [always|never|change] default: always on_failure: always # options: [always|never|change] default: always
on_start: never # options: [always|never|change] default: always on_start: never # options: [always|never|change] default: always
after_success:
- bash <(curl -s https://codecov.io/bash)

View file

@ -1,3 +1,9 @@
# v0.1.7 wip
- Added: Custom Theme Colors!
- Increased the overall performance by using Fragments
- Lots of bugfixes
- Fixes for the bugfixes!
# v0.1.6 # v0.1.6
- Added: New languages - Added: New languages
- Changed: New delicious visual style + launcher icon - Changed: New delicious visual style + launcher icon

View file

@ -14,6 +14,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see https://www.gnu.org/licenses/. along with this program. If not, see https://www.gnu.org/licenses/.
# Splashscreen-Images # Miscellaneous
The splashscreen images can be found on [flickr](https://www.flickr.com/photos/129581906@N06/sets/72157651933980136/with/16594947123/). We took some inspiration and code from LeafPic. Go check it out, its free software as well!
https://github.com/HoraApps/LeafPic

View file

@ -41,3 +41,6 @@ Diaspora for Android requires access to the Internet and to external storage to
## Maintainers ## Maintainers
- gsantner ([GitHub](https://github.com/gsantner), [Web](https://gsantner.github.io), [diaspora*](https://pod.geraspora.de/people/d1cbdd70095301341e834860008dbc6c)) - gsantner ([GitHub](https://github.com/gsantner), [Web](https://gsantner.github.io), [diaspora*](https://pod.geraspora.de/people/d1cbdd70095301341e834860008dbc6c))
- vanitasvitae ([GitHub](https://github.com/vanitasvitae), [Diaspora](https://pod.geraspora.de/people/bbd7af90fbec013213e34860008dbc6c)) - vanitasvitae ([GitHub](https://github.com/vanitasvitae), [Diaspora](https://pod.geraspora.de/people/bbd7af90fbec013213e34860008dbc6c))
## Acknowledgements
- We took some inspiration and code from [LeafPic](https://github.com/HoraApps/LeafPic), big thanks to Donald Shtjefni and the LeafPic Team!

View file

@ -31,6 +31,13 @@ android {
} }
} }
repositories {
maven {
//Color picker
url "http://dl.bintray.com/dasar/maven"
}
}
dependencies { dependencies {
// Sub-Projects // Sub-Projects
//compile project(':subprojectFromRoot') //compile project(':subprojectFromRoot')
@ -40,15 +47,16 @@ dependencies {
testCompile 'junit:junit:4.12' testCompile 'junit:junit:4.12'
// Android standard libs // Android standard libs
compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.1.0' //Don't u dare to upd8! compile 'com.android.support:design:24.1.0' //Don't update. Broken up to 24.2.1
compile 'com.android.support:support-v4:24.2.0' compile 'com.android.support:support-v4:24.2.1'
compile "com.android.support:customtabs:24.2.0" compile "com.android.support:customtabs:24.2.1"
// More libraries // More libraries
compile 'com.jakewharton:butterknife:8.0.1' compile 'com.jakewharton:butterknife:8.0.1'
compile 'info.guardianproject.netcipher:netcipher:2.0.0-alpha1' compile 'info.guardianproject.netcipher:netcipher:2.0.0-alpha1'
compile 'info.guardianproject.netcipher:netcipher-webkit:2.0.0-alpha1' compile 'info.guardianproject.netcipher:netcipher-webkit:2.0.0-alpha1'
compile(group: 'uz.shift', name: 'colorpicker', version: '0.5', ext: 'aar') //Color picker
apt 'com.jakewharton:butterknife-compiler:8.0.1' apt 'com.jakewharton:butterknife-compiler:8.0.1'
} }

View file

@ -11,7 +11,7 @@
android:icon="@drawable/ic_launcher" android:icon="@drawable/ic_launcher"
android:name="com.github.dfa.diaspora_android.App" android:name="com.github.dfa.diaspora_android.App"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" > android:theme="@style/DiasporaLight" >
<provider <provider
android:name="com.github.dfa.diaspora_android.data.HashtagProvider" android:name="com.github.dfa.diaspora_android.data.HashtagProvider"
@ -25,20 +25,20 @@
<activity <activity
android:name=".activity.SettingsActivity" android:name=".activity.SettingsActivity"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:theme="@style/AppTheme" android:theme="@style/DiasporaLight.NoActionBar"
android:label="@string/settings" /> android:label="@string/settings" />
<activity <activity
android:name=".activity.AboutActivity" android:name=".activity.AboutActivity"
android:label="@string/about_activity__title_about_app" android:label="@string/about_activity__title_about_app"
android:theme="@style/AppTheme.NoActionBar"/> android:theme="@style/DiasporaLight.NoActionBar"/>
<activity <activity
android:name=".activity.MainActivity" android:name=".activity.MainActivity"
android:launchMode="singleTop" android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize" android:windowSoftInputMode="adjustResize"
android:configChanges="keyboardHidden|orientation|screenSize" android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar" android:theme="@style/DiasporaLight.NoActionBar"
android:label="@string/diaspora"> android:label="@string/diaspora">
<intent-filter> <intent-filter>

View file

@ -31,9 +31,10 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -43,10 +44,14 @@ import android.widget.Toast;
import com.github.dfa.diaspora_android.App; import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.AppSettings; import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.fragment.ThemedFragment;
import com.github.dfa.diaspora_android.ui.HtmlTextView; import com.github.dfa.diaspora_android.ui.HtmlTextView;
import com.github.dfa.diaspora_android.ui.IntellihideToolbarActivityListener;
import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.Helpers; import com.github.dfa.diaspora_android.util.Helpers;
import com.github.dfa.diaspora_android.util.Log; import com.github.dfa.diaspora_android.util.Log;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import java.util.Observable; import java.util.Observable;
import java.util.Observer; import java.util.Observer;
@ -57,17 +62,24 @@ import butterknife.ButterKnife;
/** /**
* Activity that holds some fragments that show information about the app in a tab layout * Activity that holds some fragments that show information about the app in a tab layout
*/ */
public class AboutActivity extends AppCompatActivity { public class AboutActivity extends ThemedActivity
implements IntellihideToolbarActivityListener {
private SectionsPagerAdapter mSectionsPagerAdapter; private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager; private ViewPager mViewPager;
@BindView(R.id.about__appbar)
AppBarLayout appBarLayout;
@BindView(R.id.main__topbar) @BindView(R.id.main__topbar)
protected Toolbar toolbar; protected Toolbar toolbar;
@BindView(R.id.appbar_linear_layout) @BindView(R.id.appbar_linear_layout)
protected LinearLayout linearLayout; protected LinearLayout linearLayout;
@BindView(R.id.tabs)
protected TabLayout tabLayout;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -87,23 +99,58 @@ public class AboutActivity extends AppCompatActivity {
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter. // Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container); mViewPager = ButterKnife.findById(this, R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager); tabLayout.setupWithViewPager(mViewPager);
}
//Apply intellihide @Override
if (!((App) getApplication()).getSettings().isIntellihideToolbars()) { public void onResume() {
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) linearLayout.getLayoutParams(); super.onResume();
params.setScrollFlags(0); if(getAppSettings().isIntellihideToolbars()) {
this.enableToolbarHiding();
} else {
this.disableToolbarHiding();
} }
} }
@Override
protected void applyColorToViews() {
ThemeHelper.updateToolbarColor(toolbar);
ThemeHelper.updateTabLayoutColor(tabLayout);
ThemeHelper.setPrimaryColorAsBackground(linearLayout);
}
@Override
public void enableToolbarHiding() {
AppLog.d(this, "Enable Intellihide");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) linearLayout.getLayoutParams();
//scroll|enterAlways|snap
params.setScrollFlags(toolbarDefaultScrollFlags);
appBarLayout.setExpanded(true, true);
}
@Override
public void disableToolbarHiding() {
AppLog.d(this, "Disable Intellihide");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) linearLayout.getLayoutParams();
params.setScrollFlags(0); // clear all scroll flags
appBarLayout.setExpanded(true, true);
}
/** /**
* Fragment that shows general information about the app * Fragment that shows general information about the app
*/ */
public static class AboutFragment extends Fragment { public static class AboutFragment extends ThemedFragment {
public static final String TAG = "com.github.dfa.diaspora_android.AboutActivity.AboutFragment";
@BindView(R.id.fragment_about__about_text)
TextView aboutText;
@BindView(R.id.fragment_about__app_version)
TextView appVersion;
public AboutFragment() { public AboutFragment() {
} }
@ -112,8 +159,7 @@ public class AboutActivity extends AppCompatActivity {
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.about__fragment_about, container, false); View rootView = inflater.inflate(R.layout.about__fragment_about, container, false);
TextView appVersion = (TextView) rootView.findViewById(R.id.fragment_about__app_version); ButterKnife.bind(this, rootView);
if (isAdded()) { if (isAdded()) {
try { try {
PackageInfo pInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); PackageInfo pInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0);
@ -125,18 +171,42 @@ public class AboutActivity extends AppCompatActivity {
} }
return rootView; return rootView;
} }
@Override
protected void applyColorToViews() {
ThemeHelper.updateTextViewColor(aboutText);
}
@Override
public String getFragmentTag() {
return TAG;
}
@Override
public void onCreateBottomOptionsMenu(Menu menu, MenuInflater inflater) {
/* Nothing to do */
}
@Override
public boolean onBackPressed() {
return false;
}
} }
/** /**
* Fragment that shows information about the license of the app and used 3rd party libraries * Fragment that shows information about the license of the app and used 3rd party libraries
*/ */
public static class LicenseFragment extends Fragment { public static class LicenseFragment extends ThemedFragment {
public static final String TAG = "com.github.dfa.diaspora_android.AboutActivity.LicenseFragment";
@BindView(R.id.fragment_license__licensetext) @BindView(R.id.fragment_license__licensetext)
HtmlTextView textLicenseBox; HtmlTextView textLicenseBox;
@BindView(R.id.fragment_license__3rdparty) @BindView(R.id.fragment_license__3rdparty)
HtmlTextView textLicense3partyBox; HtmlTextView textLicense3partyBox;
private String accentColor;
public LicenseFragment() { public LicenseFragment() {
} }
@ -146,7 +216,7 @@ public class AboutActivity extends AppCompatActivity {
View rootView = inflater.inflate(R.layout.about__fragment_license, container, false); View rootView = inflater.inflate(R.layout.about__fragment_license, container, false);
ButterKnife.bind(this, rootView); ButterKnife.bind(this, rootView);
final Context context = rootView.getContext(); final Context context = rootView.getContext();
accentColor = Helpers.hexColorFromRessourceColor(context, R.color.colorAccent); accentColor = Helpers.colorToHex(ThemeHelper.getAccentColor());
textLicenseBox.setTextFormatted(getString(R.string.fragment_license__license_content, textLicenseBox.setTextFormatted(getString(R.string.fragment_license__license_content,
getMaintainersHtml(context), getMaintainersHtml(context),
@ -160,8 +230,6 @@ public class AboutActivity extends AppCompatActivity {
return rootView; return rootView;
} }
private String accentColor;
public String getContributorsHtml(Context context) { public String getContributorsHtml(Context context) {
String text = Helpers.readTextfileFromRawRessource(context, R.raw.contributors, String text = Helpers.readTextfileFromRawRessource(context, R.raw.contributors,
"<font color='" + accentColor + "'><b>*</b></font> ", "<br>"); "<font color='" + accentColor + "'><b>*</b></font> ", "<br>");
@ -187,13 +255,52 @@ public class AboutActivity extends AppCompatActivity {
text = text.replace("NEWENTRY", "<font color='" + accentColor + "'><b>*</b></font> "); text = text.replace("NEWENTRY", "<font color='" + accentColor + "'><b>*</b></font> ");
return text; return text;
} }
@Override
protected void applyColorToViews() {
ThemeHelper.updateTextViewColor(textLicense3partyBox);
ThemeHelper.updateTextViewColor(textLicenseBox);
}
@Override
public String getFragmentTag() {
return TAG;
}
@Override
public void onCreateBottomOptionsMenu(Menu menu, MenuInflater inflater) {
/* Nothing to do */
}
@Override
public boolean onBackPressed() {
return false;
}
} }
/** /**
* Fragment that shows debug information like app version, pod version... * Fragment that shows debug information like app version, pod version...
*/ */
public static class DebugFragment extends Fragment implements Observer { public static class DebugFragment extends Fragment implements Observer {
private TextView logBox; public static final String TAG = "com.github.dfa.diaspora_android.AboutActivity.DebugFragment";
@BindView(R.id.fragment_debug__package_name)
TextView packageName;
@BindView(R.id.fragment_debug__app_version)
TextView appVersion;
@BindView(R.id.fragment_debug__android_version)
TextView osVersion;
@BindView(R.id.fragment_debug__device_name)
TextView deviceName;
@BindView(R.id.fragment_debug__pod_domain)
TextView podDomain;
@BindView(R.id.fragment_debug__log_box)
TextView logBox;
public DebugFragment() { public DebugFragment() {
} }
@ -202,16 +309,11 @@ public class AboutActivity extends AppCompatActivity {
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.about__fragment_debug, container, false); View rootView = inflater.inflate(R.layout.about__fragment_debug, container, false);
TextView packageName = (TextView) rootView.findViewById(R.id.fragment_debug__package_name); ButterKnife.bind(this, rootView);
TextView appVersion = (TextView) rootView.findViewById(R.id.fragment_debug__app_version); App app = (App) getActivity().getApplication();
TextView osVersion = (TextView) rootView.findViewById(R.id.fragment_debug__android_version);
TextView deviceName = (TextView) rootView.findViewById(R.id.fragment_debug__device_name);
TextView podDomain = (TextView) rootView.findViewById(R.id.fragment_debug__pod_domain);
logBox = (TextView) rootView.findViewById(R.id.fragment_debug__log_box);
logBox.setOnLongClickListener(new View.OnLongClickListener() { logBox.setOnLongClickListener(new View.OnLongClickListener() {
@Override @Override
public boolean onLongClick(View view) { public boolean onLongClick(View view) {
AppLog.d(this, "Long click registered");
if (isAdded()) { if (isAdded()) {
ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("DEBUG_LOG", Log.getLogBuffer()); ClipData clip = ClipData.newPlainText("DEBUG_LOG", Log.getLogBuffer());
@ -229,15 +331,16 @@ public class AboutActivity extends AppCompatActivity {
if (isAdded()) { if (isAdded()) {
try { try {
PackageInfo pInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); PackageInfo pInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0);
AppSettings settings = ((App) getActivity().getApplication()).getSettings(); AppSettings appSettings = ((App) getActivity().getApplication()).getSettings();
DiasporaUrlHelper urls = new DiasporaUrlHelper(appSettings);
packageName.setText(pInfo.packageName); packageName.setText(pInfo.packageName);
appVersion.setText(getString(R.string.fragment_debug__app_version, pInfo.versionName + " (" + pInfo.versionCode + ")")); appVersion.setText(getString(R.string.fragment_debug__app_version, pInfo.versionName + " (" + pInfo.versionCode + ")"));
osVersion.setText(getString(R.string.fragment_debug__android_version, Build.VERSION.RELEASE)); osVersion.setText(getString(R.string.fragment_debug__android_version, Build.VERSION.RELEASE));
deviceName.setText(getString(R.string.fragment_debug__device_name, Build.MANUFACTURER + " " + Build.MODEL)); deviceName.setText(getString(R.string.fragment_debug__device_name, Build.MANUFACTURER + " " + Build.MODEL));
if (settings.getPod() != null) { podDomain.setText(getString(R.string.fragment_debug__pod_domain, urls.getPodUrl()));
podDomain.setText(getString(R.string.fragment_debug__pod_domain, settings.getPod().getName())); if (app.getSettings().getPod() != null) {
podDomain.setText(getString(R.string.fragment_debug__pod_domain, app.getSettings().getPod().getName()));
} }
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {

View file

@ -54,6 +54,7 @@ import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -68,18 +69,25 @@ import com.github.dfa.diaspora_android.fragment.HashtagListFragment;
import com.github.dfa.diaspora_android.fragment.PodSelectionFragment; import com.github.dfa.diaspora_android.fragment.PodSelectionFragment;
import com.github.dfa.diaspora_android.listener.WebUserProfileChangedListener; import com.github.dfa.diaspora_android.listener.WebUserProfileChangedListener;
import com.github.dfa.diaspora_android.receiver.OpenExternalLinkReceiver; import com.github.dfa.diaspora_android.receiver.OpenExternalLinkReceiver;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.receiver.UpdateTitleReceiver; import com.github.dfa.diaspora_android.receiver.UpdateTitleReceiver;
import com.github.dfa.diaspora_android.ui.BadgeDrawable; import com.github.dfa.diaspora_android.ui.BadgeDrawable;
import com.github.dfa.diaspora_android.ui.IntellihideToolbarActivityListener;
import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.CustomTabHelpers.CustomTabActivityHelper; import com.github.dfa.diaspora_android.util.CustomTabHelpers.CustomTabActivityHelper;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import com.github.dfa.diaspora_android.util.WebHelper; import com.github.dfa.diaspora_android.util.WebHelper;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity public class MainActivity extends ThemedActivity
implements NavigationView.OnNavigationItemSelectedListener, WebUserProfileChangedListener, CustomTabActivityHelper.ConnectionCallback { implements NavigationView.OnNavigationItemSelectedListener,
WebUserProfileChangedListener,
CustomTabActivityHelper.ConnectionCallback,
IntellihideToolbarActivityListener {
public static final int REQUEST_CODE_ASK_PERMISSIONS = 123; public static final int REQUEST_CODE_ASK_PERMISSIONS = 123;
@ -92,7 +100,6 @@ public class MainActivity extends AppCompatActivity
public static final String ACTION_CHANGE_ACCOUNT = "com.github.dfa.diaspora_android.MainActivity.change_account"; public static final String ACTION_CHANGE_ACCOUNT = "com.github.dfa.diaspora_android.MainActivity.change_account";
public static final String ACTION_CLEAR_CACHE = "com.github.dfa.diaspora_android.MainActivity.clear_cache"; public static final String ACTION_CLEAR_CACHE = "com.github.dfa.diaspora_android.MainActivity.clear_cache";
public static final String ACTION_UPDATE_TITLE_FROM_URL = "com.github.dfa.diaspora_android.MainActivity.set_title"; public static final String ACTION_UPDATE_TITLE_FROM_URL = "com.github.dfa.diaspora_android.MainActivity.set_title";
public static final String ACTION_RELOAD_ACTIVITY = "com.github.dfa.diaspora_android.MainActivity.reload_activity";
public static final String URL_MESSAGE = "URL_MESSAGE"; public static final String URL_MESSAGE = "URL_MESSAGE";
public static final String EXTRA_URL = "com.github.dfa.diaspora_android.extra_url"; public static final String EXTRA_URL = "com.github.dfa.diaspora_android.extra_url";
public static final String CONTENT_HASHTAG = "content://com.github.dfa.diaspora_android.mainactivity/"; public static final String CONTENT_HASHTAG = "content://com.github.dfa.diaspora_android.mainactivity/";
@ -113,6 +120,9 @@ public class MainActivity extends AppCompatActivity
/** /**
* UI Bindings * UI Bindings
*/ */
@BindView(R.id.main__appbar)
AppBarLayout appBarLayout;
@BindView(R.id.main__topbar) @BindView(R.id.main__topbar)
Toolbar toolbarTop; Toolbar toolbarTop;
@ -128,6 +138,9 @@ public class MainActivity extends AppCompatActivity
@BindView(R.id.main__navdrawer) @BindView(R.id.main__navdrawer)
DrawerLayout navDrawer; DrawerLayout navDrawer;
RelativeLayout navDrawerLayout;
LinearLayout navProfilePictureArea;
// NavHeader cannot be bound by Butterknife // NavHeader cannot be bound by Butterknife
private TextView navheaderTitle; private TextView navheaderTitle;
@ -160,6 +173,7 @@ public class MainActivity extends AppCompatActivity
urls = new DiasporaUrlHelper(appSettings); urls = new DiasporaUrlHelper(appSettings);
customTabActivityHelper = new CustomTabActivityHelper(); customTabActivityHelper = new CustomTabActivityHelper();
customTabActivityHelper.setConnectionCallback(this); customTabActivityHelper.setConnectionCallback(this);
ProxyHandler.getInstance().updateProxySettings(this);
fm = getSupportFragmentManager(); fm = getSupportFragmentManager();
setupUI(); setupUI();
@ -169,7 +183,7 @@ public class MainActivity extends AppCompatActivity
@Override @Override
public void setTitle(int rId) { public void setTitle(int rId) {
CustomFragment top = getTopFragment(); CustomFragment top = getTopFragment();
if (top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) { if(top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) {
MainActivity.this.setTitle(rId); MainActivity.this.setTitle(rId);
} }
} }
@ -177,7 +191,7 @@ public class MainActivity extends AppCompatActivity
@Override @Override
public void setTitle(String title) { public void setTitle(String title) {
CustomFragment top = getTopFragment(); CustomFragment top = getTopFragment();
if (top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) { if(top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) {
MainActivity.this.setTitle(title); MainActivity.this.setTitle(title);
} }
} }
@ -229,19 +243,11 @@ public class MainActivity extends AppCompatActivity
// Load app settings // Load app settings
setupNavigationSlider(); setupNavigationSlider();
if (!appSettings.isIntellihideToolbars()) {
AppLog.v(this, "Disable intelligent hiding of toolbars");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbarTop.getLayoutParams();
params.setScrollFlags(0); // clear all scroll flags
}
AppLog.v(this, "UI successfully set up"); AppLog.v(this, "UI successfully set up");
} }
/** /**
* Show DiasporaStreamFragment if necessary and load URL url * Show DiasporaStreamFragment if necessary and load URL url
*
* @param url URL to load in the DiasporaStreamFragment * @param url URL to load in the DiasporaStreamFragment
*/ */
public void openDiasporaUrl(String url) { public void openDiasporaUrl(String url) {
@ -255,13 +261,12 @@ public class MainActivity extends AppCompatActivity
* Get an instance of the CustomFragment with the tag fragmentTag. * Get an instance of the CustomFragment with the tag fragmentTag.
* If there was no instance so far, create a new one and add it to the FragmentManagers pool. * If there was no instance so far, create a new one and add it to the FragmentManagers pool.
* If there is no Fragment with the corresponding Tag, return the top fragment. * If there is no Fragment with the corresponding Tag, return the top fragment.
*
* @param fragmentTag tag * @param fragmentTag tag
* @return corresponding Fragment * @return corresponding Fragment
*/ */
protected CustomFragment getFragment(String fragmentTag) { protected CustomFragment getFragment(String fragmentTag) {
CustomFragment fragment = (CustomFragment) fm.findFragmentByTag(fragmentTag); CustomFragment fragment = (CustomFragment) fm.findFragmentByTag(fragmentTag);
if (fragment != null) { if(fragment != null) {
return fragment; return fragment;
} else { } else {
switch (fragmentTag) { switch (fragmentTag) {
@ -282,8 +287,8 @@ public class MainActivity extends AppCompatActivity
fm.beginTransaction().add(psf, fragmentTag).commit(); fm.beginTransaction().add(psf, fragmentTag).commit();
return psf; return psf;
default: default:
AppLog.e(this, "Invalid Fragment Tag: " + fragmentTag AppLog.e(this,"Invalid Fragment Tag: "+fragmentTag
+ "\nAdd Fragments Tag to getFragment()'s switch case."); +"\nAdd Fragments Tag to getFragment()'s switch case.");
return getTopFragment(); return getTopFragment();
} }
} }
@ -291,13 +296,12 @@ public class MainActivity extends AppCompatActivity
/** /**
* Show the Fragment fragment in R.id.fragment_container. If the fragment was already visible, do nothing. * Show the Fragment fragment in R.id.fragment_container. If the fragment was already visible, do nothing.
*
* @param fragment Fragment to show * @param fragment Fragment to show
*/ */
protected void showFragment(CustomFragment fragment) { protected void showFragment(CustomFragment fragment) {
AppLog.v(this, "showFragment()"); AppLog.v(this, "showFragment()");
CustomFragment currentTop = (CustomFragment) fm.findFragmentById(R.id.fragment_container); CustomFragment currentTop = (CustomFragment) fm.findFragmentById(R.id.fragment_container);
if (currentTop == null || !currentTop.getFragmentTag().equals(fragment.getFragmentTag())) { if(currentTop == null || !currentTop.getFragmentTag().equals(fragment.getFragmentTag())) {
AppLog.v(this, "Fragment was not visible. Replace it."); AppLog.v(this, "Fragment was not visible. Replace it.");
fm.beginTransaction().addToBackStack(null).replace(R.id.fragment_container, fragment, fragment.getFragmentTag()).commit(); fm.beginTransaction().addToBackStack(null).replace(R.id.fragment_container, fragment, fragment.getFragmentTag()).commit();
invalidateOptionsMenu(); invalidateOptionsMenu();
@ -319,9 +323,10 @@ public class MainActivity extends AppCompatActivity
navView.setNavigationItemSelectedListener(this); navView.setNavigationItemSelectedListener(this);
View navHeader = navView.getHeaderView(0); View navHeader = navView.getHeaderView(0);
LinearLayout navheaderProfileSection = ButterKnife.findById(navHeader, R.id.nav_profile_picture); navProfilePictureArea = ButterKnife.findById(navHeader, R.id.nav_profile_picture);
navDrawerLayout = ButterKnife.findById(navHeader, R.id.nav_drawer);
//Handle clicks on profile picture //Handle clicks on profile picture
navheaderProfileSection.setOnClickListener(new View.OnClickListener() { navProfilePictureArea.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
navDrawer.closeDrawer(GravityCompat.START); navDrawer.closeDrawer(GravityCompat.START);
@ -358,11 +363,30 @@ public class MainActivity extends AppCompatActivity
} }
} }
} }
updateNavigationViewEntryVisibilities();
}
protected void updateNavigationViewEntryVisibilities() {
Menu navMenu = navView.getMenu();
navMenu.findItem(R.id.nav_exit).setVisible(appSettings.isVisibleInNavExit());
navMenu.findItem(R.id.nav_activities).setVisible(appSettings.isVisibleInNavActivities());
navMenu.findItem(R.id.nav_aspects).setVisible(appSettings.isVisibleInNavAspects());
navMenu.findItem(R.id.nav_commented).setVisible(appSettings.isVisibleInNavCommented());
navMenu.findItem(R.id.nav_followed_tags).setVisible(appSettings.isVisibleInNavFollowed_tags());
navMenu.findItem(R.id.nav_about).setVisible(appSettings.isVisibleInNavHelp_license());
navMenu.findItem(R.id.nav_liked).setVisible(appSettings.isVisibleInNavLiked());
navMenu.findItem(R.id.nav_mentions).setVisible(appSettings.isVisibleInNavMentions());
navMenu.findItem(R.id.nav_profile).setVisible(appSettings.isVisibleInNavProfile());
navMenu.findItem(R.id.nav_public).setVisible(appSettings.isVisibleInNavPublic_activities());
// Top bar
if (appSettings.getPod() == null) {
navMenu.setGroupVisible(navMenu.findItem(R.id.nav_exit).getGroupId(), false);
}
} }
/** /**
* Forward incoming intents to handleIntent() * Forward incoming intents to handleIntent()
*
* @param intent incoming * @param intent incoming
*/ */
@Override @Override
@ -373,7 +397,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Handle intents and execute intent specific actions * Handle intents and execute intent specific actions
*
* @param intent intent to get handled * @param intent intent to get handled
*/ */
private void handleIntent(Intent intent) { private void handleIntent(Intent intent) {
@ -398,7 +421,7 @@ public class MainActivity extends AppCompatActivity
return; return;
} else { } else {
loadUrl = intent.getDataString(); loadUrl = intent.getDataString();
AppLog.v(this, "Intent has a delicious URL for us: " + loadUrl); AppLog.v(this, "Intent has a delicious URL for us: "+loadUrl);
} }
} else if (ACTION_CHANGE_ACCOUNT.equals(action)) { } else if (ACTION_CHANGE_ACCOUNT.equals(action)) {
AppLog.v(this, "Reset pod data and show PodSelectionFragment"); AppLog.v(this, "Reset pod data and show PodSelectionFragment");
@ -408,10 +431,6 @@ public class MainActivity extends AppCompatActivity
} else if (ACTION_CLEAR_CACHE.equals(action)) { } else if (ACTION_CLEAR_CACHE.equals(action)) {
AppLog.v(this, "Clear WebView cache"); AppLog.v(this, "Clear WebView cache");
((DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG)).getWebView().clearCache(true); ((DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG)).getWebView().clearCache(true);
} else if (ACTION_RELOAD_ACTIVITY.equals(action)) {
AppLog.v(this, "Recreate activity");
recreate();
return;
} else if (Intent.ACTION_SEND.equals(action) && type != null) { } else if (Intent.ACTION_SEND.equals(action) && type != null) {
switch (type) { switch (type) {
case "text/plain": case "text/plain":
@ -438,25 +457,23 @@ public class MainActivity extends AppCompatActivity
/** /**
* Handle activity results * Handle activity results
*
* @param requestCode reqCode * @param requestCode reqCode
* @param resultCode resCode * @param resultCode resCode
* @param data data * @param data data
*/ */
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
AppLog.v(this, "onActivityResult(): " + requestCode); AppLog.v(this, "onActivityResult(): "+requestCode);
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
} }
/** /**
* Return the fragment which is currently displayed in R.id.fragment_container * Return the fragment which is currently displayed in R.id.fragment_container
*
* @return top fragment or null if there is none displayed * @return top fragment or null if there is none displayed
*/ */
private CustomFragment getTopFragment() { private CustomFragment getTopFragment() {
Fragment top = fm.findFragmentById(R.id.fragment_container); Fragment top = fm.findFragmentById(R.id.fragment_container);
if (top != null) { if(top != null) {
return (CustomFragment) top; return (CustomFragment) top;
} }
return null; return null;
@ -473,12 +490,12 @@ public class MainActivity extends AppCompatActivity
return; return;
} }
CustomFragment top = getTopFragment(); CustomFragment top = getTopFragment();
if (top != null) { if(top != null) {
AppLog.v(this, "Top Fragment is not null"); AppLog.v(this, "Top Fragment is not null");
if (!top.onBackPressed()) { if(!top.onBackPressed()) {
AppLog.v(this, "Top Fragment.onBackPressed was false"); AppLog.v(this, "Top Fragment.onBackPressed was false");
AppLog.v(this, "BackStackEntryCount: " + fm.getBackStackEntryCount()); AppLog.v(this, "BackStackEntryCount: "+fm.getBackStackEntryCount());
if (fm.getBackStackEntryCount() > 0) { if(fm.getBackStackEntryCount()>0) {
fm.popBackStack(); fm.popBackStack();
} else { } else {
snackbarExitApp.show(); snackbarExitApp.show();
@ -523,12 +540,18 @@ public class MainActivity extends AppCompatActivity
AppLog.v(this, "Register BroadcastReceivers"); AppLog.v(this, "Register BroadcastReceivers");
LocalBroadcastManager.getInstance(this).registerReceiver(brSetTitle, new IntentFilter(ACTION_UPDATE_TITLE_FROM_URL)); LocalBroadcastManager.getInstance(this).registerReceiver(brSetTitle, new IntentFilter(ACTION_UPDATE_TITLE_FROM_URL));
LocalBroadcastManager.getInstance(this).registerReceiver(brOpenExternalLink, new IntentFilter(ACTION_OPEN_EXTERNAL_URL)); LocalBroadcastManager.getInstance(this).registerReceiver(brOpenExternalLink, new IntentFilter(ACTION_OPEN_EXTERNAL_URL));
this.appSettings = getAppSettings();
if (appSettings.isIntellihideToolbars()) {
this.enableToolbarHiding();
} else {
this.disableToolbarHiding();
}
updateNavigationViewEntryVisibilities();
} }
/** /**
* Clear and repopulate top and bottom toolbar. * Clear and repopulate top and bottom toolbar.
* Also add menu items of the displayed fragment * Also add menu items of the displayed fragment
*
* @param menu top toolbar * @param menu top toolbar
* @return boolean * @return boolean
*/ */
@ -541,9 +564,9 @@ public class MainActivity extends AppCompatActivity
toolbarBottom.setVisibility(View.VISIBLE); toolbarBottom.setVisibility(View.VISIBLE);
CustomFragment top = getTopFragment(); CustomFragment top = getTopFragment();
if (top != null) { if(top != null) {
//Are we displaying a Fragment other than PodSelectionFragment? //Are we displaying a Fragment other than PodSelectionFragment?
if (!top.getFragmentTag().equals(PodSelectionFragment.TAG)) { if(!top.getFragmentTag().equals(PodSelectionFragment.TAG)) {
getMenuInflater().inflate(R.menu.main__menu_top, menu); getMenuInflater().inflate(R.menu.main__menu_top, menu);
getMenuInflater().inflate(R.menu.main__menu_bottom, toolbarBottom.getMenu()); getMenuInflater().inflate(R.menu.main__menu_bottom, toolbarBottom.getMenu());
top.onCreateBottomOptionsMenu(toolbarBottom.getMenu(), getMenuInflater()); top.onCreateBottomOptionsMenu(toolbarBottom.getMenu(), getMenuInflater());
@ -559,30 +582,13 @@ public class MainActivity extends AppCompatActivity
/** /**
* Set the notification and messages counter in the top toolbar * Set the notification and messages counter in the top toolbar
*
* @param menu menu * @param menu menu
* @return boolean * @return boolean
*/ */
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {
// Navigation slider
Menu navMenu = navView.getMenu();
navMenu.findItem(R.id.nav_exit).setVisible(appSettings.isVisibleInNavExit());
navMenu.findItem(R.id.nav_activities).setVisible(appSettings.isVisibleInNavActivities());
navMenu.findItem(R.id.nav_aspects).setVisible(appSettings.isVisibleInNavAspects());
navMenu.findItem(R.id.nav_commented).setVisible(appSettings.isVisibleInNavCommented());
navMenu.findItem(R.id.nav_followed_tags).setVisible(appSettings.isVisibleInNavFollowed_tags());
navMenu.findItem(R.id.nav_about).setVisible(appSettings.isVisibleInNavHelp_license());
navMenu.findItem(R.id.nav_liked).setVisible(appSettings.isVisibleInNavLiked());
navMenu.findItem(R.id.nav_mentions).setVisible(appSettings.isVisibleInNavMentions());
navMenu.findItem(R.id.nav_profile).setVisible(appSettings.isVisibleInNavProfile());
navMenu.findItem(R.id.nav_public).setVisible(appSettings.isVisibleInNavPublic_activities());
// Top bar
MenuItem item; MenuItem item;
if (appSettings.getPod() == null) { updateNavigationViewEntryVisibilities();
navMenu.setGroupVisible(navView.getMenu().findItem(R.id.nav_exit).getGroupId(), false);
}
if ((item = menu.findItem(R.id.action_notifications)) != null) { if ((item = menu.findItem(R.id.action_notifications)) != null) {
LayerDrawable icon = (LayerDrawable) item.getIcon(); LayerDrawable icon = (LayerDrawable) item.getIcon();
@ -598,7 +604,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Handle clicks on the optionsmenu * Handle clicks on the optionsmenu
*
* @param item item * @param item item
* @return boolean * @return boolean
*/ */
@ -697,7 +702,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Update the profile name in the navigation slider * Update the profile name in the navigation slider
*
* @param name name * @param name name
*/ */
@Override @Override
@ -708,7 +712,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Update the profile picture in the navigation slider * Update the profile picture in the navigation slider
*
* @param avatarUrl url of the new profile pic * @param avatarUrl url of the new profile pic
*/ */
@Override @Override
@ -719,7 +722,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Handle hashtag clicks. Open the new-post-url and inject the clicked hashtag into the post-editor * Handle hashtag clicks. Open the new-post-url and inject the clicked hashtag into the post-editor
*
* @param intent intent * @param intent intent
*/ */
private void handleHashtag(Intent intent) { private void handleHashtag(Intent intent) {
@ -734,7 +736,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Open the new-post-url and inject text that was shared into the app into the post editors text field * Open the new-post-url and inject text that was shared into the app into the post editors text field
*
* @param intent shareTextIntent * @param intent shareTextIntent
*/ */
private void handleSendText(Intent intent) { private void handleSendText(Intent intent) {
@ -793,7 +794,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Share an image shared to the app via diaspora * Share an image shared to the app via diaspora
*
* @param intent shareImageIntent * @param intent shareImageIntent
*/ */
//TODO: Implement some day //TODO: Implement some day
@ -810,7 +810,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Invalidate the top toolbar to update the notification counter * Invalidate the top toolbar to update the notification counter
*
* @param notificationCount new notification count * @param notificationCount new notification count
*/ */
@Override @Override
@ -822,7 +821,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Invalidate the top toolbar to update the unread messages counter * Invalidate the top toolbar to update the unread messages counter
*
* @param unreadMessageCount new unread messages count * @param unreadMessageCount new unread messages count
*/ */
@Override @Override
@ -834,8 +832,8 @@ public class MainActivity extends AppCompatActivity
@Override @Override
public void onCustomTabsConnected() { public void onCustomTabsConnected() {
if (customTabsSession == null) { if(customTabsSession == null) {
AppLog.i(this, "CustomTabs warmup: " + customTabActivityHelper.warmup(0)); AppLog.i(this, "CustomTabs warmup: "+customTabActivityHelper.warmup(0));
customTabsSession = customTabActivityHelper.getSession(); customTabsSession = customTabActivityHelper.getSession();
} }
} }
@ -955,9 +953,8 @@ public class MainActivity extends AppCompatActivity
/** /**
* React to results of requestPermission * React to results of requestPermission
* * @param requestCode resCode
* @param requestCode resCode * @param permissions requested permissions
* @param permissions requested permissions
* @param grantResults granted results * @param grantResults granted results
*/ */
@Override @Override
@ -981,7 +978,6 @@ public class MainActivity extends AppCompatActivity
/** /**
* Return the string that will be shared into the new-post-editor * Return the string that will be shared into the new-post-editor
*
* @return String * @return String
*/ */
public String getTextToBeShared() { public String getTextToBeShared() {
@ -990,10 +986,34 @@ public class MainActivity extends AppCompatActivity
/** /**
* Set the string that will be shared into the new-post-editor * Set the string that will be shared into the new-post-editor
*
* @param textToBeShared * @param textToBeShared
*/ */
public void setTextToBeShared(String textToBeShared) { public void setTextToBeShared(String textToBeShared) {
this.textToBeShared = textToBeShared; this.textToBeShared = textToBeShared;
} }
@Override
protected void applyColorToViews() {
ThemeHelper.updateToolbarColor(toolbarTop);
ThemeHelper.updateActionMenuViewColor(toolbarBottom);
navDrawerLayout.setBackgroundColor(appSettings.getPrimaryColor());
navProfilePictureArea.setBackgroundColor(appSettings.getPrimaryColor());
}
@Override
public void enableToolbarHiding() {
AppLog.d(this, "Enable Intellihide");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbarTop.getLayoutParams();
//scroll|enterAlways|snap
params.setScrollFlags(toolbarDefaultScrollFlags);
appBarLayout.setExpanded(true, true);
}
@Override
public void disableToolbarHiding() {
AppLog.d(this, "Disable Intellihide");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbarTop.getLayoutParams();
params.setScrollFlags(0); // clear all scroll flags
appBarLayout.setExpanded(true, true);
}
} }

View file

@ -1,58 +1,85 @@
/* /*
This file is part of the Diaspora for Android. This file is part of the Diaspora for Android.
Diaspora for Android is free software: you can redistribute it and/or modify Diaspora for Android is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Diaspora for Android is distributed in the hope that it will be useful, Diaspora for Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with the Diaspora for Android. along with the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.github.dfa.diaspora_android.activity; package com.github.dfa.diaspora_android.activity;
import android.app.AlarmManager;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.EditTextPreference; import android.preference.EditTextPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.support.v7.app.ActionBar; import android.support.design.widget.AppBarLayout;
import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.github.dfa.diaspora_android.App; import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.AppSettings; import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.data.DiasporaPodList; import com.github.dfa.diaspora_android.ui.IntellihideToolbarActivityListener;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.util.theming.ColorPalette;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import butterknife.BindView;
import butterknife.ButterKnife;
import uz.shift.colorpicker.LineColorPicker;
import uz.shift.colorpicker.OnColorChangedListener;
/** /**
* @author vanitas * @author vanitas
*/ */
public class SettingsActivity extends AppCompatActivity { public class SettingsActivity extends ThemedActivity implements IntellihideToolbarActivityListener {
private boolean activityRestartRequired; @BindView(R.id.settings__appbar)
protected AppBarLayout appBarLayout;
@BindView(R.id.settings__toolbar)
protected Toolbar toolbar;
private ProxyHandler.ProxySettings oldProxySettings;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ActionBar toolbar = getSupportActionBar(); setContentView(R.layout.settings__activity);
if (toolbar != null) ButterKnife.bind(this);
toolbar.setDisplayHomeAsUpEnabled(true); setSupportActionBar(toolbar);
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24px));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SettingsActivity.this.onBackPressed();
}
});
oldProxySettings = getAppSettings().getProxySettings();
getFragmentManager().beginTransaction().replace(R.id.settings__fragment_container, new SettingsFragment()).commit();
} }
@Override @Override
@ -66,8 +93,26 @@ public class SettingsActivity extends AppCompatActivity {
} }
} }
private void setActivityRestartRequired() { @Override
this.activityRestartRequired = true; protected void applyColorToViews() {
ThemeHelper.updateToolbarColor(toolbar);
}
@Override
public void enableToolbarHiding() {
AppLog.d(this, "Enable Intellihide");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
//scroll|enterAlways|snap
params.setScrollFlags(toolbarDefaultScrollFlags);
appBarLayout.setExpanded(true, true);
}
@Override
public void disableToolbarHiding() {
AppLog.d(this, "Disable Intellihide");
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(0); // clear all scroll flags
appBarLayout.setExpanded(true, true);
} }
public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@ -81,12 +126,12 @@ public class SettingsActivity extends AppCompatActivity {
sharedPreferences.registerOnSharedPreferenceChangeListener(this); sharedPreferences.registerOnSharedPreferenceChangeListener(this);
setPreferenceSummaries(); setPreferenceSummaries();
sharedPreferences.edit().putBoolean(getString(R.string.pref_key__proxy_was_enabled), sharedPreferences.edit().putBoolean(getString(R.string.pref_key__proxy_was_enabled),
sharedPreferences.getBoolean(getString(R.string.pref_key__proxy_enabled), false)).apply(); sharedPreferences.getBoolean(getString(R.string.pref_key__http_proxy_enabled), false)).apply();
} }
private void setPreferenceSummaries() { private void setPreferenceSummaries() {
String[] editTextKeys = new String[]{ String[] editTextKeys = new String[]{
getString(R.string.pref_key__proxy_host), getString(R.string.pref_key__proxy_port) getString(R.string.pref_key__http_proxy_host), getString(R.string.pref_key__http_proxy_port)
}; };
for (String key : editTextKeys) { for (String key : editTextKeys) {
EditTextPreference p = (EditTextPreference) findPreference(key); EditTextPreference p = (EditTextPreference) findPreference(key);
@ -97,14 +142,12 @@ public class SettingsActivity extends AppCompatActivity {
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
updatePreference(findPreference(key)); updatePreference(findPreference(key));
if (key != null && isAdded() && (key.equals(getString(R.string.pref_key__font_size)) || if (key.equals(getString(R.string.pref_key__intellihide_toolbars))) {
key.equals(getString(R.string.pref_key__load_images)) || if (sharedPreferences.getBoolean(getString(R.string.pref_key__intellihide_toolbars), false)) {
key.equals(getString(R.string.pref_key__intellihide_toolbars)) || ((SettingsActivity) getActivity()).enableToolbarHiding();
key.equals(getString(R.string.pref_key__proxy_enabled)) || } else {
key.equals(getString(R.string.pref_key__proxy_host)) || ((SettingsActivity) getActivity()).disableToolbarHiding();
key.equals(getString(R.string.pref_key__proxy_port)) || }
key.startsWith("pref_key__visibility_nav__"))) {
((SettingsActivity) getActivity()).setActivityRestartRequired();
} }
} }
@ -125,10 +168,31 @@ public class SettingsActivity extends AppCompatActivity {
@Override @Override
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
Intent intent = new Intent(getActivity(), MainActivity.class);
App app = ((App) getActivity().getApplication()); App app = ((App) getActivity().getApplication());
AppSettings appSettings = app.getSettings();
if (Build.VERSION.SDK_INT >= 21) {
if (preference instanceof PreferenceScreen && ((PreferenceScreen) preference).getDialog() != null) {
Window window = ((PreferenceScreen) preference).getDialog().getWindow();
if (window != null) {
window.setStatusBarColor(ThemeHelper.getPrimaryDarkColor());
}
}
}
Intent intent = new Intent(getActivity(), MainActivity.class);
DiasporaUrlHelper diasporaUrlHelper = new DiasporaUrlHelper(app.getSettings()); DiasporaUrlHelper diasporaUrlHelper = new DiasporaUrlHelper(app.getSettings());
switch (preference.getTitleRes()) { switch (preference.getTitleRes()) {
case R.string.pref_title__primary_color: {
showColorPickerDialog(1);
intent = null;
break;
}
case R.string.pref_title__accent_color: {
showColorPickerDialog(2);
intent = null;
break;
}
case R.string.pref_title__personal_settings: { case R.string.pref_title__personal_settings: {
intent.setAction(MainActivity.ACTION_OPEN_URL); intent.setAction(MainActivity.ACTION_OPEN_URL);
intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getPersonalSettingsUrl()); intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getPersonalSettingsUrl());
@ -161,8 +225,13 @@ public class SettingsActivity extends AppCompatActivity {
.show(); .show();
return true; return true;
} }
case R.string.pref_title__clear_cache: case R.string.pref_title__http_proxy_load_tor_preset: {
{ ((EditTextPreference) findPreference(getString(R.string.pref_key__http_proxy_host))).setText("127.0.0.1");
((EditTextPreference) findPreference(getString(R.string.pref_key__http_proxy_port))).setText("8118");
return true;
}
case R.string.pref_title__clear_cache: {
intent.setAction(MainActivity.ACTION_CLEAR_CACHE); intent.setAction(MainActivity.ACTION_CLEAR_CACHE);
break; break;
} }
@ -179,6 +248,72 @@ public class SettingsActivity extends AppCompatActivity {
} }
return super.onPreferenceTreeClick(screen, preference); return super.onPreferenceTreeClick(screen, preference);
} }
/**
* Show a colorPicker Dialog
*
* @param type 1 -> Primary Color, 2 -> Accent Color
*/
public void showColorPickerDialog(final int type) {
final AppSettings appSettings = ((App) getActivity().getApplication()).getSettings();
final Context context = getActivity();
//Inflate dialog layout
LayoutInflater inflater = getActivity().getLayoutInflater();
View dialogLayout = inflater.inflate(R.layout.color_picker__dialog, null);
final android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
builder.setView(dialogLayout);
final FrameLayout titleBackground = (FrameLayout) dialogLayout.findViewById(R.id.color_picker_dialog__title_background);
final TextView title = (TextView) dialogLayout.findViewById(R.id.color_picker_dialog__title);
final LineColorPicker base = (LineColorPicker) dialogLayout.findViewById(R.id.color_picker_dialog__base_picker);
final LineColorPicker shade = (LineColorPicker) dialogLayout.findViewById(R.id.color_picker_dialog__shade_picker);
title.setText(type == 1 ? R.string.pref_title__primary_color : R.string.pref_title__accent_color);
title.setTextColor(getResources().getColor(R.color.white));
final int[] current = (type == 1 ? appSettings.getPrimaryColorSettings() : appSettings.getAccentColorSettings());
base.setColors((type == 1 ? ColorPalette.getBaseColors(context) : ColorPalette.getAccentColors(context)));
base.setSelectedColor(current[0]);
shade.setColors(ColorPalette.getColors(context, current[0]));
shade.setSelectedColor(current[1]);
titleBackground.setBackgroundColor(shade.getColor());
base.setOnColorChangedListener(new OnColorChangedListener() {
@Override
public void onColorChanged(int i) {
AppLog.d(this, "Selected Base color changed: " + i);
shade.setColors(ColorPalette.getColors(context, i));
titleBackground.setBackgroundColor(i);
if (i == current[0]) {
shade.setSelectedColor(current[1]);
titleBackground.setBackgroundColor(shade.getColor());
}
}
});
shade.setOnColorChangedListener(new OnColorChangedListener() {
@Override
public void onColorChanged(int i) {
titleBackground.setBackgroundColor(i);
}
});
//Build dialog
builder
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (type == 1) {
appSettings.setPrimaryColorSettings(base.getColor(), shade.getColor());
if (Build.VERSION.SDK_INT >= 21) {
getActivity().getWindow().setStatusBarColor(ThemeHelper.getPrimaryDarkColor());
}
((ThemedActivity) getActivity()).applyColorToViews();
} else {
appSettings.setAccentColorSettings(base.getColor(), shade.getColor());
}
}
}).show();
}
} }
@Override @Override
@ -193,11 +328,21 @@ public class SettingsActivity extends AppCompatActivity {
@Override @Override
protected void onStop() { protected void onStop() {
super.onStop(); ProxyHandler.ProxySettings newProxySettings = getAppSettings().getProxySettings();
if (activityRestartRequired) { if (!oldProxySettings.equals(newProxySettings)) {
Intent intent = new Intent(this, MainActivity.class); AppLog.d(this, "ProxySettings changed.");
intent.setAction(MainActivity.ACTION_RELOAD_ACTIVITY); //Proxy on-off? => Restart app
startActivity(intent); if (oldProxySettings.isEnabled() && !newProxySettings.isEnabled()) {
Intent restartActivity = new Intent(SettingsActivity.this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(SettingsActivity.this, 12374, restartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) SettingsActivity.this.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
System.exit(0);
} //Proxy changed? => Update
else {
ProxyHandler.getInstance().updateProxySettings(this);
}
} }
super.onStop();
} }
} }

View file

@ -0,0 +1,78 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.activity;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
/**
* Activity that supports color schemes
* Created by vanitas on 06.10.16.
*/
public abstract class ThemedActivity extends AppCompatActivity {
protected AppSettings getAppSettings() {
return ((App)getApplication()).getSettings();
}
@Override
protected void onResume() {
super.onResume();
ThemeHelper.getInstance(getAppSettings());
updateStatusBarColor();
updateRecentAppColor();
applyColorToViews();
}
protected abstract void applyColorToViews();
/**
* Update color of the status bar
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void updateStatusBarColor() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(ThemeHelper.getPrimaryDarkColor());
}
}
/**
* Update primary color in recent apps overview
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void updateRecentAppColor(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
BitmapDrawable drawable = ((BitmapDrawable) getDrawable(R.drawable.ic_launcher));
if(drawable != null) {
setTaskDescription(new ActivityManager.TaskDescription(
getResources().getString(R.string.app_name),
drawable.getBitmap(),
getAppSettings().getPrimaryColor()));
}
}
}
}

View file

@ -1,19 +1,15 @@
/* /*
This file is part of the Diaspora for Android. This file is part of the Diaspora for Android.
Diaspora for Android is free software: you can redistribute it and/or modify Diaspora for Android is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Diaspora for Android is distributed in the hope that it will be useful, Diaspora for Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with the Diaspora for Android. along with the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.github.dfa.diaspora_android.data; package com.github.dfa.diaspora_android.data;
@ -23,6 +19,7 @@ import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod; import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod;
import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod.DiasporaPodUrl; import com.github.dfa.diaspora_android.data.DiasporaPodList.DiasporaPod.DiasporaPodUrl;
@ -228,7 +225,7 @@ public class AppSettings {
@SuppressLint("CommitPrefEdits") @SuppressLint("CommitPrefEdits")
public void setProxyEnabled(boolean enabled) { public void setProxyEnabled(boolean enabled) {
//commit instead of apply because the app is likely to be killed before apply is called. //commit instead of apply because the app is likely to be killed before apply is called.
prefApp.edit().putBoolean(context.getString(R.string.pref_key__proxy_enabled), enabled).commit(); prefApp.edit().putBoolean(context.getString(R.string.pref_key__http_proxy_enabled), enabled).commit();
} }
/** /**
@ -237,7 +234,7 @@ public class AppSettings {
* @return whether proxy is enabled or not * @return whether proxy is enabled or not
*/ */
public boolean isProxyEnabled() { public boolean isProxyEnabled() {
return getBoolean(prefApp, R.string.pref_key__proxy_enabled, false); return getBoolean(prefApp, R.string.pref_key__http_proxy_enabled, false);
} }
public boolean wasProxyEnabled() { public boolean wasProxyEnabled() {
@ -261,9 +258,12 @@ public class AppSettings {
* @return proxy host * @return proxy host
*/ */
public String getProxyHost() { public String getProxyHost() {
return getString(prefApp, R.string.pref_key__proxy_host, ""); return getString(prefApp, R.string.pref_key__http_proxy_host, "");
} }
public void setProxyHttpHost(String value) {
setString(prefApp, R.string.pref_key__http_proxy_host, value);
}
/** /**
* Default value: 0 * Default value: 0
* *
@ -271,13 +271,21 @@ public class AppSettings {
*/ */
public int getProxyPort() { public int getProxyPort() {
try { try {
return Integer.parseInt(getString(prefApp, R.string.pref_key__proxy_port, "0")); return Integer.parseInt(getString(prefApp, R.string.pref_key__http_proxy_port, "0"));
} catch (Exception e) { } catch (Exception e) {
setString(prefApp, R.string.pref_key__proxy_port, "0"); setString(prefApp, R.string.pref_key__http_proxy_port, "0");
return 0; return 0;
} }
} }
public void setProxyHttpPort(int value) {
setInt(prefApp, R.string.pref_key__http_proxy_port, value);
}
public ProxyHandler.ProxySettings getProxySettings() {
return new ProxyHandler.ProxySettings(isProxyEnabled(), getProxyHost(), getProxyPort());
}
public boolean isIntellihideToolbars() { public boolean isIntellihideToolbars() {
return getBoolean(prefApp, R.string.pref_key__intellihide_toolbars, false); return getBoolean(prefApp, R.string.pref_key__intellihide_toolbars, false);
} }
@ -333,4 +341,36 @@ public class AppSettings {
public boolean isVisibleInNavProfile() { public boolean isVisibleInNavProfile() {
return getBoolean(prefApp, R.string.pref_key__visibility_nav__profile, false); return getBoolean(prefApp, R.string.pref_key__visibility_nav__profile, false);
} }
public void setPrimaryColorSettings(int base, int shade) {
setInt(prefApp, R.string.pref_key__primary_color_base, base);
setInt(prefApp, R.string.pref_key__primary_color_shade, shade);
}
public int[] getPrimaryColorSettings() {
return new int[]{
getInt(prefApp, R.string.pref_key__primary_color_base, context.getResources().getColor(R.color.md_blue_500)),
getInt(prefApp, R.string.pref_key__primary_color_shade, context.getResources().getColor(R.color.primary))
};
}
public int getPrimaryColor() {
return getInt(prefApp, R.string.pref_key__primary_color_shade, context.getResources().getColor(R.color.primary));
}
public void setAccentColorSettings(int base, int shade) {
setInt(prefApp, R.string.pref_key__accent_color_base, base);
setInt(prefApp, R.string.pref_key__accent_color_shade, shade);
}
public int[] getAccentColorSettings() {
return new int[]{
getInt(prefApp, R.string.pref_key__accent_color_base, context.getResources().getColor(R.color.md_deep_orange_500)),
getInt(prefApp, R.string.pref_key__accent_color_shade, context.getResources().getColor(R.color.accent))
};
}
public int getAccentColor() {
return getInt(prefApp, R.string.pref_key__accent_color_shade, context.getResources().getColor(R.color.accent));
}
} }

View file

@ -1,9 +1,24 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.fragment; package com.github.dfa.diaspora_android.fragment;
import android.Manifest; import android.Manifest;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -11,7 +26,6 @@ import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.StrictMode;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -22,16 +36,17 @@ import android.view.ViewGroup;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import android.webkit.WebView; import android.webkit.WebView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast;
import com.github.dfa.diaspora_android.App; import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.R;
import com.github.dfa.diaspora_android.activity.MainActivity; import com.github.dfa.diaspora_android.activity.MainActivity;
import com.github.dfa.diaspora_android.data.AppSettings; import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.util.ProxyHandler;
import com.github.dfa.diaspora_android.ui.ContextMenuWebView; import com.github.dfa.diaspora_android.ui.ContextMenuWebView;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.webview.CustomWebViewClient; import com.github.dfa.diaspora_android.webview.CustomWebViewClient;
import com.github.dfa.diaspora_android.webview.ProgressBarWebChromeClient; import com.github.dfa.diaspora_android.webview.ProgressBarWebChromeClient;
import com.github.dfa.diaspora_android.util.AppLog;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -42,16 +57,13 @@ import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import info.guardianproject.netcipher.NetCipher;
import info.guardianproject.netcipher.webkit.WebkitProxy;
/** /**
* Fragment with a webView and a ProgressBar. * Fragment with a webView and a ProgressBar.
* This Fragment retains its instance. * This Fragment retains its instance.
* Created by vanitas on 26.09.16. * Created by vanitas on 26.09.16.
*/ */
public class BrowserFragment extends CustomFragment { public class BrowserFragment extends ThemedFragment {
public static final String TAG = "com.github.dfa.diaspora_android.BrowserFragment"; public static final String TAG = "com.github.dfa.diaspora_android.BrowserFragment";
protected View rootLayout; protected View rootLayout;
@ -84,21 +96,13 @@ public class BrowserFragment extends CustomFragment {
if(this.webView == null) { if(this.webView == null) {
this.webView = (ContextMenuWebView) view.findViewById(R.id.webView); this.webView = (ContextMenuWebView) view.findViewById(R.id.webView);
this.applyWebViewSettings(); this.applyWebViewSettings();
ProxyHandler.getInstance().addWebView(webView);
} }
if(this.progressBar == null) { if(this.progressBar == null) {
this.progressBar = (ProgressBar) view.findViewById(R.id.progressBar); this.progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
} }
if (appSettings.isProxyEnabled()) {
if (!setProxy(appSettings.getProxyHost(), appSettings.getProxyPort())) {
AppLog.e(this, "Could not enable Proxy");
Toast.makeText(getContext(), R.string.toast_set_proxy_failed, Toast.LENGTH_SHORT).show();
}
} else if (appSettings.wasProxyEnabled()) {
resetProxy();
}
if(pendingUrl != null) { if(pendingUrl != null) {
loadUrl(pendingUrl); loadUrl(pendingUrl);
pendingUrl = null; pendingUrl = null;
@ -142,86 +146,15 @@ public class BrowserFragment extends CustomFragment {
webView.setWebChromeClient(new ProgressBarWebChromeClient(webView, progressBar)); webView.setWebChromeClient(new ProgressBarWebChromeClient(webView, progressBar));
} }
/** @Override
* Set proxy according to arguments. host must not be "" or null, port must be positive. public void onResume() {
* Return true on success and update appSettings' proxy related values. super.onResume();
* if(webView != null) {
* @param host proxy host (eg. localhost or 127.0.0.1) webSettings.setMinimumFontSize(appSettings.getMinimumFontSize());
* @param port proxy port (eg. 8118) webSettings.setLoadsImagesAutomatically(appSettings.isLoadImages());
* @return success
* @throws IllegalArgumentException if arguments do not fit specifications above
*/
private boolean setProxy(final String host, final int port) {
AppLog.i(this, "StreamFragment.setProxy()");
if (host != null && !host.equals("") && port >= 0) {
AppLog.i(this, "Set proxy to "+host+":"+port);
//Temporary change thread policy
AppLog.v(this, "Set temporary ThreadPolicy");
StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(tmp);
AppLog.v(this, "Apply NetCipher proxy settings");
NetCipher.setProxy(host, port); //Proxy for HttpsUrlConnections
try {
//Proxy for the webview
AppLog.v(this, "Apply Webkit proxy settings");
WebkitProxy.setProxy(MainActivity.class.getName(), getContext().getApplicationContext(), null, host, port);
} catch (Exception e) {
AppLog.e(this, "Could not apply WebKit proxy settings:\n"+e.toString());
}
AppLog.v(this, "Save changes in appSettings");
appSettings.setProxyEnabled(true);
appSettings.setProxyWasEnabled(true);
AppLog.v(this, "Reset old ThreadPolicy");
StrictMode.setThreadPolicy(old);
AppLog.i(this, "Success! Reload WebView");
webView.reload();
return true;
} else {
AppLog.e(this, "Invalid proxy configuration. Host: "+host+" Port: "+port+"\nRefuse to set proxy");
return false;
} }
} }
@SuppressWarnings("unused")
private boolean setProxy() {
return setProxy(appSettings.getProxyHost(), appSettings.getProxyPort());
}
private void resetProxy() {
AppLog.i(this, "StreamFragment.resetProxy()");
AppLog.v(this, "write changes to appSettings");
appSettings.setProxyEnabled(false);
appSettings.setProxyWasEnabled(false);
//Temporary change thread policy
AppLog.v(this, "Set temporary ThreadPolicy");
StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(tmp);
AppLog.v(this, "clear NetCipher proxy");
NetCipher.clearProxy();
try {
AppLog.v(this, "clear WebKit proxy");
WebkitProxy.resetProxy(MainActivity.class.getName(), getContext());
} catch (Exception e) {
AppLog.e(this, "Could not clear WebKit proxy:\n"+e.toString());
}
AppLog.v(this, "Reset old ThreadPolicy");
StrictMode.setThreadPolicy(old);
//Restart app
AppLog.i(this, "Success! Restart app due to proxy reset");
Intent restartActivity = new Intent(getContext(), MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 12374, restartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
System.exit(0);
}
@SuppressWarnings("ResultOfMethodCallIgnored") @SuppressWarnings("ResultOfMethodCallIgnored")
protected boolean makeScreenshotOfWebView(boolean hasToShareScreenshot) { protected boolean makeScreenshotOfWebView(boolean hasToShareScreenshot) {
AppLog.i(this, "StreamFragment.makeScreenshotOfWebView()"); AppLog.i(this, "StreamFragment.makeScreenshotOfWebView()");
@ -350,4 +283,9 @@ public class BrowserFragment extends CustomFragment {
public ContextMenuWebView getWebView() { public ContextMenuWebView getWebView() {
return this.webView; return this.webView;
} }
@Override
protected void applyColorToViews() {
ThemeHelper.updateProgressBarColor(progressBar);
}
} }

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.fragment; package com.github.dfa.diaspora_android.fragment;
import android.os.Bundle; import android.os.Bundle;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.fragment; package com.github.dfa.diaspora_android.fragment;
import android.Manifest; import android.Manifest;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.fragment; package com.github.dfa.diaspora_android.fragment;
import android.os.Bundle; import android.os.Bundle;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.fragment; package com.github.dfa.diaspora_android.fragment;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;

View file

@ -0,0 +1,43 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.fragment;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
/**
* Fragment that supports color schemes
* Created by vanitas on 06.10.16.
*/
public abstract class ThemedFragment extends CustomFragment {
protected AppSettings getAppSettings() {
return ((App)getActivity().getApplication()).getSettings();
}
protected abstract void applyColorToViews();
@Override
public void onResume() {
super.onResume();
ThemeHelper.getInstance(getAppSettings());
applyColorToViews();
}
}

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.receiver; package com.github.dfa.diaspora_android.receiver;
import android.app.Activity; import android.app.Activity;
@ -15,7 +33,7 @@ import com.github.dfa.diaspora_android.data.AppSettings;
import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.CustomTabHelpers.BrowserFallback; import com.github.dfa.diaspora_android.util.CustomTabHelpers.BrowserFallback;
import com.github.dfa.diaspora_android.util.CustomTabHelpers.CustomTabActivityHelper; import com.github.dfa.diaspora_android.util.CustomTabHelpers.CustomTabActivityHelper;
import com.github.dfa.diaspora_android.util.Helpers; import com.github.dfa.diaspora_android.util.theming.ThemeHelper;
/** /**
* BroadcastReceiver that opens links in a Chrome CustomTab * BroadcastReceiver that opens links in a Chrome CustomTab
@ -30,9 +48,10 @@ public class OpenExternalLinkReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context c, Intent receiveIntent) { public void onReceive(Context c, Intent receiveIntent) {
AppSettings settings = new AppSettings(c); AppSettings appSettings = new AppSettings(c);
ThemeHelper.getInstance(appSettings);
AppLog.v(this, "OpenExternalLinkReceiver.onReceive(): url"); AppLog.v(this, "OpenExternalLinkReceiver.onReceive(): url");
Uri url = null; Uri url = null;
try { try {
@ -43,10 +62,10 @@ public class OpenExternalLinkReceiver extends BroadcastReceiver {
return; return;
} }
if (settings.isChromeCustomTabsEnabled()) { if (appSettings.isChromeCustomTabsEnabled()) {
// Setup Chrome Custom Tab // Setup Chrome Custom Tab
CustomTabsIntent.Builder customTab = new CustomTabsIntent.Builder(); CustomTabsIntent.Builder customTab = new CustomTabsIntent.Builder();
customTab.setToolbarColor(Helpers.getColorFromRessource(c, R.color.colorPrimary)); customTab.setToolbarColor(ThemeHelper.getPrimaryColor());
customTab.addDefaultShareMenuItem(); customTab.addDefaultShareMenuItem();
Bitmap backButtonIcon = BitmapFactory.decodeResource(c.getResources(), R.drawable.chrome_custom_tab__back); Bitmap backButtonIcon = BitmapFactory.decodeResource(c.getResources(), R.drawable.chrome_custom_tab__back);

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.receiver; package com.github.dfa.diaspora_android.receiver;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.ui; package com.github.dfa.diaspora_android.ui;
import android.content.Context; import android.content.Context;
@ -30,7 +48,7 @@ public class BadgeDrawable extends Drawable {
float textSize = context.getResources().getDimension(R.dimen.textsize_badge_count); float textSize = context.getResources().getDimension(R.dimen.textsize_badge_count);
badgeBackground = new Paint(); badgeBackground = new Paint();
badgeBackground.setColor(ContextCompat.getColor(context.getApplicationContext(), R.color.accent)); badgeBackground.setColor(ContextCompat.getColor(context.getApplicationContext(), R.color.md_deep_orange_650));
badgeBackground.setAntiAlias(true); badgeBackground.setAntiAlias(true);
badgeBackground.setStyle(Paint.Style.FILL); badgeBackground.setStyle(Paint.Style.FILL);
badgeStroke = new Paint(); badgeStroke = new Paint();

View file

@ -0,0 +1,14 @@
package com.github.dfa.diaspora_android.ui;
import android.support.design.widget.AppBarLayout;
/**
* interface that adds options to control intellihide of toolbars to the Activity
* Created by vanitas on 08.10.16.
*/
public interface IntellihideToolbarActivityListener {
int toolbarDefaultScrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP;
void enableToolbarHiding();
void disableToolbarHiding();
}

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.util; package com.github.dfa.diaspora_android.util;
/** /**

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.util.CustomTabHelpers; package com.github.dfa.diaspora_android.util.CustomTabHelpers;
import android.app.Activity; import android.app.Activity;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.util.CustomTabHelpers; package com.github.dfa.diaspora_android.util.CustomTabHelpers;
import android.app.Activity; import android.app.Activity;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.util.CustomTabHelpers; package com.github.dfa.diaspora_android.util.CustomTabHelpers;
import android.content.Context; import android.content.Context;

View file

@ -114,6 +114,10 @@ public class Helpers {
return "#" + Integer.toHexString(context.getResources().getColor(idColor) & 0x00ffffff); return "#" + Integer.toHexString(context.getResources().getColor(idColor) & 0x00ffffff);
} }
public static String colorToHex(int color) {
return "#" + Integer.toHexString(color & 0x00ffffff);
}
public static void printBundle(Bundle savedInstanceState, String k) { public static void printBundle(Bundle savedInstanceState, String k) {
if (savedInstanceState != null) { if (savedInstanceState != null) {
for (String key : savedInstanceState.keySet()) { for (String key : savedInstanceState.keySet()) {

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.util; package com.github.dfa.diaspora_android.util;
import com.github.dfa.diaspora_android.data.AppSettings; import com.github.dfa.diaspora_android.data.AppSettings;

View file

@ -0,0 +1,135 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.util;
import android.content.Context;
import android.os.StrictMode;
import android.webkit.WebView;
import com.github.dfa.diaspora_android.activity.MainActivity;
import com.github.dfa.diaspora_android.data.AppSettings;
import java.util.ArrayList;
import info.guardianproject.netcipher.NetCipher;
import info.guardianproject.netcipher.webkit.WebkitProxy;
/**
* Proxy Handler that applies proxy settings of the app to webviews etc.
* Created by vanitas on 10.10.16.
*/
public class ProxyHandler {
private static ProxyHandler instance;
private ArrayList<WebView> webViews;
private ProxyHandler() {
/* Singleton, yo? */
this.webViews = new ArrayList<>();
}
public static ProxyHandler getInstance() {
if(instance == null) {
instance = new ProxyHandler();
}
return instance;
}
public void updateProxySettings(Context context) {
AppLog.d(this, "UpdateProxySettings()");
AppSettings appSettings = new AppSettings(context);
StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(tmp);
if (appSettings.isProxyEnabled()) {
//Update NetCipher
NetCipher.setProxy(appSettings.getProxyHost(), appSettings.getProxyPort());
//Update webviews
for (WebView wv : webViews) {
if (wv != null) {
try {
WebkitProxy.setProxy(MainActivity.class.getName(), context.getApplicationContext(), wv, appSettings.getProxyHost(), appSettings.getProxyPort());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
StrictMode.setThreadPolicy(old);
}
public void addWebView(WebView wv) {
AppLog.d(this, "AddWebView");
if(wv != null && !webViews.contains(wv)) {
webViews.add(wv);
updateWebViewProxySettings(wv, wv.getContext());
}
}
private void updateWebViewProxySettings(WebView wv, Context context) {
AppLog.d(this, "UpdateWebViewProxySettings()");
AppSettings appSettings = new AppSettings(context);
StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.ThreadPolicy tmp = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(tmp);
if(appSettings.isProxyEnabled()) {
if (wv != null) {
try {
WebkitProxy.setProxy(MainActivity.class.getName(), context.getApplicationContext(), wv, appSettings.getProxyHost(), appSettings.getProxyPort());
} catch (Exception e) {
e.printStackTrace();
}
}
}
StrictMode.setThreadPolicy(old);
}
public static class ProxySettings {
private final boolean enabled;
private final String host;
private final int port;
public ProxySettings(boolean enabled, String host, int port) {
this.enabled = enabled;
this.host = host;
this.port = port;
}
public boolean isEnabled() {
return enabled;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
@Override
public boolean equals(Object other) {
return (other instanceof ProxySettings) &&
enabled == ((ProxySettings) other).isEnabled() &&
host.equals(((ProxySettings) other).getHost()) &&
port == ((ProxySettings) other).getPort();
}
}
}

View file

@ -0,0 +1,288 @@
package com.github.dfa.diaspora_android.util.theming;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.ColorUtils;
import com.github.dfa.diaspora_android.R;
/**
* Created by dnld on 24/02/16.
*/
public class ColorPalette {
public static int[] getAccentColors(Context context){
return new int[]{
ContextCompat.getColor(context, R.color.md_red_500),
ContextCompat.getColor(context, R.color.md_purple_500),
ContextCompat.getColor(context, R.color.md_deep_purple_500),
ContextCompat.getColor(context, R.color.md_blue_500),
ContextCompat.getColor(context, R.color.md_light_blue_500),
ContextCompat.getColor(context, R.color.md_cyan_500),
ContextCompat.getColor(context, R.color.md_teal_500),
ContextCompat.getColor(context, R.color.md_green_500),
ContextCompat.getColor(context, R.color.md_yellow_500),
ContextCompat.getColor(context, R.color.md_orange_500),
ContextCompat.getColor(context, R.color.md_deep_orange_500),
ContextCompat.getColor(context, R.color.md_brown_500),
ContextCompat.getColor(context, R.color.md_blue_grey_500),
};
}
public static int getObscuredColor(int c){
float[] hsv = new float[3];
int color = c;
Color.colorToHSV(color, hsv);
hsv[2] *= 0.85f; // value component
color = Color.HSVToColor(hsv);
return color;
}
public static int getTransparentColor(int color, int alpha){
return ColorUtils.setAlphaComponent(color, alpha);
}
public static int[] getTransparencyShadows(int color) {
int[] shadows = new int[10];
for (int i=0; i<10;i++)
shadows[i]= (ColorPalette.getTransparentColor(color, ((100-(i*10))*255) /100));
return shadows;
}
public static int[] getBaseColors(Context context) {
return new int[]{
ContextCompat.getColor(context, R.color.md_red_500),
ContextCompat.getColor(context, R.color.md_pink_500),
ContextCompat.getColor(context, R.color.md_purple_500),
ContextCompat.getColor(context, R.color.md_deep_purple_500),
ContextCompat.getColor(context, R.color.md_indigo_500),
ContextCompat.getColor(context, R.color.md_blue_500),
ContextCompat.getColor(context, R.color.md_light_blue_500),
ContextCompat.getColor(context, R.color.md_cyan_500),
ContextCompat.getColor(context, R.color.md_teal_500),
ContextCompat.getColor(context, R.color.md_green_500),
ContextCompat.getColor(context, R.color.md_light_green_500),
ContextCompat.getColor(context, R.color.md_lime_500),
ContextCompat.getColor(context, R.color.md_yellow_500),
ContextCompat.getColor(context, R.color.md_amber_500),
ContextCompat.getColor(context, R.color.md_orange_500),
ContextCompat.getColor(context, R.color.md_deep_orange_500),
ContextCompat.getColor(context, R.color.md_brown_500),
ContextCompat.getColor(context, R.color.md_blue_grey_500),
ContextCompat.getColor(context, R.color.md_grey_500)
};
}
public static int[] getColors(Context context, int c) {
if (c == ContextCompat.getColor(context, R.color.md_red_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_red_200),
ContextCompat.getColor(context, R.color.md_red_300),
ContextCompat.getColor(context, R.color.md_red_400),
ContextCompat.getColor(context, R.color.md_red_500),
ContextCompat.getColor(context, R.color.md_red_600),
ContextCompat.getColor(context, R.color.md_red_700),
ContextCompat.getColor(context, R.color.md_red_800),
ContextCompat.getColor(context, R.color.md_red_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_pink_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_pink_200),
ContextCompat.getColor(context, R.color.md_pink_300),
ContextCompat.getColor(context, R.color.md_pink_400),
ContextCompat.getColor(context, R.color.md_pink_500),
ContextCompat.getColor(context, R.color.md_pink_600),
ContextCompat.getColor(context, R.color.md_pink_700),
ContextCompat.getColor(context, R.color.md_pink_800),
ContextCompat.getColor(context, R.color.md_pink_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_purple_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_purple_200),
ContextCompat.getColor(context, R.color.md_purple_300),
ContextCompat.getColor(context, R.color.md_purple_400),
ContextCompat.getColor(context, R.color.md_purple_500),
ContextCompat.getColor(context, R.color.md_purple_600),
ContextCompat.getColor(context, R.color.md_purple_700),
ContextCompat.getColor(context, R.color.md_purple_800),
ContextCompat.getColor(context, R.color.md_purple_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_deep_purple_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_deep_purple_200),
ContextCompat.getColor(context, R.color.md_deep_purple_300),
ContextCompat.getColor(context, R.color.md_deep_purple_400),
ContextCompat.getColor(context, R.color.md_deep_purple_500),
ContextCompat.getColor(context, R.color.md_deep_purple_600),
ContextCompat.getColor(context, R.color.md_deep_purple_700),
ContextCompat.getColor(context, R.color.md_deep_purple_800),
ContextCompat.getColor(context, R.color.md_deep_purple_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_indigo_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_indigo_200),
ContextCompat.getColor(context, R.color.md_indigo_300),
ContextCompat.getColor(context, R.color.md_indigo_400),
ContextCompat.getColor(context, R.color.md_indigo_500),
ContextCompat.getColor(context, R.color.md_indigo_600),
ContextCompat.getColor(context, R.color.md_indigo_700),
ContextCompat.getColor(context, R.color.md_indigo_800),
ContextCompat.getColor(context, R.color.md_indigo_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_blue_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_blue_200),
ContextCompat.getColor(context, R.color.md_blue_300),
ContextCompat.getColor(context, R.color.md_blue_400),
ContextCompat.getColor(context, R.color.md_blue_500),
ContextCompat.getColor(context, R.color.md_blue_600),
ContextCompat.getColor(context, R.color.md_blue_650),
ContextCompat.getColor(context, R.color.md_blue_700),
ContextCompat.getColor(context, R.color.md_blue_750),
ContextCompat.getColor(context, R.color.md_blue_800),
ContextCompat.getColor(context, R.color.md_blue_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_light_blue_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_light_blue_200),
ContextCompat.getColor(context, R.color.md_light_blue_300),
ContextCompat.getColor(context, R.color.md_light_blue_400),
ContextCompat.getColor(context, R.color.md_light_blue_500),
ContextCompat.getColor(context, R.color.md_light_blue_600),
ContextCompat.getColor(context, R.color.md_light_blue_700),
ContextCompat.getColor(context, R.color.md_light_blue_800),
ContextCompat.getColor(context, R.color.md_light_blue_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_cyan_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_cyan_200),
ContextCompat.getColor(context, R.color.md_cyan_300),
ContextCompat.getColor(context, R.color.md_cyan_400),
ContextCompat.getColor(context, R.color.md_cyan_500),
ContextCompat.getColor(context, R.color.md_cyan_600),
ContextCompat.getColor(context, R.color.md_cyan_700),
ContextCompat.getColor(context, R.color.md_cyan_800),
ContextCompat.getColor(context, R.color.md_cyan_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_teal_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_teal_200),
ContextCompat.getColor(context, R.color.md_teal_300),
ContextCompat.getColor(context, R.color.md_teal_400),
ContextCompat.getColor(context, R.color.md_teal_500),
ContextCompat.getColor(context, R.color.md_teal_600),
ContextCompat.getColor(context, R.color.md_teal_700),
ContextCompat.getColor(context, R.color.md_teal_800),
ContextCompat.getColor(context, R.color.md_teal_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_green_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_green_200),
ContextCompat.getColor(context, R.color.md_green_300),
ContextCompat.getColor(context, R.color.md_green_400),
ContextCompat.getColor(context, R.color.md_green_500),
ContextCompat.getColor(context, R.color.md_green_600),
ContextCompat.getColor(context, R.color.md_green_700),
ContextCompat.getColor(context, R.color.md_green_800),
ContextCompat.getColor(context, R.color.md_green_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_light_green_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_light_green_200),
ContextCompat.getColor(context, R.color.md_light_green_300),
ContextCompat.getColor(context, R.color.md_light_green_400),
ContextCompat.getColor(context, R.color.md_light_green_500),
ContextCompat.getColor(context, R.color.md_light_green_600),
ContextCompat.getColor(context, R.color.md_light_green_700),
ContextCompat.getColor(context, R.color.md_light_green_800),
ContextCompat.getColor(context, R.color.md_light_green_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_lime_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_lime_200),
ContextCompat.getColor(context, R.color.md_lime_300),
ContextCompat.getColor(context, R.color.md_lime_400),
ContextCompat.getColor(context, R.color.md_lime_500),
ContextCompat.getColor(context, R.color.md_lime_600),
ContextCompat.getColor(context, R.color.md_lime_700),
ContextCompat.getColor(context, R.color.md_lime_800),
ContextCompat.getColor(context, R.color.md_lime_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_yellow_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_yellow_400),
ContextCompat.getColor(context, R.color.md_yellow_500),
ContextCompat.getColor(context, R.color.md_yellow_600),
ContextCompat.getColor(context, R.color.md_yellow_700),
ContextCompat.getColor(context, R.color.md_yellow_800),
ContextCompat.getColor(context, R.color.md_yellow_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_amber_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_amber_200),
ContextCompat.getColor(context, R.color.md_amber_300),
ContextCompat.getColor(context, R.color.md_amber_400),
ContextCompat.getColor(context, R.color.md_amber_500),
ContextCompat.getColor(context, R.color.md_amber_600),
ContextCompat.getColor(context, R.color.md_amber_700),
ContextCompat.getColor(context, R.color.md_amber_800),
ContextCompat.getColor(context, R.color.md_amber_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_orange_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_orange_200),
ContextCompat.getColor(context, R.color.md_orange_300),
ContextCompat.getColor(context, R.color.md_orange_400),
ContextCompat.getColor(context, R.color.md_orange_500),
ContextCompat.getColor(context, R.color.md_orange_600),
ContextCompat.getColor(context, R.color.md_orange_700),
ContextCompat.getColor(context, R.color.md_orange_800),
ContextCompat.getColor(context, R.color.md_orange_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_deep_orange_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_deep_orange_200),
ContextCompat.getColor(context, R.color.md_deep_orange_300),
ContextCompat.getColor(context, R.color.md_deep_orange_400),
ContextCompat.getColor(context, R.color.md_deep_orange_500),
ContextCompat.getColor(context, R.color.md_deep_orange_600),
ContextCompat.getColor(context, R.color.md_deep_orange_650),
ContextCompat.getColor(context, R.color.md_deep_orange_700),
ContextCompat.getColor(context, R.color.md_deep_orange_800),
ContextCompat.getColor(context, R.color.md_deep_orange_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_brown_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_brown_200),
ContextCompat.getColor(context, R.color.md_brown_300),
ContextCompat.getColor(context, R.color.md_brown_400),
ContextCompat.getColor(context, R.color.md_brown_500),
ContextCompat.getColor(context, R.color.md_brown_600),
ContextCompat.getColor(context, R.color.md_brown_700),
ContextCompat.getColor(context, R.color.md_brown_800),
ContextCompat.getColor(context, R.color.md_brown_900)
};
} else if (c == ContextCompat.getColor(context, R.color.md_grey_500)) {
return new int[]{
ContextCompat.getColor(context, R.color.md_grey_400),
ContextCompat.getColor(context, R.color.md_grey_500),
ContextCompat.getColor(context, R.color.md_grey_600),
ContextCompat.getColor(context, R.color.md_grey_700),
ContextCompat.getColor(context, R.color.md_grey_800),
ContextCompat.getColor(context, R.color.md_grey_900),
Color.parseColor("#000000")
};
} else {
return new int[]{
ContextCompat.getColor(context, R.color.md_blue_grey_300),
ContextCompat.getColor(context, R.color.md_blue_grey_400),
ContextCompat.getColor(context, R.color.md_blue_grey_500),
ContextCompat.getColor(context, R.color.md_blue_grey_600),
ContextCompat.getColor(context, R.color.md_blue_grey_700),
ContextCompat.getColor(context, R.color.md_blue_grey_800),
ContextCompat.getColor(context, R.color.md_blue_grey_900)
};
}
}
}

View file

@ -0,0 +1,128 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
This class is inspired by org.horasapps.LeafPic
*/
package com.github.dfa.diaspora_android.util.theming;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.support.design.widget.TabLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.github.dfa.diaspora_android.data.AppSettings;
/**
* Singleton that can be used to color views
* Created by vanitas on 06.10.16.
*/
public class ThemeHelper {
private AppSettings appSettings;
private static ThemeHelper instance;
private ThemeHelper(AppSettings appSettings) {
this.appSettings = appSettings;
}
public static ThemeHelper getInstance(AppSettings appSettings) {
if(instance == null) {
instance = new ThemeHelper(appSettings);
}
return instance;
}
public static ThemeHelper getInstance() {
if(instance == null) throw new IllegalStateException("ThemeHelper must be initialized using getInstance(AppSettings) before it can be used!");
return instance;
}
public static void updateEditTextColor(EditText editText) {
if(editText != null) {
editText.setHighlightColor(getInstance().appSettings.getAccentColor());
}
}
public static void updateCheckBoxColor(CheckBox checkBox) {
if(checkBox != null) {
checkBox.setHighlightColor(getInstance().appSettings.getAccentColor());
}
}
public static void updateTabLayoutColor(TabLayout tabLayout) {
if(tabLayout != null) {
tabLayout.setBackgroundColor(getInstance().appSettings.getPrimaryColor());
tabLayout.setSelectedTabIndicatorColor(getInstance().appSettings.getAccentColor());
}
}
public static void updateTextViewColor(TextView textView) {
if(textView != null) {
textView.setHighlightColor(getInstance().appSettings.getAccentColor());
textView.setLinkTextColor(getInstance().appSettings.getAccentColor());
}
}
public static void updateToolbarColor(Toolbar toolbar) {
if(toolbar != null) {
toolbar.setBackgroundColor(getInstance().appSettings.getPrimaryColor());
}
}
public static void updateActionMenuViewColor(ActionMenuView actionMenuView) {
if(actionMenuView != null) {
actionMenuView.setBackgroundColor(getInstance().appSettings.getPrimaryColor());
}
}
public static int getPrimaryColor() {
return getInstance().appSettings.getPrimaryColor();
}
public static int getAccentColor() {
return getInstance().appSettings.getAccentColor();
}
public static void setPrimaryColorAsBackground(View view) {
if(view != null) {
view.setBackgroundColor(getPrimaryColor());
}
}
public static int getPrimaryDarkColor() {
return ColorPalette.getObscuredColor(getPrimaryColor());
}
public static void updateActionBarColor(ActionBar actionBar) {
if(actionBar != null) {
actionBar.setBackgroundDrawable(new ColorDrawable(getInstance().appSettings.getPrimaryColor()));
}
}
public static void updateProgressBarColor(ProgressBar progressBar) {
if(progressBar != null && progressBar.getProgressDrawable() != null) {
progressBar.getProgressDrawable().setColorFilter(getAccentColor(), PorterDuff.Mode.SRC_IN);
}
}
}

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.webview; package com.github.dfa.diaspora_android.webview;
import android.webkit.WebView; import android.webkit.WebView;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.webview; package com.github.dfa.diaspora_android.webview;
import android.net.Uri; import android.net.Uri;

View file

@ -1,3 +1,21 @@
/*
This file is part of the Diaspora for Android.
Diaspora for Android 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.
Diaspora for Android 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 the Diaspora for Android.
If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.dfa.diaspora_android.webview; package com.github.dfa.diaspora_android.webview;
import android.view.View; import android.view.View;

View file

@ -1,5 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="@color/white"/>
</shape>
</clip>
</item>
<!-- Old progressbar
<item android:id="@android:id/background"> <item android:id="@android:id/background">
<shape> <shape>
<solid android:color="@color/colorPrimaryDark"/> <solid android:color="@color/colorPrimaryDark"/>
@ -12,4 +22,6 @@
</shape> </shape>
</clip> </clip>
</item> </item>
-->
</layer-list> </layer-list>

View file

@ -0,0 +1,13 @@
<vector android:height="24dp" android:viewportHeight="185.0"
android:viewportWidth="185.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#abcd03" android:pathData="m103.9,14.01 l-4.92,19.53c6.97,-13.79 18.03,-24.17 30.73,-33.32 -9.29,10.79 -17.75,21.58 -22.94,32.37 8.74,-12.29 20.49,-19.12 33.73,-23.63 -17.62,15.71 -31.6,32.56 -42.26,49.49l-8.47,-3.69c1.5,-13.52 6.61,-27.37 14.12,-40.75z"/>
<path android:fillColor="#fffcdb" android:pathData="m81.29,51.17 l16.12,6.69c0,4.1 -0.33,16.6 2.23,20.28 26.8,34.52 22.29,103.71 -5.43,105.49 -42.22,0 -58.32,-28.68 -58.32,-55.04 0,-24.04 28.82,-40.02 46.03,-54.22 4.37,-3.82 3.61,-12.28 -0.62,-23.2z"/>
<path android:fillColor="#7d4698" android:pathData="m97.41,57.62 l5.81,2.96c-0.55,3.82 0.27,12.29 4.1,14.48 16.94,10.52 32.91,21.99 39.2,33.46 22.4,40.43 -15.71,77.85 -48.62,74.3 17.89,-13.25 23.08,-40.43 16.39,-70.06 -2.73,-11.61 -6.97,-22.13 -14.48,-34.01 -3.25,-5.83 -2.12,-13.07 -2.39,-21.12z"/>
<path android:fillColor="#FF000000" android:pathData="m94.61,56.62 l12.02,1.64c-3.55,11.74 6.97,19.94 10.38,21.85 7.65,4.23 15.02,8.6 20.9,13.93 11.06,10.11 17.34,24.31 17.34,39.33 0,14.89 -6.83,29.23 -18.3,38.79 -10.79,9.01 -25.68,12.84 -40.15,12.84 -9.01,0 -17.07,-0.41 -25.81,-3.28 -19.94,-6.69 -34.83,-23.76 -36.06,-44.25 -1.09,-15.98 2.46,-28.13 14.89,-40.83 6.42,-6.69 19.39,-14.34 28.27,-20.49 4.37,-3.01 9.01,-11.47 0.14,-27.45l1.78,-1.37 13.16,8.81 -11.11,-4.58c0.96,1.37 3.55,7.51 4.1,9.29 1.23,5.05 0.68,9.97 -0.41,12.15 -5.6,10.11 -15.16,12.84 -22.12,18.57 -12.29,10.11 -25.68,18.16 -24.17,45.89 0.68,13.66 11.34,30.32 27.31,38.1 9.01,4.37 19.39,6.15 29.91,6.69 9.42,0.41 27.45,-5.19 37.28,-13.38 10.52,-8.74 16.39,-21.99 16.39,-35.51 0,-13.66 -5.46,-26.63 -15.71,-35.78 -5.87,-5.33 -15.57,-11.74 -21.58,-15.16 -6.01,-3.41 -13.52,-12.97 -11.06,-22.12z"/>
<path android:fillColor="#FF000000" android:pathData="m90.93,76.84c-1.23,6.28 -2.6,17.62 -8.06,21.85 -2.32,1.64 -4.64,3.28 -7.1,4.92 -9.83,6.69 -19.67,12.97 -24.17,29.09 -0.96,3.41 -0.14,7.1 0.68,10.52 2.46,9.83 9.42,20.49 14.89,26.77 0,0.27 1.09,0.96 1.09,1.23 4.51,5.33 5.87,6.83 22.94,10.65l-0.41,1.91c-10.24,-2.73 -18.71,-5.19 -24.04,-11.34 0,-0.14 -0.96,-1.09 -0.96,-1.09 -5.74,-6.56 -12.7,-17.48 -15.3,-27.72 -0.96,-4.1 -1.77,-7.24 -0.68,-11.47 4.64,-16.66 14.75,-23.22 24.99,-30.18 2.32,-1.5 5.05,-2.87 7.24,-4.64 4.23,-3.14 6.55,-12.7 8.88,-20.49z"/>
<path android:fillColor="#FF000000" android:pathData="m95.29,102.78c0.14,7.1 -0.56,10.66 1.22,15.72 1.09,3 4.78,7.1 5.88,11.06 1.5,5.33 3.14,11.2 3,14.75 0,4.1 -0.26,11.74 -2.03,19.94 -1.35,6.77 -4.47,12.58 -9.72,15.88 -5.37,-1.11 -11.68,-3 -15.41,-6.19 -7.24,-6.28 -13.65,-16.79 -14.47,-25.94 -0.68,-7.51 6.27,-18.59 15.97,-24.19 8.19,-4.78 10.1,-10.23 11.88,-18.97 -2.46,7.65 -4.77,14.06 -12.69,18.16 -11.47,6.01 -17.36,16.1 -16.81,25.66 0.82,12.29 5.74,20.62 15.44,27.31 4.1,2.87 11.75,5.9 16.53,6.72l0,-0.63c3.62,-0.68 8.32,-6.63 10.66,-14.69 2.05,-7.24 2.86,-16.5 2.72,-22.37 -0.14,-3.41 -1.64,-10.81 -4.38,-17.5 -1.5,-3.69 -3.81,-7.37 -5.31,-9.97 -1.64,-2.6 -1.65,-8.19 -2.47,-14.75z"/>
<path android:fillColor="#FF000000" android:pathData="m94.48,129.56c0.14,4.78 2.06,10.9 2.88,17.19 0.68,4.64 0.39,9.31 0.25,13.41 -0.13,4.74 -1.72,13.24 -3.88,17.38 -2.04,-0.93 -2.83,-2 -4.16,-3.72 -1.64,-2.32 -2.75,-4.64 -3.84,-7.38 -0.82,-2.05 -1.78,-4.39 -2.19,-7.13 -0.55,-4.1 -0.39,-10.51 4.25,-17.06 3.55,-5.19 4.36,-5.58 5.59,-11.59 -1.64,5.33 -2.86,5.87 -6.69,10.38 -4.23,4.92 -4.94,12.16 -4.94,18.03 0,2.46 0.98,5.19 1.94,7.78 1.09,2.73 2.03,5.45 3.53,7.5 2.26,3.32 5.15,5.21 6.56,5.56 0.01,0 0.02,-0 0.03,0 0.03,0.01 0.06,0.03 0.09,0.03l0,-0.16c2.65,-2.95 4.24,-5.89 4.78,-8.84 0.68,-3.55 0.84,-7.11 1.25,-11.34 0.41,-3.55 0.11,-8.33 -0.84,-13.25 -1.37,-6.15 -3.67,-12.41 -4.63,-16.78z"/>
<path android:fillColor="#FF000000" android:pathData="m94.89,71.1c0.14,7.1 0.68,20.35 2.6,25.54 0.55,1.77 5.6,9.56 9.15,18.98 2.46,6.56 3.01,12.56 3.41,14.34 1.64,7.78 -0.41,20.9 -3.14,33.32 -1.37,6.69 -6.01,15.02 -11.34,18.3l-1.09,1.91c3.01,-0.14 10.38,-7.38 12.97,-16.39 4.37,-15.3 6.15,-22.4 4.1,-39.33 -0.27,-1.64 -0.96,-7.24 -3.55,-13.25 -3.82,-9.15 -9.29,-17.89 -9.97,-19.67 -1.23,-2.87 -2.87,-15.3 -3.14,-23.76z"/>
<path android:fillColor="#FF000000" android:pathData="m97.45,61.39c-0.41,7.3 -0.51,9.99 0.85,15.31 1.5,5.87 9.15,14.34 12.29,24.04 6.01,18.57 4.51,42.88 0.14,61.87 -1.64,6.69 -9.42,16.39 -17.21,19.53l5.74,1.37c3.14,-0.14 11.2,-7.65 14.34,-16.25 5.05,-13.52 6.01,-29.64 3.96,-46.57 -0.14,-1.64 -2.87,-16.25 -5.46,-22.4 -3.69,-9.15 -10.24,-17.34 -10.93,-19.12 -1.23,-3.01 -3.93,-9.24 -3.72,-17.77z"/>
<path android:fillColor="#FF000000" android:pathData="M93.11,56.25h0.55v126.02h-0.55z"/>
</vector>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content" android:id="@+id/main_content"
@ -9,7 +10,7 @@
tools:context="com.github.dfa.diaspora_android.activity.AboutActivity"> tools:context="com.github.dfa.diaspora_android.activity.AboutActivity">
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:id="@+id/appbar" android:id="@+id/about__appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"> android:theme="@style/AppTheme.AppBarOverlay">

View file

@ -35,6 +35,7 @@
android:layout_height="16dp" /> android:layout_height="16dp" />
<com.github.dfa.diaspora_android.ui.HtmlTextView <com.github.dfa.diaspora_android.ui.HtmlTextView
android:id="@+id/fragment_about__about_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/fragment_about__about_content" android:text="@string/fragment_about__about_content"

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/color_picker_dialog__title_background"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/color_picker_dialog__title"
android:layout_margin="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Large.Inverse"
/>
</FrameLayout>
<uz.shift.colorpicker.LineColorPicker
android:id="@+id/color_picker_dialog__base_picker"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginTop="20dp"
android:layout_margin="10dp"
app:orientation="horizontal"/>
<uz.shift.colorpicker.LineColorPicker
android:id="@+id/color_picker_dialog__shade_picker"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="30dp"
android:layout_margin="10dp"
android:layout_marginBottom="10dp"
app:orientation="horizontal"/>
</LinearLayout>

View file

@ -8,9 +8,9 @@
tools:context=".activity.MainActivity"> tools:context=".activity.MainActivity">
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:id="@+id/main__appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"> android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/nav_drawer"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="110dp" android:layout_height="110dp"
android:gravity="bottom" android:gravity="bottom"

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/settings__appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/settings__toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/settings__fragment_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>

View file

@ -4,6 +4,9 @@ https://github.com/guardianproject/NetCipher
NEWENTRY ButterKnife NEWENTRY ButterKnife
https://jakewharton.github.io/butterknife https://jakewharton.github.io/butterknife
NEWENTRY ShiftColorPicker
https://github.com/DASAR/ShiftColorPicker
NEWENTRY Android Support Library NEWENTRY Android Support Library
https://developer.android.com/topic/libraries/support-library/index.html https://developer.android.com/topic/libraries/support-library/index.html

View file

@ -14,6 +14,13 @@
<string name="pref_title__sub_nav_slider">Navigations Slider</string> <string name="pref_title__sub_nav_slider">Navigations Slider</string>
<string name="pref_desc__sub_nav_slider">Konfiguration der Sichtbarkeit von Einträgen im Navigation-Slider</string> <string name="pref_desc__sub_nav_slider">Konfiguration der Sichtbarkeit von Einträgen im Navigation-Slider</string>
<string name="pref_cat__visibility_nav_items">Sichtbarkeit der Einträge</string> <string name="pref_cat__visibility_nav_items">Sichtbarkeit der Einträge</string>
<!-- Themes -->
<string name="pref_title__themes">Farbschema</string>
<string name="pref_desc__themes">Einstellungen des Farbdesigns</string>
<string name="pref_title__primary_color">Primärfarbe</string>
<string name="pref_desc__primary_color">Färbung der Werkzeugleisten</string>
<string name="pref_title__accent_color">Akzentfarbe</string>
<string name="pref_desc__accent_color">Färbung der Details</string>
<!-- Font size --> <!-- Font size -->
<string name="pref_title__font_size">Schriftgröße</string> <string name="pref_title__font_size">Schriftgröße</string>
<!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash --> <!-- prefix 's' is needed to make this a string array. Otherwise ListPreference would crash -->
@ -23,9 +30,9 @@
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__sub_proxy">Proxy</string> <string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_title__proxy_enabled">Aktiviere Netzwerkproxy</string> <string name="pref_title__proxy_enabled">Aktiviere Netzwerkproxy</string>
<string name="pref_desc__proxy_enabled">Nutze einen Proxyserver, um Firewalls zu umgehen</string> <string name="pref_desc__http_proxy_enabled">Nutze einen Proxyserver, um Firewalls zu umgehen</string>
<string name="pref_title__proxy_host">Host</string> <string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__proxy_port">Port</string> <string name="pref_title__http_proxy_port">Port</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Chrome Custom Tabs</string> <string name="pref_title__chrome_custom_tabs_enabled">Chrome Custom Tabs</string>
<string name="pref_desc__chrome_custom_tabs_enabled">Externe Links mit Chrome Custom Tabs öffnen. Chromium oder Google Chrome muss für dieses Feature installiert sein.\nWICHTIGER HINWEIS: Chrome Custom Tabs verwenden die konfigurierten Proxy-Server nicht!</string> <string name="pref_desc__chrome_custom_tabs_enabled">Externe Links mit Chrome Custom Tabs öffnen. Chromium oder Google Chrome muss für dieses Feature installiert sein.\nWICHTIGER HINWEIS: Chrome Custom Tabs verwenden die konfigurierten Proxy-Server nicht!</string>

View file

@ -22,9 +22,9 @@
<string name="pref_desc__load_images">Desactivar la carga de de imágenes a datos móviles seguros</string> <string name="pref_desc__load_images">Desactivar la carga de de imágenes a datos móviles seguros</string>
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__proxy_enabled">Activar Proxy</string> <string name="pref_title__proxy_enabled">Activar Proxy</string>
<string name="pref_desc__proxy_enabled">El tráfico proxificado de Diaspora para evitar firewalls.\nPuede necesitar reiniciarse</string> <string name="pref_desc__http_proxy_enabled">El tráfico proxificado de Diaspora para evitar firewalls.\nPuede necesitar reiniciarse</string>
<string name="pref_title__proxy_host">Anfitrión</string> <string name="pref_title__http_proxy_host">Anfitrión</string>
<string name="pref_title__proxy_port">Puerto</string> <string name="pref_title__http_proxy_port">Puerto</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<!-- Diaspora Settings --> <!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Configuración personal</string> <string name="pref_title__personal_settings">Configuración personal</string>

View file

@ -23,9 +23,9 @@
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__sub_proxy">Proxy</string> <string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_title__proxy_enabled">Activer Proxy</string> <string name="pref_title__proxy_enabled">Activer Proxy</string>
<string name="pref_desc__proxy_enabled">Serveur Proxy.\n(Nécessite un redémarrage)</string> <string name="pref_desc__http_proxy_enabled">Serveur Proxy.\n(Nécessite un redémarrage)</string>
<string name="pref_title__proxy_host">Hôte</string> <string name="pref_title__http_proxy_host">Hôte</string>
<string name="pref_title__proxy_port">Port</string> <string name="pref_title__http_proxy_port">Port</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Onglets personnalisés de Chrome</string> <string name="pref_title__chrome_custom_tabs_enabled">Onglets personnalisés de Chrome</string>
<!-- Diaspora Settings --> <!-- Diaspora Settings -->

View file

@ -23,9 +23,9 @@
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__sub_proxy">Proxy</string> <string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_title__proxy_enabled">Attiva proxy</string> <string name="pref_title__proxy_enabled">Attiva proxy</string>
<string name="pref_desc__proxy_enabled">Traffico del proxy di Diaspora per bypassare i firewall.\nPuò essere necessario il riavvio dell\'app</string> <string name="pref_desc__http_proxy_enabled">Traffico del proxy di Diaspora per bypassare i firewall.\nPuò essere necessario il riavvio dell\'app</string>
<string name="pref_title__proxy_host">Host</string> <string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__proxy_port">Porta</string> <string name="pref_title__http_proxy_port">Porta</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Schede personalizzate di Chrome</string> <string name="pref_title__chrome_custom_tabs_enabled">Schede personalizzate di Chrome</string>
<!-- Diaspora Settings --> <!-- Diaspora Settings -->

View file

@ -23,9 +23,9 @@
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__sub_proxy">プロキシ</string> <string name="pref_title__sub_proxy">プロキシ</string>
<string name="pref_title__proxy_enabled">プロキシを有効にする</string> <string name="pref_title__proxy_enabled">プロキシを有効にする</string>
<string name="pref_desc__proxy_enabled">Diaspora の通信をプロキシして、ファイアウォールに回避します。\n再起動が必要になることがあります</string> <string name="pref_desc__http_proxy_enabled">Diaspora の通信をプロキシして、ファイアウォールに回避します。\n再起動が必要になることがあります</string>
<string name="pref_title__proxy_host">ホスト</string> <string name="pref_title__http_proxy_host">ホスト</string>
<string name="pref_title__proxy_port">ポート</string> <string name="pref_title__http_proxy_port">ポート</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<string name="pref_title__chrome_custom_tabs_enabled">Chrome カスタムタブ</string> <string name="pref_title__chrome_custom_tabs_enabled">Chrome カスタムタブ</string>
<!-- Diaspora Settings --> <!-- Diaspora Settings -->

View file

@ -22,9 +22,9 @@
<string name="pref_desc__load_images">മൊബൈൽ ഡാറ്റ ഉപഭോഗം കുറയ്ക്കാനായി ചിത്രങ്ങൾ ലോഡ് ചെയ്യാതിരിക്കുക</string> <string name="pref_desc__load_images">മൊബൈൽ ഡാറ്റ ഉപഭോഗം കുറയ്ക്കാനായി ചിത്രങ്ങൾ ലോഡ് ചെയ്യാതിരിക്കുക</string>
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__proxy_enabled">പ്രോക്സി അനുവദിക്കൂ</string> <string name="pref_title__proxy_enabled">പ്രോക്സി അനുവദിക്കൂ</string>
<string name="pref_desc__proxy_enabled">ഫയർവാളുകളെ മറികടക്കാൻ ഡയസ്പോറ ട്രാഫിക് പ്രോക്സി ചെയ്യൂ.\nപുനരാരഭിക്കേണ്ടി വന്നേക്കാം</string> <string name="pref_desc__http_proxy_enabled">ഫയർവാളുകളെ മറികടക്കാൻ ഡയസ്പോറ ട്രാഫിക് പ്രോക്സി ചെയ്യൂ.\nപുനരാരഭിക്കേണ്ടി വന്നേക്കാം</string>
<string name="pref_title__proxy_host">ആഥിതേയൻ</string> <string name="pref_title__http_proxy_host">ആഥിതേയൻ</string>
<string name="pref_title__proxy_port">പോർട്ട്</string> <string name="pref_title__http_proxy_port">പോർട്ട്</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<!-- Diaspora Settings --> <!-- Diaspora Settings -->
<string name="pref_title__personal_settings">സ്വകാര്യ സജ്ജീകരണങ്ങൾ</string> <string name="pref_title__personal_settings">സ്വകാര്യ സജ്ജീകരണങ്ങൾ</string>

View file

@ -21,9 +21,9 @@
<string name="pref_desc__load_images">Afbeelding laden uitschakelen om mobiele data te besparen</string> <string name="pref_desc__load_images">Afbeelding laden uitschakelen om mobiele data te besparen</string>
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__proxy_enabled">Proxy inschakelen</string> <string name="pref_title__proxy_enabled">Proxy inschakelen</string>
<string name="pref_desc__proxy_enabled">Gebruik een Proxy voor Diaspora om de firewalls te omzeilen.\nRestart nodig</string> <string name="pref_desc__http_proxy_enabled">Gebruik een Proxy voor Diaspora om de firewalls te omzeilen.\nRestart nodig</string>
<string name="pref_title__proxy_host">Host</string> <string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__proxy_port">Poort</string> <string name="pref_title__http_proxy_port">Poort</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<!-- Diaspora Settings --> <!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Persoonlijke instellingen</string> <string name="pref_title__personal_settings">Persoonlijke instellingen</string>

View file

@ -22,9 +22,9 @@
<string name="pref_desc__load_images">Desabilitar o carregamento de imagens para economizar seus créditos</string> <string name="pref_desc__load_images">Desabilitar o carregamento de imagens para economizar seus créditos</string>
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__proxy_enabled">Habilitar o Proxy</string> <string name="pref_title__proxy_enabled">Habilitar o Proxy</string>
<string name="pref_desc__proxy_enabled">Usar proxy para o tráfego da diáspora para contornar firewalls.\nPode requerer reinicialização</string> <string name="pref_desc__http_proxy_enabled">Usar proxy para o tráfego da diáspora para contornar firewalls.\nPode requerer reinicialização</string>
<string name="pref_title__proxy_host">Servidor</string> <string name="pref_title__http_proxy_host">Servidor</string>
<string name="pref_title__proxy_port">Porta</string> <string name="pref_title__http_proxy_port">Porta</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<!-- Diaspora Settings --> <!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Configurações pessoais</string> <string name="pref_title__personal_settings">Configurações pessoais</string>

View file

@ -22,9 +22,9 @@
<string name="pref_desc__load_images">Отключить загрузку изображений для экономии траффика</string> <string name="pref_desc__load_images">Отключить загрузку изображений для экономии траффика</string>
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__proxy_enabled">Использовать прокси</string> <string name="pref_title__proxy_enabled">Использовать прокси</string>
<string name="pref_desc__proxy_enabled">Перенаправить трафик Диаспоры в обход брандмауэров.\nМожет потребовать перезапуска</string> <string name="pref_desc__http_proxy_enabled">Перенаправить трафик Диаспоры в обход брандмауэров.\nМожет потребовать перезапуска</string>
<string name="pref_title__proxy_host">Хост</string> <string name="pref_title__http_proxy_host">Хост</string>
<string name="pref_title__proxy_port">Порт</string> <string name="pref_title__http_proxy_port">Порт</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->
<!-- Diaspora Settings --> <!-- Diaspora Settings -->
<string name="pref_title__personal_settings">Личные настройки</string> <string name="pref_title__personal_settings">Личные настройки</string>

View file

@ -1,6 +1,6 @@
<resources>> <resources>>
<style name="AppTheme.NoActionBar"> <style name="DiasporaLight.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item>

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">@color/primary</color> <color name="colorPrimary">@color/md_blue_650</color>
<color name="colorPrimaryDark">@color/primary_dark</color> <color name="colorPrimaryDark">@color/md_blue_750</color>
<color name="colorAccent">@color/accent</color> <color name="colorAccent">@color/md_deep_orange_650</color>
<!-- Colors from Palette --> <!-- Colors from Palette -->
<color name="primary">#207be6</color> <color name="primary">@color/md_blue_650</color>
<color name="primary_dark">#195ed2</color> <color name="primary_dark">@color/md_blue_750</color>
<color name="accent">@color/md_deep_orange_650</color>
<color name="primary_light">#BBDEFB</color> <color name="primary_light">#BBDEFB</color>
<color name="accent">#FF5300</color>
<color name="primary_text">#212121</color> <color name="primary_text">#212121</color>
<color name="secondary_text">#727272</color> <color name="secondary_text">#727272</color>
<color name="icons">#FFFFFF</color> <color name="icons">#FFFFFF</color>
@ -17,4 +17,331 @@
<color name="white">#ffffff</color> <color name="white">#ffffff</color>
<color name="black">#000000</color> <color name="black">#000000</color>
<!-- Taken from org.horaapps.leafpic -->
<!--Accent Color Collection-->
<color name="accent_red">#f44336</color>
<color name="accent_pink">#e91e63</color>
<color name="accent_purple">#9c27b0</color>
<color name="accent_deep_purple">#673ab7</color>
<color name="accent_indago">#3f51b5</color>
<color name="accent_blue">#2196f3</color>
<color name="accent_cyan">#00bcd4</color>
<color name="accent_teal">#009688</color>
<color name="accent_green">#4caf50</color>
<color name="accent_yellow">#ffeb3b</color>
<color name="accent_amber">#ffc107</color>
<color name="accent_orange">#ff9800</color>
<color name="accent_brown">#795548</color>
<color name="accent_white">#FFFFFF</color>
<color name="accent_grey">#9e9e9e</color>
<color name="accent_black">#000000</color>
<!--MATERIAL COLORS-->
<color name="md_black_1000">#000000</color>
<color name="md_light_primary_icon">#8A000000</color>
<color name="md_light_primary_text">#DE000000</color>
<color name="md_light_secondary">#8A000000</color>
<color name="md_light_statusbar">@color/md_grey_300</color>
<color name="md_light_appbar">@color/md_grey_100</color>
<color name="md_light_background">@color/md_grey_200</color>
<color name="md_light_cards">@color/md_white_1000</color>
<color name="md_light_dialogs">@color/md_white_1000</color>
<color name="md_light_disabled">#61000000</color>
<color name="md_light_dividers">#1F000000</color>
<color name="md_dark_appbar">@color/md_grey_900</color>
<color name="md_dark_background">@color/md_grey_850</color>
<color name="md_dark_cards">@color/md_grey_800</color>
<color name="md_dark_dialogs">@color/md_grey_800</color>
<color name="md_dark_disabled">#4DFFFFFF</color>
<color name="md_dark_dividers">#1FFFFFFF</color>
<color name="md_dark_primary_icon">#B3FFFFFF</color>
<color name="md_dark_primary_text">#FFFFFFFF</color>
<color name="md_dark_secondary">#B3FFFFFF</color>
<color name="md_dark_statusbar">@color/md_black_1000</color>
<!--ALL COLOURS-->
<color name="md_amber_100">#FFECB3</color>
<color name="md_amber_200">#FFE082</color>
<color name="md_amber_300">#FFD54F</color>
<color name="md_amber_400">#FFCA28</color>
<color name="md_amber_50">#FFF8E1</color>
<color name="md_amber_500">#FFC107</color>
<color name="md_amber_600">#FFB300</color>
<color name="md_amber_700">#FFA000</color>
<color name="md_amber_800">#FF8F00</color>
<color name="md_amber_900">#FF6F00</color>
<color name="md_amber_A100">#FFE57F</color>
<color name="md_amber_A200">#FFD740</color>
<color name="md_amber_A400">#FFC400</color>
<color name="md_amber_A700">#FFAB00</color>
<color name="md_blue_100">#BBDEFB</color>
<color name="md_blue_200">#90CAF9</color>
<color name="md_blue_300">#64B5F6</color>
<color name="md_blue_400">#42A5F5</color>
<color name="md_blue_50">#E3F2FD</color>
<color name="md_blue_500">#2196F3</color>
<color name="md_blue_600">#1E88E5</color>
<color name="md_blue_650">#207be6</color>
<color name="md_blue_700">#1976D2</color>
<color name="md_blue_750">#195ed2</color>
<color name="md_blue_800">#1565C0</color>
<color name="md_blue_900">#0D47A1</color>
<color name="md_blue_A100">#82B1FF</color>
<color name="md_blue_A200">#448AFF</color>
<color name="md_blue_A400">#2979FF</color>
<color name="md_blue_A700">#2962FF</color>
<color name="md_blue_grey_100">#CFD8DC</color>
<color name="md_blue_grey_200">#B0BEC5</color>
<color name="md_blue_grey_300">#90A4AE</color>
<color name="md_blue_grey_400">#78909C</color>
<color name="md_blue_grey_50">#ECEFF1</color>
<color name="md_blue_grey_500">#607D8B</color>
<color name="md_blue_grey_600">#546E7A</color>
<color name="md_blue_grey_700">#455A64</color>
<color name="md_blue_grey_800">#37474F</color>
<color name="md_blue_grey_900">#263238</color>
<color name="md_brown_100">#D7CCC8</color>
<color name="md_brown_200">#BCAAA4</color>
<color name="md_brown_300">#A1887F</color>
<color name="md_brown_400">#8D6E63</color>
<color name="md_brown_50">#EFEBE9</color>
<color name="md_brown_500">#795548</color>
<color name="md_brown_600">#6D4C41</color>
<color name="md_brown_700">#5D4037</color>
<color name="md_brown_800">#4E342E</color>
<color name="md_brown_900">#3E2723</color>
<color name="md_cyan_100">#B2EBF2</color>
<color name="md_cyan_200">#80DEEA</color>
<color name="md_cyan_300">#4DD0E1</color>
<color name="md_cyan_400">#26C6DA</color>
<color name="md_cyan_50">#E0F7FA</color>
<color name="md_cyan_500">#00BCD4</color>
<color name="md_cyan_600">#00ACC1</color>
<color name="md_cyan_700">#0097A7</color>
<color name="md_cyan_800">#00838F</color>
<color name="md_cyan_900">#006064</color>
<color name="md_cyan_A100">#84FFFF</color>
<color name="md_cyan_A200">#18FFFF</color>
<color name="md_cyan_A400">#00E5FF</color>
<color name="md_cyan_A700">#00B8D4</color>
<color name="md_deep_orange_100">#FFCCBC</color>
<color name="md_deep_orange_200">#FFAB91</color>
<color name="md_deep_orange_300">#FF8A65</color>
<color name="md_deep_orange_400">#FF7043</color>
<color name="md_deep_orange_50">#FBE9E7</color>
<color name="md_deep_orange_500">#FF5722</color>
<color name="md_deep_orange_600">#F4511E</color>
<color name="md_deep_orange_650">#FF5300</color>
<color name="md_deep_orange_700">#E64A19</color>
<color name="md_deep_orange_800">#D84315</color>
<color name="md_deep_orange_900">#BF360C</color>
<color name="md_deep_orange_A100">#FF9E80</color>
<color name="md_deep_orange_A200">#FF6E40</color>
<color name="md_deep_orange_A400">#FF3D00</color>
<color name="md_deep_orange_A700">#DD2C00</color>
<color name="md_deep_purple_100">#D1C4E9</color>
<color name="md_deep_purple_200">#B39DDB</color>
<color name="md_deep_purple_300">#9575CD</color>
<color name="md_deep_purple_400">#7E57C2</color>
<color name="md_deep_purple_50">#EDE7F6</color>
<color name="md_deep_purple_500">#673AB7</color>
<color name="md_deep_purple_600">#5E35B1</color>
<color name="md_deep_purple_700">#512DA8</color>
<color name="md_deep_purple_800">#4527A0</color>
<color name="md_deep_purple_900">#311B92</color>
<color name="md_deep_purple_A100">#B388FF</color>
<color name="md_deep_purple_A200">#7C4DFF</color>
<color name="md_deep_purple_A400">#651FFF</color>
<color name="md_deep_purple_A700">#6200EA</color>
<color name="md_green_100">#C8E6C9</color>
<color name="md_green_200">#A5D6A7</color>
<color name="md_green_300">#81C784</color>
<color name="md_green_400">#66BB6A</color>
<color name="md_green_50">#E8F5E9</color>
<color name="md_green_500">#4CAF50</color>
<color name="md_green_600">#43A047</color>
<color name="md_green_700">#388E3C</color>
<color name="md_green_800">#2E7D32</color>
<color name="md_green_900">#1B5E20</color>
<color name="md_green_A100">#B9F6CA</color>
<color name="md_green_A200">#69F0AE</color>
<color name="md_green_A400">#00E676</color>
<color name="md_green_A700">#00C853</color>
<color name="md_grey_100">#F5F5F5</color>
<color name="md_grey_200">#EEEEEE</color>
<color name="md_grey_300">#E0E0E0</color>
<color name="md_grey_400">#BDBDBD</color>
<color name="md_grey_50">#FAFAFA</color>
<color name="md_grey_500">#9E9E9E</color>
<color name="md_grey_600">#757575</color>
<color name="md_grey_700">#616161</color>
<color name="md_grey_800">#424242</color>
<color name="md_grey_850">#303030</color>
<color name="md_grey_900">#212121</color>
<color name="md_indigo_100">#C5CAE9</color>
<color name="md_indigo_200">#9FA8DA</color>
<color name="md_indigo_300">#7986CB</color>
<color name="md_indigo_400">#5C6BC0</color>
<color name="md_indigo_50">#E8EAF6</color>
<color name="md_indigo_500">#3F51B5</color>
<color name="md_indigo_600">#3949AB</color>
<color name="md_indigo_700">#303F9F</color>
<color name="md_indigo_800">#283593</color>
<color name="md_indigo_900">#1A237E</color>
<color name="md_indigo_A100">#8C9EFF</color>
<color name="md_indigo_A200">#536DFE</color>
<color name="md_indigo_A400">#3D5AFE</color>
<color name="md_indigo_A700">#304FFE</color>
<color name="md_light_blue_100">#B3E5FC</color>
<color name="md_light_blue_200">#81D4FA</color>
<color name="md_light_blue_300">#4FC3F7</color>
<color name="md_light_blue_400">#29B6F6</color>
<color name="md_light_blue_50">#E1F5FE</color>
<color name="md_light_blue_500">#03A9F4</color>
<color name="md_light_blue_600">#039BE5</color>
<color name="md_light_blue_700">#0288D1</color>
<color name="md_light_blue_800">#0277BD</color>
<color name="md_light_blue_900">#01579B</color>
<color name="md_light_blue_A100">#80D8FF</color>
<color name="md_light_blue_A200">#40C4FF</color>
<color name="md_light_blue_A400">#00B0FF</color>
<color name="md_light_blue_A700">#0091EA</color>
<color name="md_light_green_100">#DCEDC8</color>
<color name="md_light_green_200">#C5E1A5</color>
<color name="md_light_green_300">#AED581</color>
<color name="md_light_green_400">#9CCC65</color>
<color name="md_light_green_50">#F1F8E9</color>
<color name="md_light_green_500">#8BC34A</color>
<color name="md_light_green_600">#7CB342</color>
<color name="md_light_green_700">#689F38</color>
<color name="md_light_green_800">#558B2F</color>
<color name="md_light_green_900">#33691E</color>
<color name="md_light_green_A100">#CCFF90</color>
<color name="md_light_green_A200">#B2FF59</color>
<color name="md_light_green_A400">#76FF03</color>
<color name="md_light_green_A700">#64DD17</color>
<color name="md_lime_100">#F0F4C3</color>
<color name="md_lime_200">#E6EE9C</color>
<color name="md_lime_300">#DCE775</color>
<color name="md_lime_400">#D4E157</color>
<color name="md_lime_50">#F9FBE7</color>
<color name="md_lime_500">#CDDC39</color>
<color name="md_lime_600">#C0CA33</color>
<color name="md_lime_700">#AFB42B</color>
<color name="md_lime_800">#9E9D24</color>
<color name="md_lime_900">#827717</color>
<color name="md_lime_A100">#F4FF81</color>
<color name="md_lime_A200">#EEFF41</color>
<color name="md_lime_A400">#C6FF00</color>
<color name="md_lime_A700">#AEEA00</color>
<color name="md_orange_100">#FFE0B2</color>
<color name="md_orange_200">#FFCC80</color>
<color name="md_orange_300">#FFB74D</color>
<color name="md_orange_400">#FFA726</color>
<color name="md_orange_50">#FFF3E0</color>
<color name="md_orange_500">#FF9800</color>
<color name="md_orange_600">#FB8C00</color>
<color name="md_orange_700">#F57C00</color>
<color name="md_orange_800">#EF6C00</color>
<color name="md_orange_900">#E65100</color>
<color name="md_orange_A100">#FFD180</color>
<color name="md_orange_A200">#FFAB40</color>
<color name="md_orange_A400">#FF9100</color>
<color name="md_orange_A700">#FF6D00</color>
<color name="md_pink_100">#F8BBD0</color>
<color name="md_pink_200">#F48FB1</color>
<color name="md_pink_300">#F06292</color>
<color name="md_pink_400">#EC407A</color>
<color name="md_pink_50">#FCE4EC</color>
<color name="md_pink_500">#E91E63</color>
<color name="md_pink_600">#D81B60</color>
<color name="md_pink_700">#C2185B</color>
<color name="md_pink_800">#AD1457</color>
<color name="md_pink_900">#880E4F</color>
<color name="md_pink_A100">#FF80AB</color>
<color name="md_pink_A200">#FF4081</color>
<color name="md_pink_A400">#F50057</color>
<color name="md_pink_A700">#C51162</color>
<color name="md_purple_100">#E1BEE7</color>
<color name="md_purple_200">#CE93D8</color>
<color name="md_purple_300">#BA68C8</color>
<color name="md_purple_400">#AB47BC</color>
<color name="md_purple_50">#F3E5F5</color>
<color name="md_purple_500">#9C27B0</color>
<color name="md_purple_600">#8E24AA</color>
<color name="md_purple_700">#7B1FA2</color>
<color name="md_purple_800">#6A1B9A</color>
<color name="md_purple_900">#4A148C</color>
<color name="md_purple_A100">#EA80FC</color>
<color name="md_purple_A200">#E040FB</color>
<color name="md_purple_A400">#D500F9</color>
<color name="md_purple_A700">#AA00FF</color>
<color name="md_red_100">#FFCDD2</color>
<color name="md_red_200">#EF9A9A</color>
<color name="md_red_300">#E57373</color>
<color name="md_red_400">#EF5350</color>
<color name="md_red_50">#FFEBEE</color>
<color name="md_red_500">#F44336</color>
<color name="md_red_600">#E53935</color>
<color name="md_red_700">#D32F2F</color>
<color name="md_red_800">#C62828</color>
<color name="md_red_900">#B71C1C</color>
<color name="md_red_A100">#FF8A80</color>
<color name="md_red_A200">#FF5252</color>
<color name="md_red_A400">#FF1744</color>
<color name="md_red_A700">#D50000</color>
<color name="md_teal_100">#B2DFDB</color>
<color name="md_teal_200">#80CBC4</color>
<color name="md_teal_300">#4DB6AC</color>
<color name="md_teal_400">#26A69A</color>
<color name="md_teal_50">#E0F2F1</color>
<color name="md_teal_500">#009688</color>
<color name="md_teal_600">#00897B</color>
<color name="md_teal_700">#00796B</color>
<color name="md_teal_800">#00695C</color>
<color name="md_teal_900">#004D40</color>
<color name="md_teal_A100">#A7FFEB</color>
<color name="md_teal_A200">#64FFDA</color>
<color name="md_teal_A400">#1DE9B6</color>
<color name="md_teal_A700">#00BFA5</color>
<color name="md_white_1000">#FFFFFF</color>
<color name="md_yellow_100">#FFF9C4</color>
<color name="md_yellow_200">#FFF59D</color>
<color name="md_yellow_300">#FFF176</color>
<color name="md_yellow_400">#FFEE58</color>
<color name="md_yellow_50">#FFFDE7</color>
<color name="md_yellow_500">#FFEB3B</color>
<color name="md_yellow_600">#FDD835</color>
<color name="md_yellow_700">#FBC02D</color>
<color name="md_yellow_800">#F9A825</color>
<color name="md_yellow_900">#F57F17</color>
<color name="md_yellow_A100">#FFFF8D</color>
<color name="md_yellow_A200">#FFFF00</color>
<color name="md_yellow_A400">#FFEA00</color>
<color name="md_yellow_A700">#FFD600</color>
<color name="transparent_black">#c4000000</color>
</resources> </resources>

View file

@ -15,11 +15,20 @@
<string name="pref_key__load_images" translatable="false">pref_key_load_images</string> <string name="pref_key__load_images" translatable="false">pref_key_load_images</string>
<string name="pref_key__clear_cache" translatable="false">pref_key_clear_cache</string> <string name="pref_key__clear_cache" translatable="false">pref_key_clear_cache</string>
<string name="pref_key__chrome_custom_tabs_enabled" translatable="false">pref_key__chrome_custom_tabs_enabled</string> <string name="pref_key__chrome_custom_tabs_enabled" translatable="false">pref_key__chrome_custom_tabs_enabled</string>
<string name="pref_key__http_proxy_load_tor_preset">pref_key__http_proxy_load_tor_preset</string>
<!-- Themes -->
<string name="pref_key__primary_color__preference_click" translatable="false">pref_key_primary_color</string>
<string name="pref_key__primary_color_base" translatable="false">pref_key_primary_color_base</string>
<string name="pref_key__primary_color_shade" translatable="false">pref_key_primary_color_shade</string>
<string name="pref_key__accent_color__preference_click" translatable="false">pref_key_accent_color</string>
<string name="pref_key__accent_color_base" translatable="false">pref_key_accent_color_base</string>
<string name="pref_key__accent_color_shade" translatable="false">pref_key_accent_color_shade</string>
<string name="pref_key__append_shared_via_app" translatable="false">pref_key_append_shared_via_app</string> <string name="pref_key__append_shared_via_app" translatable="false">pref_key_append_shared_via_app</string>
<string name="pref_key__proxy_enabled" translatable="false">pref_key_proxy_enabled</string> <string name="pref_key__http_proxy_enabled" translatable="false">pref_key_proxy_enabled</string>
<string name="pref_key__proxy_host" translatable="false">pref_key_proxy_host</string> <string name="pref_key__http_proxy_host" translatable="false">pref_key_proxy_host</string>
<string name="pref_key__proxy_port" translatable="false">pref_key_proxy_port</string> <string name="pref_key__http_proxy_port" translatable="false">pref_key_proxy_port</string>
<string name="pref_key__proxy_was_enabled" translatable="false">wasProxyEnabled</string> <string name="pref_key__proxy_was_enabled" translatable="false">wasProxyEnabled</string>
<!-- Navigiation Slider --> <!-- Navigiation Slider -->
@ -61,6 +70,13 @@
<string name="pref_desc__sub_nav_slider">Control visibility of entries in the navigation drawer</string> <string name="pref_desc__sub_nav_slider">Control visibility of entries in the navigation drawer</string>
<string name="pref_cat__visibility_nav_items">Item visibility</string> <string name="pref_cat__visibility_nav_items">Item visibility</string>
<!-- Themes -->
<string name="pref_title__themes">Theme and Colors</string>
<string name="pref_desc__themes">Control, which colors are used throughout the app</string>
<string name="pref_title__primary_color">Primary Color</string>
<string name="pref_desc__primary_color">Color of the toolbars</string>
<string name="pref_title__accent_color">Accent Color</string>
<string name="pref_desc__accent_color">Color of the progressbar</string>
<!-- Font size --> <!-- Font size -->
<string name="pref_title__font_size">Font size</string> <string name="pref_title__font_size">Font size</string>
@ -81,12 +97,16 @@
<string name="pref_desc__load_images">Disable image loading to safe mobile data</string> <string name="pref_desc__load_images">Disable image loading to safe mobile data</string>
<!-- Proxy --> <!-- Proxy -->
<string name="pref_title__http_proxy_load_tor_preset">Load Tor Preset</string>
<string name="pref_desc__http_proxy_load_tor_preset">Load proxy settings for Tor (Orbot) HTTP Proxy</string>
<string name="pref_title__sub_proxy">Proxy</string> <string name="pref_title__sub_proxy">Proxy</string>
<string name="pref_desc__sub_proxy" translatable="false">@string/pref_desc__proxy_enabled</string> <string name="pref_desc__sub_proxy" translatable="false">@string/pref_desc__http_proxy_enabled</string>
<string name="pref_title__proxy_enabled">Enable Proxy</string> <string name="pref_title__proxy_enabled">Enable Proxy</string>
<string name="pref_desc__proxy_enabled">Proxy Diaspora\'s traffic to circumvent firewalls.\nMay require restart</string> <string name="pref_desc__http_proxy_enabled">Proxy Diaspora\'s traffic to circumvent firewalls.\nMay require restart</string>
<string name="pref_title__proxy_host">Host</string> <string name="pref_title__http_proxy_host">Host</string>
<string name="pref_title__proxy_port">Port</string> <string name="pref_title__http_proxy_port">Port</string>
<string name="HTTP" translatable="false">HTTP</string>
<string name="SOCKS5" translatable="false">SOCKS5</string>
<!-- Chrome custom tabs --> <!-- Chrome custom tabs -->

View file

@ -1,7 +1,7 @@
<resources> <resources>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <style name="DiasporaLight" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
@ -9,11 +9,14 @@
<item name="actionMenuTextColor">@color/colorAccent</item> <item name="actionMenuTextColor">@color/colorAccent</item>
</style> </style>
<style name="AppTheme.NoActionBar"> <style name="DiasporaLight.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style> </style>
<style name="Settings" parent="Theme.AppCompat.Light.DarkActionBar">
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

View file

@ -57,6 +57,22 @@
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen
android:title="@string/pref_title__themes"
android:summary="@string/pref_desc__themes" >
<Preference
android:key="@string/pref_key__primary_color__preference_click"
android:summary="@string/pref_desc__primary_color"
android:title="@string/pref_title__primary_color" />
<Preference
android:key="@string/pref_key__accent_color__preference_click"
android:summary="@string/pref_desc__accent_color"
android:title="@string/pref_title__accent_color" />
</PreferenceScreen>
<ListPreference <ListPreference
android:dialogTitle="@string/pref_title__font_size" android:dialogTitle="@string/pref_title__font_size"
android:entries="@array/pref_entries__font_size" android:entries="@array/pref_entries__font_size"
@ -129,21 +145,34 @@
<PreferenceScreen <PreferenceScreen
android:summary="@string/pref_desc__sub_proxy" android:summary="@string/pref_desc__sub_proxy"
android:title="@string/pref_title__sub_proxy"> android:title="@string/pref_title__sub_proxy">
<CheckBoxPreference
android:defaultValue="false" <PreferenceCategory
android:key="@string/pref_key__proxy_enabled" android:title="@string/HTTP">
android:summary="@string/pref_desc__proxy_enabled" <CheckBoxPreference
android:title="@string/pref_title__proxy_enabled"/> android:defaultValue="false"
<EditTextPreference android:key="@string/pref_key__http_proxy_enabled"
android:dependency="@string/pref_key__proxy_enabled" android:summary="@string/pref_desc__http_proxy_enabled"
android:inputType="textNoSuggestions" android:title="@string/pref_title__proxy_enabled"/>
android:key="@string/pref_key__proxy_host"
android:title="@string/pref_title__proxy_host"/> <EditTextPreference
<EditTextPreference android:dependency="@string/pref_key__http_proxy_enabled"
android:dependency="@string/pref_key__proxy_enabled" android:inputType="textNoSuggestions"
android:inputType="number" android:key="@string/pref_key__http_proxy_host"
android:key="@string/pref_key__proxy_port" android:title="@string/pref_title__http_proxy_host"/>
android:title="@string/pref_title__proxy_port"/> <EditTextPreference
android:dependency="@string/pref_key__http_proxy_enabled"
android:inputType="number"
android:key="@string/pref_key__http_proxy_port"
android:title="@string/pref_title__http_proxy_port"/>
<Preference
android:icon="@drawable/tor_onion"
android:dependency="@string/pref_key__http_proxy_enabled"
android:key="@string/pref_key__http_proxy_load_tor_preset"
android:summary="@string/pref_desc__http_proxy_load_tor_preset"
android:title="@string/pref_title__http_proxy_load_tor_preset"/>
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
</PreferenceCategory> </PreferenceCategory>
@ -164,8 +193,6 @@
android:defaultValue="true" android:defaultValue="true"
android:key="@string/pref_key__logging_spam_enabled" android:key="@string/pref_key__logging_spam_enabled"
android:title="@string/pref_title__logging_spam_enabled"/> android:title="@string/pref_title__logging_spam_enabled"/>
</PreferenceScreen> </PreferenceScreen>
</PreferenceCategory> </PreferenceCategory>