diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dc1fe292..4b386bcf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,7 +19,7 @@ @@ -30,7 +30,7 @@ @@ -41,7 +41,7 @@ - - - @@ -79,10 +72,10 @@ android:value="com.limelight.Connection" /> diff --git a/app/src/main/java/com/limelight/AdvancedSettings.java b/app/src/main/java/com/limelight/AdvancedSettings.java deleted file mode 100644 index 2f493014..00000000 --- a/app/src/main/java/com/limelight/AdvancedSettings.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.limelight; - -import com.limelight.utils.Dialog; - -import android.app.Activity; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; -import android.widget.TextView; - -public class AdvancedSettings extends Activity { - private SharedPreferences prefs; - private SeekBar bitrateSlider; - private TextView bitrateLabel; - - private static final int BITRATE_FLOOR = 1; - private static final int BITRATE_CEILING = 100; - - @Override - public void onPause() { - SharedPreferences.Editor editor = prefs.edit(); - - editor.putInt(Game.BITRATE_PREF_STRING, bitrateSlider.getProgress()); - editor.apply(); - - super.onPause(); - } - - @Override - protected void onStop() { - super.onStop(); - - Dialog.closeDialogs(); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_advanced_settings); - - this.bitrateLabel = (TextView) findViewById(R.id.bitrateLabel); - this.bitrateSlider = (SeekBar) findViewById(R.id.bitrateSeekBar); - - prefs = getSharedPreferences(Game.PREFS_FILE_NAME, Context.MODE_MULTI_PROCESS); - - bitrateSlider.setMax(BITRATE_CEILING); - bitrateSlider.setProgress(prefs.getInt(Game.BITRATE_PREF_STRING, Game.DEFAULT_BITRATE)); - updateBitrateLabel(); - - this.bitrateSlider.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, - boolean fromUser) { - - // Verify the user's selection - if (fromUser) { - if (progress < BITRATE_FLOOR) { - seekBar.setProgress(BITRATE_FLOOR); - return; - } - } - - updateBitrateLabel(); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - } - - private void updateBitrateLabel() { - bitrateLabel.setText("Max Bitrate: "+bitrateSlider.getProgress()+" Mbps"); - } -} diff --git a/app/src/main/java/com/limelight/PcView.java b/app/src/main/java/com/limelight/PcView.java index d3ac2728..4717595a 100644 --- a/app/src/main/java/com/limelight/PcView.java +++ b/app/src/main/java/com/limelight/PcView.java @@ -14,7 +14,8 @@ import com.limelight.nvstream.http.NvHTTP; import com.limelight.nvstream.http.PairingManager; import com.limelight.nvstream.http.PairingManager.PairState; import com.limelight.nvstream.wol.WakeOnLanSender; -import com.limelight.R; +import com.limelight.preferences.AddComputerManually; +import com.limelight.preferences.StreamSettings; import com.limelight.utils.Dialog; import android.app.Activity; diff --git a/app/src/main/java/com/limelight/AddComputerManually.java b/app/src/main/java/com/limelight/preferences/AddComputerManually.java similarity index 99% rename from app/src/main/java/com/limelight/AddComputerManually.java rename to app/src/main/java/com/limelight/preferences/AddComputerManually.java index e82e1d16..2a9f517a 100644 --- a/app/src/main/java/com/limelight/AddComputerManually.java +++ b/app/src/main/java/com/limelight/preferences/AddComputerManually.java @@ -1,4 +1,4 @@ -package com.limelight; +package com.limelight.preferences; import java.net.InetAddress; import java.net.UnknownHostException; diff --git a/app/src/main/java/com/limelight/preferences/SeekBarPreference.java b/app/src/main/java/com/limelight/preferences/SeekBarPreference.java new file mode 100644 index 00000000..00ff1f32 --- /dev/null +++ b/app/src/main/java/com/limelight/preferences/SeekBarPreference.java @@ -0,0 +1,159 @@ +package com.limelight.preferences; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Bundle; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +// Based on a Stack Overflow example: http://stackoverflow.com/questions/1974193/slider-on-my-preferencescreen +public class SeekBarPreference extends DialogPreference +{ + private static final String SCHEMA_URL = "http://schemas.android.com/apk/res/android"; + + private SeekBar seekBar; + private TextView splashText, valueText; + private Context context; + + private String dialogMessage, suffix; + private int defaultValue, maxValue, currentValue; + + public SeekBarPreference(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + + // Read the message from XML + int dialogMessageId = attrs.getAttributeResourceValue(SCHEMA_URL, "dialogMessage", 0); + if (dialogMessageId == 0) { + dialogMessage = attrs.getAttributeValue(SCHEMA_URL, "dialogMessage"); + } + else { + dialogMessage = context.getString(dialogMessageId); + } + + // Get the suffix for the number displayed in the dialog + int suffixId = attrs.getAttributeResourceValue(SCHEMA_URL, "text", 0); + if (suffixId == 0) { + suffix = attrs.getAttributeValue(SCHEMA_URL, "text"); + } + else { + suffix = context.getString(suffixId); + } + + // Get default and max seekbar values + defaultValue = attrs.getAttributeIntValue(SCHEMA_URL, "defaultValue", 0); + maxValue = attrs.getAttributeIntValue(SCHEMA_URL, "max", 100); + } + + @Override + protected View onCreateDialogView() { + + LinearLayout.LayoutParams params; + LinearLayout layout = new LinearLayout(context); + layout.setOrientation(LinearLayout.VERTICAL); + layout.setPadding(6, 6, 6, 6); + + splashText = new TextView(context); + splashText.setPadding(30, 10, 30, 10); + if (dialogMessage != null) { + splashText.setText(dialogMessage); + } + layout.addView(splashText); + + valueText = new TextView(context); + valueText.setGravity(Gravity.CENTER_HORIZONTAL); + valueText.setTextSize(32); + params = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.FILL_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + layout.addView(valueText, params); + + seekBar = new SeekBar(context); + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int value, boolean b) { + String t = String.valueOf(value); + valueText.setText(suffix == null ? t : t.concat(" " + suffix)); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + }); + + layout.addView(seekBar, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); + + if (shouldPersist()) { + currentValue = getPersistedInt(defaultValue); + } + + seekBar.setMax(maxValue); + seekBar.setProgress(currentValue); + + return layout; + } + + @Override + protected void onBindDialogView(View v) { + super.onBindDialogView(v); + seekBar.setMax(maxValue); + seekBar.setProgress(currentValue); + } + + @Override + protected void onSetInitialValue(boolean restore, Object defaultValue) + { + super.onSetInitialValue(restore, defaultValue); + if (restore) { + currentValue = shouldPersist() ? getPersistedInt(this.defaultValue) : 0; + } + else { + currentValue = (Integer) defaultValue; + } + } + + public void setMax(int max) { + this.maxValue = max; + } + public int getMax() { + return this.maxValue; + } + + public void setProgress(int progress) { + this.currentValue = progress; + if (seekBar != null) { + seekBar.setProgress(progress); + } + } + public int getProgress() { + return currentValue; + } + + @Override + public void showDialog(Bundle state) { + super.showDialog(state); + + Button positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); + positiveButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (shouldPersist()) { + currentValue = seekBar.getProgress(); + persistInt(seekBar.getProgress()); + callChangeListener(Integer.valueOf(seekBar.getProgress())); + } + + ((AlertDialog) getDialog()).dismiss(); + } + }); + } +} diff --git a/app/src/main/java/com/limelight/StreamSettings.java b/app/src/main/java/com/limelight/preferences/StreamSettings.java similarity index 92% rename from app/src/main/java/com/limelight/StreamSettings.java rename to app/src/main/java/com/limelight/preferences/StreamSettings.java index 963a513c..e8198aa6 100644 --- a/app/src/main/java/com/limelight/StreamSettings.java +++ b/app/src/main/java/com/limelight/preferences/StreamSettings.java @@ -1,9 +1,11 @@ -package com.limelight; +package com.limelight.preferences; import android.os.Bundle; import android.app.Activity; import android.preference.PreferenceFragment; +import com.limelight.R; + public class StreamSettings extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/res/layout/activity_advanced_settings.xml b/app/src/main/res/layout/activity_advanced_settings.xml deleted file mode 100644 index 7c8eccaa..00000000 --- a/app/src/main/res/layout/activity_advanced_settings.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3685c47d..29088e6a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,7 +16,12 @@ Basic Settings Select resolution and FPS target Setting values too high for your device may cause lag or crashing + Select target video bitrate + Lower bitrate to reduce stuttering. Raise bitrate to increase image quality. + Mbps Stretch video to full-screen + Disable warning messages + Disable on-screen connection warning messages while streaming Host Settings Optimize game settings @@ -26,6 +31,4 @@ Advanced Settings Change decoder - Disable warning messages - Disable on-screen connection warning messages while streaming diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index acb04af6..a141dd05 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -9,10 +9,23 @@ android:entries="@array/resolution_names" android:entryValues="@array/resolution_values" android:defaultValue="720p60" /> + + - \ No newline at end of file