diff --git a/src/AndroidApp/.idea/codeStyles/Project.xml b/src/AndroidApp/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..0d15693 --- /dev/null +++ b/src/AndroidApp/.idea/codeStyles/Project.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/src/AndroidApp/.idea/gradle.xml b/src/AndroidApp/.idea/gradle.xml new file mode 100644 index 0000000..6d40e7b --- /dev/null +++ b/src/AndroidApp/.idea/gradle.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/src/AndroidApp/.idea/vcs.xml b/src/AndroidApp/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/src/AndroidApp/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser b/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser index 66f1012..0662085 100644 Binary files a/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser and b/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser differ diff --git a/src/AndroidApp/Tbot/.idea/compiler.xml b/src/AndroidApp/Tbot/.idea/compiler.xml index 96cc43e..61a9130 100644 --- a/src/AndroidApp/Tbot/.idea/compiler.xml +++ b/src/AndroidApp/Tbot/.idea/compiler.xml @@ -1,22 +1,6 @@ - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/AndroidApp/Tbot/.idea/gradle.xml b/src/AndroidApp/Tbot/.idea/gradle.xml index 94d4d6d..28bd251 100644 --- a/src/AndroidApp/Tbot/.idea/gradle.xml +++ b/src/AndroidApp/Tbot/.idea/gradle.xml @@ -15,6 +15,7 @@ diff --git a/src/AndroidApp/Tbot/.idea/misc.xml b/src/AndroidApp/Tbot/.idea/misc.xml index 39e4b9e..b39703e 100644 --- a/src/AndroidApp/Tbot/.idea/misc.xml +++ b/src/AndroidApp/Tbot/.idea/misc.xml @@ -1,14 +1,11 @@ - - - - + diff --git a/src/AndroidApp/Tbot/.idea/modules.xml b/src/AndroidApp/Tbot/.idea/modules.xml index 585799b..90b6b61 100644 --- a/src/AndroidApp/Tbot/.idea/modules.xml +++ b/src/AndroidApp/Tbot/.idea/modules.xml @@ -2,11 +2,8 @@ - - - - - + + \ No newline at end of file diff --git a/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Login.java b/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Login.java index bc1b73f..519175f 100644 --- a/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Login.java +++ b/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Login.java @@ -52,8 +52,8 @@ public class Login extends Activity { //登录界面活动 mRememberCheck = (CheckBox) findViewById(R.id.Login_Remember); login_sp = getSharedPreferences("userInfo", 0); - //String name=login_sp.getString("USER_NAME", ""); - String pwd = getEncryptedPass();//write by ljw + String name=login_sp.getString("USER_NAME", ""); + //String pwd = getEncryptedPass();//write by ljw String pwd =login_sp.getString("PASSWORD", ""); boolean choseRemember =login_sp.getBoolean("mRememberCheck", false); diff --git a/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Settings.java b/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Settings.java index a525905..05706ab 100644 --- a/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Settings.java +++ b/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/Settings.java @@ -156,20 +156,21 @@ public class Settings extends AppCompatPreferenceActivity { */ protected boolean isValidFragment(String fragmentName) { //write by ljw - if (PreferenceFragment.equals(fragmentName.class().getName())) + /*if (PreferenceFragment.equals(fragmentName.class().getName())) return true; if (GeneralPreferenceFragment.equals(fragmentName.class().getName())) return true; if (DataSyncPreferenceFragment.equals(fragmentName.class().getName())) return true; if (NotificationPreferenceFragment.equals(fragmentName.class().getName())) - return true; + return true;*/ /* return PreferenceFragment.class.getName().equals(fragmentName) || GeneralPreferenceFragment.class.getName().equals(fragmentName) || DataSyncPreferenceFragment.class.getName().equals(fragmentName) || NotificationPreferenceFragment.class.getName().equals(fragmentName); */ + return true; } /* if (PreferenceFragment.equals(fragmentName.class().getName())) return true; diff --git a/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/UserDataManager.java b/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/UserDataManager.java index 535a8f5..d3e17fa 100644 --- a/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/UserDataManager.java +++ b/src/AndroidApp/Tbot/app/src/main/java/me/wshuo/tbot/UserDataManager.java @@ -15,8 +15,8 @@ public class UserDataManager { //用户数据管理类 private static final String TABLE_NAME = "users"; public static final String ID = "_id"; public static final String USER_NAME = "user_name"; - //public static final String USER_PWD = "user_pwd"; - public static final String USER_PWD = getEncryptedPass();//write by ljw + public static final String USER_PWD = "user_pwd"; +// public static final String USER_PWD = getEncryptedPass();//write by ljw // public static final String SILENT = "silent"; // public static final String VIBRATE = "vibrate"; private static final int DB_VERSION = 2; diff --git a/src/Tbot/.gitignore b/src/Tbot/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/src/Tbot/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/src/Tbot/.idea/codeStyles/Project.xml b/src/Tbot/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..0d15693 --- /dev/null +++ b/src/Tbot/.idea/codeStyles/Project.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/src/Tbot/.idea/gradle.xml b/src/Tbot/.idea/gradle.xml new file mode 100644 index 0000000..ac6b0ae --- /dev/null +++ b/src/Tbot/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/src/Tbot/.idea/jarRepositories.xml b/src/Tbot/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/src/Tbot/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/.idea/misc.xml b/src/Tbot/.idea/misc.xml new file mode 100644 index 0000000..37a7509 --- /dev/null +++ b/src/Tbot/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/.idea/runConfigurations.xml b/src/Tbot/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/src/Tbot/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/src/Tbot/.idea/vcs.xml b/src/Tbot/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/src/Tbot/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/.gitignore b/src/Tbot/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/src/Tbot/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/src/Tbot/app/build.gradle b/src/Tbot/app/build.gradle new file mode 100644 index 0000000..d1e4866 --- /dev/null +++ b/src/Tbot/app/build.gradle @@ -0,0 +1,38 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "com.example.tbot" + minSdkVersion 23 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.navigation:navigation-fragment:2.3.1' + implementation 'androidx.navigation:navigation-ui:2.3.1' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + +} \ No newline at end of file diff --git a/src/Tbot/app/proguard-rules.pro b/src/Tbot/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/src/Tbot/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/src/Tbot/app/src/androidTest/java/com/example/tbot/ExampleInstrumentedTest.java b/src/Tbot/app/src/androidTest/java/com/example/tbot/ExampleInstrumentedTest.java new file mode 100644 index 0000000..4d9b5b0 --- /dev/null +++ b/src/Tbot/app/src/androidTest/java/com/example/tbot/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.tbot; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.tbot", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/AndroidManifest.xml b/src/Tbot/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a464fe7 --- /dev/null +++ b/src/Tbot/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/MainActivity.java b/src/Tbot/app/src/main/java/com/example/tbot/MainActivity.java new file mode 100644 index 0000000..c8c77c1 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/MainActivity.java @@ -0,0 +1,63 @@ +package com.example.tbot; + +import android.os.Bundle; +import android.view.View; +import android.view.Menu; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.Snackbar; +import com.google.android.material.navigation.NavigationView; + +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.AppBarConfiguration; +import androidx.navigation.ui.NavigationUI; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +public class MainActivity extends AppCompatActivity { + + private AppBarConfiguration mAppBarConfiguration; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + FloatingActionButton fab = findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } + }); + DrawerLayout drawer = findViewById(R.id.drawer_layout); + NavigationView navigationView = findViewById(R.id.nav_view); + // Passing each menu ID as a set of Ids because each + // menu should be considered as top level destinations. + mAppBarConfiguration = new AppBarConfiguration.Builder( + R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow) + .setDrawerLayout(drawer) + .build(); + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); + NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); + NavigationUI.setupWithNavController(navigationView, navController); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onSupportNavigateUp() { + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); + return NavigationUI.navigateUp(navController, mAppBarConfiguration) + || super.onSupportNavigateUp(); + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/Settings.java b/src/Tbot/app/src/main/java/com/example/tbot/Settings.java new file mode 100644 index 0000000..fbb3c20 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/Settings.java @@ -0,0 +1,284 @@ +package com.example.tbot; + + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; +import android.preference.RingtonePreference; +import android.support.v7.app.ActionBar; +import android.text.TextUtils; +import android.view.MenuItem; + +import java.util.List; + +/** + * A {@link PreferenceActivity} that presents a set of application settings. On + * handset devices, settings are presented as a single list. On tablets, + * settings are split by category, with category headers shown to the left of + * the list of settings. + *

+ * See + * Android Design: Settings for design guidelines and the Settings + * API Guide for more information on developing a Settings UI. + */ +public class Settings extends AppCompatPreferenceActivity { + /** + * A preference value change listener that updates the preference's summary + * to reflect its new value. + */ + private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + String stringValue = value.toString(); + + if (preference instanceof ListPreference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + ListPreference listPreference = (ListPreference) preference; + int index = listPreference.findIndexOfValue(stringValue); + + // Set the summary to reflect the new value. + preference.setSummary( + index >= 0 + ? listPreference.getEntries()[index] + : null); + + } else if (preference instanceof RingtonePreference) { + // For ringtone preferences, look up the correct display value + // using RingtoneManager. + if (TextUtils.isEmpty(stringValue)) { + // Empty values correspond to 'silent' (no ringtone). + preference.setSummary(R.string.pref_ringtone_silent); + + } else { + Ringtone ringtone = RingtoneManager.getRingtone( + preference.getContext(), Uri.parse(stringValue)); + + if (ringtone == null) { + // Clear the summary if there was a lookup error. + preference.setSummary(null); + } else { + // Set the summary to reflect the new ringtone display + // name. + String name = ringtone.getTitle(preference.getContext()); + preference.setSummary(name); + } + } + + } else { + // For all other preferences, set the summary to the value's + // simple string representation. + preference.setSummary(stringValue); + } + return true; + } + }; + + /** + * Helper method to determine if the device has an extra-large screen. For + * example, 10" tablets are extra-large. + */ + private static boolean isXLargeTablet(Context context) { + return (context.getResources().getConfiguration().screenLayout + & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; + } + + /** + * Binds a preference's summary to its value. More specifically, when the + * preference's value is changed, its summary (line of text below the + * preference title) is updated to reflect the value. The summary is also + * immediately updated upon calling this method. The exact display format is + * dependent on the type of preference. + * + * @see #sBindPreferenceSummaryToValueListener + */ + private static void bindPreferenceSummaryToValue(Preference preference) { + // Set the listener to watch for value changes. + preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); + + // Trigger the listener immediately with the preference's + // current value. + sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, + PreferenceManager + .getDefaultSharedPreferences(preference.getContext()) + .getString(preference.getKey(), "")); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setupActionBar(); + } + + /** + * Set up the {@link android.app.ActionBar}, if the API is available. + */ + private void setupActionBar() { + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + // Show the Up button in the action bar. + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onIsMultiPane() { + return isXLargeTablet(this); + } + + /** + * {@inheritDoc} + */ + @Override + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public void onBuildHeaders(List target) { + loadHeadersFromResource(R.xml.pref_headers, target); + } + + /** + * This method stops fragment injection in malicious applications. + * Make sure to deny any unknown fragments here. + */ + protected boolean isValidFragment(String fragmentName) { + //write by ljw + /*if (PreferenceFragment.equals(fragmentName.class().getName())) + return true; + if (GeneralPreferenceFragment.equals(fragmentName.class().getName())) + return true; + if (DataSyncPreferenceFragment.equals(fragmentName.class().getName())) + return true; + if (NotificationPreferenceFragment.equals(fragmentName.class().getName())) + return true;*/ + /* + return PreferenceFragment.class.getName().equals(fragmentName) + || GeneralPreferenceFragment.class.getName().equals(fragmentName) + || DataSyncPreferenceFragment.class.getName().equals(fragmentName) + || NotificationPreferenceFragment.class.getName().equals(fragmentName); + */ + return true; + } +/* if (PreferenceFragment.equals(fragmentName.class().getName())) + return true; + if (GeneralPreferenceFragment.equals(fragmentName.class().getName())) + return true; + if (DataSyncPreferenceFragment.equals(fragmentName.class().getName())) + return true; + if (NotificationPreferenceFragment.equals(fragmentName.class().getName())) + return true; + write by ljw +*/ + /** + * This fragment shows general preferences only. It is used when the + * activity is showing a two-pane settings UI. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static class GeneralPreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.pref_general); + setHasOptionsMenu(true); + + // Bind the summaries of EditText/List/Dialog/Ringtone preferences + // to their values. When their values change, their summaries are + // updated to reflect the new value, per the Android Design + // guidelines. + bindPreferenceSummaryToValue(findPreference("example_text")); + bindPreferenceSummaryToValue(findPreference("example_list")); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + startActivity(new Intent(getActivity(), Settings.class)); + return true; + } + return super.onOptionsItemSelected(item); + } + } + + /** + * This fragment shows notification preferences only. It is used when the + * activity is showing a two-pane settings UI. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static class NotificationPreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.pref_notification); + setHasOptionsMenu(true); + + // Bind the summaries of EditText/List/Dialog/Ringtone preferences + // to their values. When their values change, their summaries are + // updated to reflect the new value, per the Android Design + // guidelines. + bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone")); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + startActivity(new Intent(getActivity(), Settings.class)); + return true; + } + return super.onOptionsItemSelected(item); + } + } + + /** + * This fragment shows data and sync preferences only. It is used when the + * activity is showing a two-pane settings UI. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static class DataSyncPreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.pref_data_sync); + setHasOptionsMenu(true); + + // Bind the summaries of EditText/List/Dialog/Ringtone preferences + // to their values. When their values change, their summaries are + // updated to reflect the new value, per the Android Design + // guidelines. + bindPreferenceSummaryToValue(findPreference("sync_frequency")); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + startActivity(new Intent(getActivity(), Settings.class)); + return true; + } + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onBackPressed() {//当点击后退键时执行该函数 + + super.onBackPressed(); + Intent intent_Setting_to_Menu = new Intent(Settings.this, Menu.class); + startActivity(intent_Setting_to_Menu); + finish(); + } +} diff --git a/src/Tbot/app/src/main/java/com/example/tbot/ui/gallery/GalleryFragment.java b/src/Tbot/app/src/main/java/com/example/tbot/ui/gallery/GalleryFragment.java new file mode 100644 index 0000000..3694b42 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/ui/gallery/GalleryFragment.java @@ -0,0 +1,35 @@ +package com.example.tbot.ui.gallery; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.example.tbot.R; + +public class GalleryFragment extends Fragment { + + private GalleryViewModel galleryViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + galleryViewModel = + ViewModelProviders.of(this).get(GalleryViewModel.class); + View root = inflater.inflate(R.layout.fragment_gallery, container, false); + final TextView textView = root.findViewById(R.id.text_gallery); + galleryViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/ui/gallery/GalleryViewModel.java b/src/Tbot/app/src/main/java/com/example/tbot/ui/gallery/GalleryViewModel.java new file mode 100644 index 0000000..402d614 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/ui/gallery/GalleryViewModel.java @@ -0,0 +1,19 @@ +package com.example.tbot.ui.gallery; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class GalleryViewModel extends ViewModel { + + private MutableLiveData mText; + + public GalleryViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is gallery fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/ui/home/HomeFragment.java b/src/Tbot/app/src/main/java/com/example/tbot/ui/home/HomeFragment.java new file mode 100644 index 0000000..ec776d5 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/ui/home/HomeFragment.java @@ -0,0 +1,35 @@ +package com.example.tbot.ui.home; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.example.tbot.R; + +public class HomeFragment extends Fragment { + + private HomeViewModel homeViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + homeViewModel = + ViewModelProviders.of(this).get(HomeViewModel.class); + View root = inflater.inflate(R.layout.fragment_home, container, false); + final TextView textView = root.findViewById(R.id.text_home); + homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/ui/home/HomeViewModel.java b/src/Tbot/app/src/main/java/com/example/tbot/ui/home/HomeViewModel.java new file mode 100644 index 0000000..598a738 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/ui/home/HomeViewModel.java @@ -0,0 +1,19 @@ +package com.example.tbot.ui.home; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + private MutableLiveData mText; + + public HomeViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is home fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/ui/slideshow/SlideshowFragment.java b/src/Tbot/app/src/main/java/com/example/tbot/ui/slideshow/SlideshowFragment.java new file mode 100644 index 0000000..3bc7c8d --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/ui/slideshow/SlideshowFragment.java @@ -0,0 +1,35 @@ +package com.example.tbot.ui.slideshow; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.example.tbot.R; + +public class SlideshowFragment extends Fragment { + + private SlideshowViewModel slideshowViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + slideshowViewModel = + ViewModelProviders.of(this).get(SlideshowViewModel.class); + View root = inflater.inflate(R.layout.fragment_slideshow, container, false); + final TextView textView = root.findViewById(R.id.text_slideshow); + slideshowViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/java/com/example/tbot/ui/slideshow/SlideshowViewModel.java b/src/Tbot/app/src/main/java/com/example/tbot/ui/slideshow/SlideshowViewModel.java new file mode 100644 index 0000000..1392672 --- /dev/null +++ b/src/Tbot/app/src/main/java/com/example/tbot/ui/slideshow/SlideshowViewModel.java @@ -0,0 +1,19 @@ +package com.example.tbot.ui.slideshow; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class SlideshowViewModel extends ViewModel { + + private MutableLiveData mText; + + public SlideshowViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is slideshow fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/drawable-v21/ic_menu_camera.xml b/src/Tbot/app/src/main/res/drawable-v21/ic_menu_camera.xml new file mode 100644 index 0000000..634fe92 --- /dev/null +++ b/src/Tbot/app/src/main/res/drawable-v21/ic_menu_camera.xml @@ -0,0 +1,12 @@ + + + + diff --git a/src/Tbot/app/src/main/res/drawable-v21/ic_menu_gallery.xml b/src/Tbot/app/src/main/res/drawable-v21/ic_menu_gallery.xml new file mode 100644 index 0000000..03c7709 --- /dev/null +++ b/src/Tbot/app/src/main/res/drawable-v21/ic_menu_gallery.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/Tbot/app/src/main/res/drawable-v21/ic_menu_slideshow.xml b/src/Tbot/app/src/main/res/drawable-v21/ic_menu_slideshow.xml new file mode 100644 index 0000000..5e9e163 --- /dev/null +++ b/src/Tbot/app/src/main/res/drawable-v21/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/Tbot/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/Tbot/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/src/Tbot/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/drawable/ic_launcher_background.xml b/src/Tbot/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/src/Tbot/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Tbot/app/src/main/res/drawable/side_nav_bar.xml b/src/Tbot/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..6d81870 --- /dev/null +++ b/src/Tbot/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/activity_main.xml b/src/Tbot/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..01e2945 --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/app_bar_main.xml b/src/Tbot/app/src/main/res/layout/app_bar_main.xml new file mode 100644 index 0000000..e9fa907 --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/app_bar_main.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/content_main.xml b/src/Tbot/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..04b67fd --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/content_main.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/fragment_gallery.xml b/src/Tbot/app/src/main/res/layout/fragment_gallery.xml new file mode 100644 index 0000000..643fe25 --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/fragment_gallery.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/fragment_home.xml b/src/Tbot/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..f3d9b08 --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/fragment_slideshow.xml b/src/Tbot/app/src/main/res/layout/fragment_slideshow.xml new file mode 100644 index 0000000..2141a33 --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/fragment_slideshow.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/layout/nav_header_main.xml b/src/Tbot/app/src/main/res/layout/nav_header_main.xml new file mode 100644 index 0000000..c145545 --- /dev/null +++ b/src/Tbot/app/src/main/res/layout/nav_header_main.xml @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/menu/activity_main_drawer.xml b/src/Tbot/app/src/main/res/menu/activity_main_drawer.xml new file mode 100644 index 0000000..d7f2df2 --- /dev/null +++ b/src/Tbot/app/src/main/res/menu/activity_main_drawer.xml @@ -0,0 +1,20 @@ + +

+ + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/menu/main.xml b/src/Tbot/app/src/main/res/menu/main.xml new file mode 100644 index 0000000..412d5f8 --- /dev/null +++ b/src/Tbot/app/src/main/res/menu/main.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/src/Tbot/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/src/Tbot/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src/Tbot/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/src/Tbot/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src/Tbot/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/src/Tbot/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src/Tbot/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/src/Tbot/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src/Tbot/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/src/Tbot/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src/Tbot/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/src/Tbot/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/Tbot/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/Tbot/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/src/Tbot/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/src/Tbot/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/src/Tbot/app/src/main/res/navigation/mobile_navigation.xml b/src/Tbot/app/src/main/res/navigation/mobile_navigation.xml new file mode 100644 index 0000000..ba81228 --- /dev/null +++ b/src/Tbot/app/src/main/res/navigation/mobile_navigation.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/values/colors.xml b/src/Tbot/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..4faecfa --- /dev/null +++ b/src/Tbot/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #6200EE + #3700B3 + #03DAC5 + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/values/dimens.xml b/src/Tbot/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..4ab4520 --- /dev/null +++ b/src/Tbot/app/src/main/res/values/dimens.xml @@ -0,0 +1,8 @@ + + + 16dp + 16dp + 8dp + 176dp + 16dp + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/values/drawables.xml b/src/Tbot/app/src/main/res/values/drawables.xml new file mode 100644 index 0000000..c4e4cea --- /dev/null +++ b/src/Tbot/app/src/main/res/values/drawables.xml @@ -0,0 +1,8 @@ + + @android:drawable/ic_menu_camera + @android:drawable/ic_menu_gallery + @android:drawable/ic_menu_slideshow + @android:drawable/ic_menu_manage + @android:drawable/ic_menu_share + @android:drawable/ic_menu_send + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/values/strings.xml b/src/Tbot/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..4b7d581 --- /dev/null +++ b/src/Tbot/app/src/main/res/values/strings.xml @@ -0,0 +1,13 @@ + + Tbot + Open navigation drawer + Close navigation drawer + Android Studio + android.studio@android.com + Navigation header + Settings + + Home + Gallery + Slideshow + \ No newline at end of file diff --git a/src/Tbot/app/src/main/res/values/styles.xml b/src/Tbot/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..21d9ced --- /dev/null +++ b/src/Tbot/app/src/main/res/values/styles.xml @@ -0,0 +1,19 @@ + + + + + + +