Skip to content

Commit 082ede7

Browse files
committed
✨ Refactor onboarding fragments to use instances instead of class references and improve permission handling
1 parent 15ba6ed commit 082ede7

File tree

7 files changed

+230
-206
lines changed

7 files changed

+230
-206
lines changed

app/src/main/java/com/erikraft/drop/OnboardingActivity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class OnboardingActivity extends AppCompatActivity {
1616
OnboardingViewModel viewModel;
1717

1818
public OnboardingActivity() {
19-
super(R.layout.activity_onboarding);
19+
super();
2020
}
2121

2222
public static void launchOnboarding(final Activity context) {
@@ -33,6 +33,7 @@ public static Intent getServerSelectionIntent(final Activity context) {
3333
@Override
3434
protected void onCreate(final Bundle savedInstanceState) {
3535
super.onCreate(savedInstanceState);
36+
setContentView(R.layout.activity_onboarding);
3637

3738
viewModel = new ViewModelProvider(this).get(OnboardingViewModel.class);
3839
viewModel.setOnlyServerSelection(getIntent().getBooleanExtra(EXTRA_ONLY_SERVER_SELECTION, false));
@@ -50,9 +51,9 @@ protected void onCreate(final Bundle savedInstanceState) {
5051

5152
if (savedInstanceState == null) {
5253
if (viewModel.isOnlyServerSelection()) {
53-
viewModel.launchFragment(OnboardingFragment2.class);
54+
viewModel.launchFragment(new OnboardingFragment2());
5455
} else {
55-
viewModel.launchFragment(OnboardingFragment1.class);
56+
viewModel.launchFragment(new OnboardingFragment1());
5657
}
5758
}
5859

app/src/main/java/com/erikraft/drop/OnboardingFragment1.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public void onViewCreated(final @NonNull View view, final Bundle savedInstanceSt
3535
viewModel.url("https://pairdrop.net");
3636
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q)
3737
&& (ContextCompat.checkSelfPermission(requireContext(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
38-
viewModel.launchFragment(OnboardingFragmentPermission.class);
38+
viewModel.launchFragment(new OnboardingFragmentPermission());
3939
} else {
40-
viewModel.launchFragment(OnboardingFragment3.class);
40+
viewModel.launchFragment(new OnboardingFragment3());
4141
}
4242
});
4343
binding.continueButton.requestFocus();

app/src/main/java/com/erikraft/drop/OnboardingFragment2.java

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.HashSet;
2626
import java.util.List;
2727
import java.util.Set;
28+
import java.util.Objects;
2829

2930
public class OnboardingFragment2 extends Fragment {
3031

@@ -78,26 +79,22 @@ public ServerItemViewHolder onCreateViewHolder(final @NonNull ViewGroup parent,
7879

7980
final ServerItemViewHolder holder = new ServerItemViewHolder(view);
8081

81-
holder.itemView.setOnClickListener(v -> {
82-
tempUrl.setValue(holder.urlTextView.getText().toString());
83-
});
82+
holder.itemView.setOnClickListener(v -> tempUrl.setValue(holder.urlTextView.getText().toString()));
8483

8584
holder.itemView.setOnLongClickListener(v -> {
8685
removeServer(holder.urlTextView.getText().toString());
8786
return true;
8887
});
8988

90-
tempUrl.observe(requireActivity(), url -> {
91-
((MaterialCardView) holder.itemView).setChecked(holder.urlTextView.getText().toString().equals(url));
92-
});
89+
tempUrl.observe(requireActivity(), url -> ((MaterialCardView) holder.itemView).setChecked(holder.urlTextView.getText().toString().equals(url)));
9390

9491
return holder;
9592
}
9693

9794
@Override
9895
public void onBindViewHolder(final @NonNull ServerItemViewHolder holder, final int position) {
9996
holder.bind(items.get(position));
100-
((MaterialCardView) holder.itemView).setChecked(holder.urlTextView.getText().toString().equals(tempUrl.getValue()));
97+
((MaterialCardView) holder.itemView).setChecked(Objects.equals(holder.urlTextView.getText().toString(), tempUrl.getValue()));
10198
}
10299

103100
@Override
@@ -124,7 +121,8 @@ public void onViewCreated(final @NonNull View view, final Bundle savedInstanceSt
124121
pref = PreferenceManager.getDefaultSharedPreferences(requireContext());
125122
tempUrl.setValue(pref.getString(getString(R.string.pref_baseurl), "https://drop.erikraft.com/"));
126123

127-
if (tempUrl.getValue().equals("https://snapdrop.net") || tempUrl.getValue().equals("https://pairdrop.net")) {
124+
final String currentTempUrl = tempUrl.getValue();
125+
if (Objects.equals(currentTempUrl, "https://snapdrop.net") || Objects.equals(currentTempUrl, "https://pairdrop.net")) {
128126
tempUrl.setValue("https://drop.erikraft.com/");
129127

130128
binding.scrollview.setVisibility(View.INVISIBLE);
@@ -143,45 +141,51 @@ public void onViewCreated(final @NonNull View view, final Bundle savedInstanceSt
143141

144142
reloadServerList();
145143

146-
binding.add.setOnClickListener(v -> ViewUtils.showEditTextWithResetPossibility(this, "Custom URL", null, null, Link.bind("https://github.com/RobinLinus/snapdrop/blob/master/docs/faq.md#inofficial-instances", R.string.baseurl_unofficial_instances), url -> {
147-
if (url == null) {
148-
return;
149-
}
150-
151-
if (url.startsWith("!!")) { // hidden feature to force a different url
152-
newServer(url.substring("!!".length()));
153-
} else if (url.startsWith("http")) {
154-
NetworkUtils.checkInstance(this, url, result -> {
155-
if (result) {
156-
newServer(url);
144+
binding.add.setOnClickListener(v -> {
145+
ViewUtils.showEditTextWithResetPossibility(OnboardingFragment2.this,
146+
"Custom URL",
147+
null,
148+
null,
149+
Link.bind("https://github.com/RobinLinus/snapdrop/blob/master/docs/faq.md#inofficial-instances", R.string.baseurl_unofficial_instances),
150+
url -> {
151+
if (url == null) {
152+
return;
153+
}
154+
155+
if (url.startsWith("!!")) { // hidden feature to force a different url
156+
newServer(url.substring("!!".length()));
157+
} else if (url.startsWith("http")) {
158+
NetworkUtils.checkInstance(OnboardingFragment2.this, url, result -> {
159+
if (Boolean.TRUE.equals(result)) {
160+
newServer(url);
161+
}
162+
});
163+
} else {
164+
// do some magic in case user forgot to specify the protocol
165+
String mightBeHttpsUrl = "https://" + url;
166+
NetworkUtils.checkInstance(OnboardingFragment2.this, mightBeHttpsUrl, resultHttps -> {
167+
if (Boolean.TRUE.equals(resultHttps)) {
168+
newServer(mightBeHttpsUrl);
169+
} else {
170+
String mightBeHttpUrl = "http://" + url;
171+
NetworkUtils.checkInstance(OnboardingFragment2.this, mightBeHttpUrl, resultHttp -> {
172+
if (Boolean.TRUE.equals(resultHttp)) {
173+
newServer(mightBeHttpUrl);
174+
}
175+
});
176+
}
177+
});
178+
}
157179
}
158-
});
159-
} else {
160-
161-
// do some magic in case user forgot to specify the protocol
162-
163-
String mightBeHttpsUrl = "https://" + url;
164-
NetworkUtils.checkInstance(this, mightBeHttpsUrl, resultHttps -> {
165-
if (resultHttps) {
166-
newServer(mightBeHttpsUrl);
167-
} else {
168-
String mightBeHttpUrl = "http://" + url;
169-
NetworkUtils.checkInstance(this, mightBeHttpUrl, resultHttp -> {
170-
if (resultHttp) {
171-
newServer(mightBeHttpUrl);
172-
}
173-
});
174-
}
175-
});
176-
}
177-
}));
180+
);
181+
});
178182

179183
binding.continueButton.setOnClickListener(v -> {
180184
viewModel.url(tempUrl.getValue());
181185
if (viewModel.isOnlyServerSelection()) {
182186
requireActivity().finish();
183187
} else {
184-
viewModel.launchFragment(OnboardingFragment3.class);
188+
viewModel.launchFragment(new OnboardingFragment3());
185189
}
186190
});
187191
binding.continueButton.requestFocus();
@@ -191,8 +195,8 @@ private void reloadServerList() {
191195
final Set<String> serverUrls = pref.getStringSet(getString(R.string.pref_custom_servers), new HashSet<>());
192196

193197
final List<ServerItem> servers = new ArrayList<>();
194-
servers.add(new ServerItem("https://drop.erikraft.com/", getString(R.string.onboarding_server_pairdrop_summary), null));
195-
servers.add(new ServerItem("https://pairdrop.net", getString(R.string.onboarding_server_pairdrop_summary), null));
198+
servers.add(new ServerItem("https://drop.erikraft.com/",getString(R.string.onboarding_server_pairdrop_summary), null));
199+
servers.add(new ServerItem("https://pairdrop.net", getString(R.string.onboarding_server_snapdrop_summary), null));
196200

197201
for (String url : serverUrls) {
198202
servers.add(new ServerItem(url, null, null));

app/src/main/java/com/erikraft/drop/OnboardingFragmentPermission.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class OnboardingFragmentPermission extends Fragment {
2020
OnboardingViewModel viewModel;
2121
private final ActivityResultLauncher<String> permissionResult = registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
2222
if (granted) {
23-
viewModel.launchFragment(OnboardingFragment2.class);
23+
viewModel.launchFragment(new OnboardingFragment2());
2424
}
2525
});
2626

@@ -38,7 +38,7 @@ public void onViewCreated(final @NonNull View view, final Bundle savedInstanceSt
3838
&& (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
3939
permissionResult.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
4040
} else {
41-
viewModel.launchFragment(OnboardingFragment2.class);
41+
viewModel.launchFragment(new OnboardingFragment2());
4242
}
4343
});
4444
binding.continueButton.requestFocus();

app/src/main/java/com/erikraft/drop/OnboardingViewModel.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import androidx.lifecycle.ViewModel;
77

88
public class OnboardingViewModel extends ViewModel {
9-
private final MutableLiveData<Class<? extends Fragment>> fragment = new MutableLiveData<>();
9+
private final MutableLiveData<Fragment> fragment = new MutableLiveData<>();
1010
private final MutableLiveData<String> url = new MutableLiveData<>();
1111
private boolean onlyServerSelection;
1212

13-
public void launchFragment(final Class<? extends Fragment> item) {
13+
public void launchFragment(final Fragment item) {
1414
fragment.setValue(item);
1515
}
1616

17-
public LiveData<Class<? extends Fragment>> getFragment() {
17+
public LiveData<Fragment> getFragment() {
1818
return fragment;
1919
}
2020

app/src/main/java/com/erikraft/drop/PrefixEditText.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
import android.graphics.Canvas;
55
import android.util.AttributeSet;
66

7-
import com.google.android.material.textfield.TextInputEditText;
7+
import androidx.appcompat.widget.AppCompatEditText;
88

99

1010
/**
1111
* Custom view for adding a prefix to EditText
12-
* code by: https://medium.com/@ali.muzaffar/adding-a-prefix-to-an-edittext-2a17a62c77e1
12+
* Based on code from Ali Muzaffar (Medium article about adding a prefix to EditText)
1313
**/
14-
public class PrefixEditText extends TextInputEditText {
14+
public class PrefixEditText extends AppCompatEditText {
1515
private float mOriginalLeftPadding = -1;
1616

1717
public PrefixEditText(final Context context) {

0 commit comments

Comments
 (0)