mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-11-22 14:47:29 +00:00
Merge pull request #955 from ammargitham/restart-on-login-logout
Completely restart app on login logout
This commit is contained in:
commit
8991f14f1b
@ -130,6 +130,9 @@
|
|||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
android:value=".activities.MainActivity" />
|
android:value=".activities.MainActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".utils.ProcessPhoenix"
|
||||||
|
android:theme="@style/Theme.AppCompat.Translucent" />
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
|
@ -12,7 +12,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -25,8 +24,10 @@ import awais.instagrabber.db.datasources.AccountDataSource;
|
|||||||
import awais.instagrabber.db.entities.Account;
|
import awais.instagrabber.db.entities.Account;
|
||||||
import awais.instagrabber.db.repositories.AccountRepository;
|
import awais.instagrabber.db.repositories.AccountRepository;
|
||||||
import awais.instagrabber.db.repositories.RepositoryCallback;
|
import awais.instagrabber.db.repositories.RepositoryCallback;
|
||||||
|
import awais.instagrabber.utils.AppExecutors;
|
||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
import awais.instagrabber.utils.CookieUtils;
|
import awais.instagrabber.utils.CookieUtils;
|
||||||
|
import awais.instagrabber.utils.ProcessPhoenix;
|
||||||
import awais.instagrabber.utils.TextUtils;
|
import awais.instagrabber.utils.TextUtils;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
|
||||||
@ -55,9 +56,14 @@ public class AccountSwitcherDialogFragment extends DialogFragment {
|
|||||||
}
|
}
|
||||||
CookieUtils.setupCookies(model.getCookie());
|
CookieUtils.setupCookies(model.getCookie());
|
||||||
settingsHelper.putString(Constants.COOKIE, model.getCookie());
|
settingsHelper.putString(Constants.COOKIE, model.getCookie());
|
||||||
final FragmentActivity activity = getActivity();
|
// final FragmentActivity activity = getActivity();
|
||||||
if (activity != null) activity.recreate();
|
// if (activity != null) activity.recreate();
|
||||||
dismiss();
|
// dismiss();
|
||||||
|
AppExecutors.getInstance().mainThread().execute(() -> {
|
||||||
|
final Context context = getContext();
|
||||||
|
if (context == null) return;
|
||||||
|
ProcessPhoenix.triggerRebirth(context);
|
||||||
|
}, 200);
|
||||||
};
|
};
|
||||||
|
|
||||||
private final AccountSwitcherAdapter.OnAccountLongClickListener accountLongClickListener = (model, isCurrent) -> {
|
private final AccountSwitcherAdapter.OnAccountLongClickListener accountLongClickListener = (model, isCurrent) -> {
|
||||||
|
@ -11,8 +11,6 @@ import android.widget.Toast;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.navigation.NavController;
|
import androidx.navigation.NavController;
|
||||||
import androidx.navigation.NavDirections;
|
import androidx.navigation.NavDirections;
|
||||||
@ -35,9 +33,11 @@ import awais.instagrabber.db.repositories.AccountRepository;
|
|||||||
import awais.instagrabber.db.repositories.RepositoryCallback;
|
import awais.instagrabber.db.repositories.RepositoryCallback;
|
||||||
import awais.instagrabber.dialogs.AccountSwitcherDialogFragment;
|
import awais.instagrabber.dialogs.AccountSwitcherDialogFragment;
|
||||||
import awais.instagrabber.repositories.responses.User;
|
import awais.instagrabber.repositories.responses.User;
|
||||||
|
import awais.instagrabber.utils.AppExecutors;
|
||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
import awais.instagrabber.utils.CookieUtils;
|
import awais.instagrabber.utils.CookieUtils;
|
||||||
import awais.instagrabber.utils.FlavorTown;
|
import awais.instagrabber.utils.FlavorTown;
|
||||||
|
import awais.instagrabber.utils.ProcessPhoenix;
|
||||||
import awais.instagrabber.utils.TextUtils;
|
import awais.instagrabber.utils.TextUtils;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
import awais.instagrabber.webservices.ServiceCallback;
|
import awais.instagrabber.webservices.ServiceCallback;
|
||||||
@ -71,11 +71,15 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
|
|||||||
accountCategory.setSummary(R.string.account_hint);
|
accountCategory.setSummary(R.string.account_hint);
|
||||||
accountCategory.addPreference(getAccountSwitcherPreference(cookie, context));
|
accountCategory.addPreference(getAccountSwitcherPreference(cookie, context));
|
||||||
accountCategory.addPreference(getPreference(R.string.logout, R.string.logout_summary, R.drawable.ic_logout_24, preference -> {
|
accountCategory.addPreference(getPreference(R.string.logout, R.string.logout_summary, R.drawable.ic_logout_24, preference -> {
|
||||||
if (getContext() == null) return false;
|
final Context context1 = getContext();
|
||||||
|
if (context1 == null) return false;
|
||||||
CookieUtils.setupCookies("LOGOUT");
|
CookieUtils.setupCookies("LOGOUT");
|
||||||
shouldRecreate();
|
// shouldRecreate();
|
||||||
Toast.makeText(context, R.string.logout_success, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context1, R.string.logout_success, Toast.LENGTH_SHORT).show();
|
||||||
settingsHelper.putString(Constants.COOKIE, "");
|
settingsHelper.putString(Constants.COOKIE, "");
|
||||||
|
AppExecutors.getInstance().mainThread().execute(() -> {
|
||||||
|
ProcessPhoenix.triggerRebirth(context1);
|
||||||
|
}, 200);
|
||||||
return true;
|
return true;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@ -103,9 +107,14 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
|
|||||||
CookieUtils.removeAllAccounts(context, new RepositoryCallback<Void>() {
|
CookieUtils.removeAllAccounts(context, new RepositoryCallback<Void>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(final Void result) {
|
public void onSuccess(final Void result) {
|
||||||
shouldRecreate();
|
// shouldRecreate();
|
||||||
Toast.makeText(context, R.string.logout_success, Toast.LENGTH_SHORT).show();
|
final Context context1 = getContext();
|
||||||
|
if (context1 == null) return;
|
||||||
|
Toast.makeText(context1, R.string.logout_success, Toast.LENGTH_SHORT).show();
|
||||||
settingsHelper.putString(Constants.COOKIE, "");
|
settingsHelper.putString(Constants.COOKIE, "");
|
||||||
|
AppExecutors.getInstance().mainThread().execute(() -> {
|
||||||
|
ProcessPhoenix.triggerRebirth(context1);
|
||||||
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -265,9 +274,14 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
|
|||||||
new RepositoryCallback<Account>() {
|
new RepositoryCallback<Account>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(final Account result) {
|
public void onSuccess(final Account result) {
|
||||||
final FragmentActivity activity = getActivity();
|
// final FragmentActivity activity = getActivity();
|
||||||
if (activity == null) return;
|
// if (activity == null) return;
|
||||||
activity.recreate();
|
// activity.recreate();
|
||||||
|
AppExecutors.getInstance().mainThread().execute(() -> {
|
||||||
|
final Context context = getContext();
|
||||||
|
if (context == null) return;
|
||||||
|
ProcessPhoenix.triggerRebirth(context);
|
||||||
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
111
app/src/main/java/awais/instagrabber/utils/ProcessPhoenix.java
Normal file
111
app/src/main/java/awais/instagrabber/utils/ProcessPhoenix.java
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jake Wharton
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package awais.instagrabber.utils;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Process;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
|
||||||
|
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process Phoenix facilitates restarting your application process. This should only be used for
|
||||||
|
* things like fundamental state changes in your debug builds (e.g., changing from staging to
|
||||||
|
* production).
|
||||||
|
* <p>
|
||||||
|
* Trigger process recreation by calling {@link #triggerRebirth} with a {@link Context} instance.
|
||||||
|
*/
|
||||||
|
public final class ProcessPhoenix extends Activity {
|
||||||
|
private static final String KEY_RESTART_INTENTS = "phoenix_restart_intents";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call to restart the application process using the {@linkplain Intent#CATEGORY_DEFAULT default}
|
||||||
|
* activity as an intent.
|
||||||
|
* <p>
|
||||||
|
* Behavior of the current process after invoking this method is undefined.
|
||||||
|
*/
|
||||||
|
public static void triggerRebirth(Context context) {
|
||||||
|
triggerRebirth(context, getRestartIntent(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call to restart the application process using the specified intents.
|
||||||
|
* <p>
|
||||||
|
* Behavior of the current process after invoking this method is undefined.
|
||||||
|
*/
|
||||||
|
public static void triggerRebirth(Context context, Intent... nextIntents) {
|
||||||
|
Intent intent = new Intent(context, ProcessPhoenix.class);
|
||||||
|
intent.addFlags(FLAG_ACTIVITY_NEW_TASK); // In case we are called with non-Activity context.
|
||||||
|
intent.putParcelableArrayListExtra(KEY_RESTART_INTENTS, new ArrayList<>(Arrays.asList(nextIntents)));
|
||||||
|
context.startActivity(intent);
|
||||||
|
if (context instanceof Activity) {
|
||||||
|
((Activity) context).finish();
|
||||||
|
}
|
||||||
|
Runtime.getRuntime().exit(0); // Kill kill kill!
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Intent getRestartIntent(Context context) {
|
||||||
|
String packageName = context.getPackageName();
|
||||||
|
Intent defaultIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
|
||||||
|
if (defaultIntent != null) {
|
||||||
|
defaultIntent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
|
return defaultIntent;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalStateException("Unable to determine default activity for "
|
||||||
|
+ packageName
|
||||||
|
+ ". Does an activity specify the DEFAULT category in its intent filter?");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
ArrayList<Intent> intents = getIntent().getParcelableArrayListExtra(KEY_RESTART_INTENTS);
|
||||||
|
startActivities(intents.toArray(new Intent[intents.size()]));
|
||||||
|
finish();
|
||||||
|
Runtime.getRuntime().exit(0); // Kill kill kill!
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the current process is a temporary Phoenix Process.
|
||||||
|
* This can be used to avoid initialisation of unused resources or to prevent running code that
|
||||||
|
* is not multi-process ready.
|
||||||
|
*
|
||||||
|
* @return true if the current process is a temporary Phoenix Process
|
||||||
|
*/
|
||||||
|
public static boolean isPhoenixProcess(Context context) {
|
||||||
|
int currentPid = Process.myPid();
|
||||||
|
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
|
List<ActivityManager.RunningAppProcessInfo> runningProcesses = manager.getRunningAppProcesses();
|
||||||
|
if (runningProcesses != null) {
|
||||||
|
for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
|
||||||
|
if (processInfo.pid == currentPid && processInfo.processName.endsWith(":phoenix")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user